python生成器代碼示例的簡單介紹

本文目錄一覽:

python 代碼生成器怎麼用

生成器是一個包含了特殊關鍵字yield的函數。當被調用的時候,生成器函數返回一個生成器。可以使用send,throw,close方法讓生成器和外界交互。

生成器也是迭代器,但是它不僅僅是迭代器,擁有next方法並且行為和迭代器完全相同。所以生成器也可以用於python的循環中,

生成器如何使用?

首先看一個例子:

複製代碼 代碼如下:

#!/usr/bin/python

# -*- coding: utf-8 -*-

def flatten(nested):

for sublist in nested:

for element in sublist:

yield element

nested = [[1,2],[3,4],[5,6]]

for num in flatten(nested):

print num,

結果為1,2,3,4,5,6

遞歸生成器:

複製代碼 代碼如下:

#!/usr/bin/python

# -*- coding: utf-8 -*-

def flatten(nested):

try:

for sublist in nested:

for element in flatten(sublist):

yield element

except TypeError:

yield nested

for num in flatten([[1,2,3],2,4,[5,[6],7]]):

print num

結果為:1 2 3 2 4 5 6 7

讓我們一起來看看生成器的本質

首先看下:

複製代碼 代碼如下:

#!/usr/bin/python

# -*- coding: utf-8 -*-

def simple_generator():

yield 1

print simple_generator

def repeater(value):

while True:

new = (yield value)

if new is not None: value = new

r = repeater(42)

print r.next()

print r.send(‘hello,world!’)

結果為:

複製代碼 代碼如下:

function simple_generator at 0x10c76f6e0

42

hello,world!

可以看出:

1)生成器就是一函數

2)生成器具有next方法

3)生成器可以使用send 方法和外界交互。

閑話python 45: 淺談生成器yield

生成器似乎並不是一個經常被開發者討論的語法,因此也就沒有它的大兄弟迭代器那麼著名。大家不討論它並不是說大家都已經對它熟悉到人盡皆知,與之相反,即使是工作多年的開發者可能對生成器的運行過程還是知之甚少。這是什麼原因導致的呢?我猜想大概有以下幾點原因: (1)運行流程不同尋常,(2)日常開發不需要,(3)常常將生成器與迭代器混淆。 生成器的運行流程可以按照協程來理解,也就是說 返回中間結果,斷點繼續運行 。這與我們通常對於程序調用的理解稍有差異。這種運行模式是針對什麼樣的需求呢? 一般而言,生成器是應用於大量磁盤資源的處理。 比如一個很大的文件,每次讀取一行,下一次讀取需要以上一次讀取的位置為基礎。下面就通過代碼演示具體看看生成器的運行機制、使用方式以及與迭代器的比較。

什麼是生成器?直接用文字描述可能太過抽象,倒不如先運行一段代碼,分析這段代碼的運行流程,然後總結出自己對生成器的理解。

從以上演示可以看出,這段代碼定義了一個函數,這個函數除了yield這個關鍵字之外與一般函數並沒有差異,也就是說生成器的魔法都是這個yield關鍵字引起的。 第一點,函數的返回值是一個生成器對象。 上述代碼中,直接調用這個看似普通的函數,然後將返回值打印出來,發現返回值是一個對象,而並不是普通函數的返回值。 第二點,可以使用next對這個生成器對象進行操作 。生成器對象天然的可以被next函數調用,然後返回在yield關鍵字後面的內容。 第三,再次調用next函數處理生成器對象,發現是從上次yield語句之後繼續運行,直到下一個yield語句返回。

生成器的運行流程確實詭異,下面還要演示一個生成器可以執行的更加詭異的操作:運行過程中向函數傳參。

返回生成器和next函數操作生成器已經並不奇怪了,但是在函數運行過程中向其傳參還是讓人驚呆了。 調用生成器的send函數傳入參數,在函數內使用yield語句的返回值接收,然後繼續運行直到下一個yield語句返回。 以前實現這種運行流程的方式是在函數中加上一個從控制台獲取數據的指令,或者提前將參數傳入,但是現在不用了,send方式使得傳入的參數可以隨着讀取到的參數變化而變化。

很多的開發者比較容易混淆生成器和迭代器,而迭代器的運行過程更加符合一般的程序調用運行流程,因此從親進度和使用熟悉度而言,大家對迭代器更有好感。比如下面演示一個對迭代器使用next方法進行操作。

從以上演示來看,大家或許會認為迭代器比生成器簡單易用得太多了。不過,如果你了解迭代器的實現機制,可能就不會這麼早下結論了。python內置了一些已經實現了的迭代器使用確實方便,但是如果需要自己去寫一個迭代器呢?下面這段代碼就帶大家見識以下迭代器的實現。

在python中,能被next函數操作的對象一定帶有__next__函數的實現,而能夠被迭代的對象有必須實現__iter__函數。看了這麼一段操作,相信大家對迭代器實現的繁瑣也是深有體會了,那麼生成器的實現是不是會讓你覺得更加簡單易用呢?不過千萬別產生一個誤區,即生成器比迭代器簡單就多用生成器。 在實際開發中,如果遇到與大量磁盤文件或者數據庫操作相關的倒是可以使用生成器。但是在其他的任務中使用生成器難免有炫技,並且使邏輯不清晰而導致可讀性下降的嫌疑。 這大概也能解釋生成器受冷落的原因。不過作為一個專業的開發者,熟悉語言特性是分內之事。

到此,關於生成器的討論就結束了。本文的notebook版本文件在github上的cnbluegeek/notebook倉庫中共享,歡迎感興趣的朋友前往下載。

好玩的python代碼示例

import random

while True:

# 出拳

punches = [‘石頭’,’剪刀’,’布’]

computer_choice = random.choice(punches)

user_choice = ”

user_choice = input(‘請出拳:(石頭、剪刀、布)’) # 請用戶輸入選擇

while user_choice not in punches: # 當用戶輸入錯誤,提示錯誤,重新輸入

print(‘輸入有誤,請重新出拳’)

user_choice = input()

# 亮拳

print(‘————戰鬥過程————’)

print(‘電腦出了:%s’ % computer_choice)

print(‘你出了:%s’ % user_choice)

# 勝負

print(‘—————結果—————’)

if user_choice == computer_choice: # 使用if進行條件判斷

print(‘平局!’)

# 電腦的選擇有3種,索引位置分別是:0石頭、1剪刀、2布。

# 假設在電腦索引位置上減1,對應:-1布,0石頭,1剪刀,皆勝。

elif user_choice == punches[punches.index(computer_choice)-1]:

print(‘你贏了!’)

else:

print(‘你輸了!’)

a1 = input(‘要繼續遊戲嗎,請輸入n退出,輸入其他繼續:’) # 在 while True 循環中設置跳出條件。

if a1 == ‘n’:

break

else:

print(‘———next game——- are you ready???’)

Python中生成器的理解?

9.10. 生成器

Generator 是創建迭代器的簡單而強大的工具。它們寫起來就像是正規的函數,需要返回數據的時候使用 yield 語句。每次 next() 被調用時,生成器回復它脫離的位置(它記憶語句最後一次執行的位置和所有的數據值)。以下示例演示了生成器可以很簡單的創建出來:

前一節中描述了基於類的迭代器,它能作的每一件事生成器也能作到。因為自動創建了 __iter__() 和 __next__() 方法,生成器顯得如此簡潔。

另一個關鍵的功能在於兩次執行之間,局部變量和執行狀態都自動的保存下來。這使函數很容易寫,而且比使用 self.index 和 self.data 之類的方式更清晰。

除了創建和保存程序狀態的自動方法,當發生器終結時,還會自動拋出 StopIteration 異常。綜上所述,這些功能使得編寫一個正規函數成為創建迭代器的最簡單方法。

Generator 是創建迭代器的簡單而強大的工具。它們寫起來就像是正規的函數,需要返回數據的時候使用 yield 語句。每次 next() 被調用時,生成器回復它脫離的位置(它記憶語句最後一次執行的位置和所有的數據值)。以下示例演示了生成器可以很簡單的創建出來:

前一節中描述了基於類的迭代器,它能作的每一件事生成器也能作到。因為自動創建了 __iter__() 和 __next__() 方法,生成器顯得如此簡潔。

另一個關鍵的功能在於兩次執行之間,局部變量和執行狀態都自動的保存下來。這使函數很容易寫,而且比使用 self.index 和 self.data 之類的方式更清晰。

除了創建和保存程序狀態的自動方法,當發生器終結時,還會自動拋出 StopIteration 異常。綜上所述,這些功能使得編寫一個正規函數成為創建迭代器的最簡單方法。

python遞歸生成器

def flattern(nested):

    try:

        if type(nested)==type(“”):

            raise TypeError()

        for sublist in nested:

            for element in flattern(sublist):

                yield element

    except TypeError:

        yield nested

nested=[[1,2],[3,4],[5],6]

for i in flattern(nested):

    print i

生成器的作用就是產生一個可迭代對象,可以在for這樣的語句中使用,yield element語句的作用就是將element添加到這個可迭代對象

def flattern(nested):

   try:

       for sublist in nested:

           for element in flattern(sublist):  #迭代flattern(子列表)所產生的生成器

               yield element        #對flattern的遞歸調用只是生成了新的生成器,得將這些生成器中的值添加到當前生成器

   except TypeError:

       yield nested      #如果變量nested不可迭代,for語句會出現TypeError錯誤,這時將nested添加到當前生成器中

在try開頭加上了

if type(nested)==type(“”):

raise TypeError()

因為字符是一直可以迭代的,如果不處理,如果參數中有字符串會無限遞歸下去

這個函數的作用就是將子列表完全擴展開產生一個生成器

原創文章,作者:簡單一點,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/128816.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
簡單一點的頭像簡單一點
上一篇 2024-10-03 23:25
下一篇 2024-10-03 23:25

相關推薦

  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python字符串寬度不限制怎麼打代碼

    本文將為大家詳細介紹Python字符串寬度不限制時如何打代碼的幾個方面。 一、保持代碼風格的統一 在Python字符串寬度不限制的情況下,我們可以寫出很長很長的一行代碼。但是,為了…

    編程 2025-04-29
  • Python基礎代碼用法介紹

    本文將從多個方面對Python基礎代碼進行解析和詳細闡述,力求讓讀者深刻理解Python基礎代碼。通過本文的學習,相信大家對Python的學習和應用會更加輕鬆和高效。 一、變量和數…

    編程 2025-04-29
  • 打造照片漫畫生成器的完整指南

    本文將分享如何使用Python編寫一個簡單的照片漫畫生成器,本文所提到的所有代碼和技術都適用於初學者。 一、環境準備 在開始編寫代碼之前,我們需要準備一些必要的環境。 首先,需要安…

    編程 2025-04-29
  • Python簡單數學計算

    本文將從多個方面介紹Python的簡單數學計算,包括基礎運算符、函數、庫以及實際應用場景。 一、基礎運算符 Python提供了基礎的算術運算符,包括加(+)、減(-)、乘(*)、除…

    編程 2025-04-29
  • 倉庫管理系統代碼設計Python

    這篇文章將詳細探討如何設計一個基於Python的倉庫管理系統。 一、基本需求 在着手設計之前,我們首先需要確定倉庫管理系統的基本需求。 我們可以將需求分為以下幾個方面: 1、庫存管…

    編程 2025-04-29
  • Python滿天星代碼:讓編程變得更加簡單

    本文將從多個方面詳細闡述Python滿天星代碼,為大家介紹它的優點以及如何在編程中使用。無論是剛剛接觸編程還是資深程序員,都能從中獲得一定的收穫。 一、簡介 Python滿天星代碼…

    編程 2025-04-29
  • 寫代碼新手教程

    本文將從語言選擇、學習方法、編碼規範以及常見問題解答等多個方面,為編程新手提供實用、簡明的教程。 一、語言選擇 作為編程新手,選擇一門編程語言是很關鍵的一步。以下是幾個有代表性的編…

    編程 2025-04-29
  • Python實現簡易心形代碼

    在這個文章中,我們將會介紹如何用Python語言編寫一個非常簡單的代碼來生成一個心形圖案。我們將會從安裝Python開始介紹,逐步深入了解如何實現這一任務。 一、安裝Python …

    編程 2025-04-29
  • 怎麼寫不影響Python運行的長段代碼

    在Python編程的過程中,我們不可避免地需要編寫一些長段代碼,包括函數、類、複雜的控制語句等等。在編寫這些代碼時,我們需要考慮代碼可讀性、易用性以及對Python運行性能的影響。…

    編程 2025-04-29

發表回復

登錄後才能評論