国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python生成器定義與簡單用法實例分析

2020-02-22 23:56:35
字體:
來源:轉載
供稿:網友

本文實例講述了Python生成器定義與簡單用法。分享給大家供大家參考,具體如下:

一、什么是生成器

在Python中,由于受到內存的限制,列表容量肯定是有限的。例如我們創建一個包含一億個元素的列表,Python首先會在內存中開辟足夠的空間來存儲這個包含一億個元素的列表,然后才允許用戶去使用這個列表,這就可能會導致以下問題:

  1、內存中沒有足夠的內存空間開存儲這個列表,從而導致列表無法創建

  2、即使列表成功創建,然而仍會消耗很長的時間,導致程序效率低下

  3、若用戶只想訪問列表前面的幾個元素,則后面列表絕大多數元素占用的空間就都白白浪費了

為了有效解決以上的問題,Python中引入了一種“一邊循環,一邊計算”的新機制,即當用戶需要使用某個對象時,Python才根據事先設計好的規則開辟內存空間創建這個對象供用戶使用,而不是像列表一樣事先將所有的對象都創建完畢之后再提供給用戶使用。這種機制在Python中成為生成器(generator)。

二、生成器的創建

A、生成器推到式

與列表推到式類似,只不過生成器推導式使用()而非[],并且最終返回的是生成器而非列表

g=((i+2)**2 for i in range(2,30)) #g是一個生成器print(g) #g為空,里面包含任何元素

運行結果:

<generator object <genexpr> at 0x0000000002263150>

B、yield關鍵字

在一個函數定義中包含yield關鍵字,則這個函數就不再是一個普通的函數,而是一個生成器(generator)

[說明]:yield指令可以暫停一個函數并返回其中間結果,使用該指令的函數將保存執行環境,并在必要時恢復

def fib(max):  n,a,b=0,0,1  while n<max:    #print(b)    yield b    a,b=b,a+b    n+=1  return 'done'f=fib(6)print(f)

運行結果:

<generator object fib at 0x0000000002553150>

[注]:普通函數和變成生成器的函數的不同:

普通函數是順序執行的,遇到return或是最后一行函數語句就返回。而變成生成器的函數在每次調用__next__()方法時執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行

f=fib(6)print(f)print(f.__next__())print(f.__next__())print('暫停一下')print(f.__next__())print(f.__next__())

運行結果:

<generator object fib at 0x00000000025631A8>
1
1
暫停一下
2
3

三、生成器方法(參考:伯樂在線)

1.close()方法:手動關閉生成器函數,后面的調用會直接返回StopIteration異常

def func():  yield 1  yield 2  yield 3g=func()g.__next__()g.close() #手動關閉生成器g.__next__() #關閉后,yield 2和yield 3語句將不再起作用            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 石狮市| 信阳市| 四子王旗| 溧水县| 台安县| 政和县| 宝兴县| 阜宁县| 黄浦区| 大洼县| 彩票| 太康县| 东乌| 灵川县| 蕲春县| 望都县| 福海县| 内乡县| 天水市| 昭觉县| 枣阳市| 青神县| 澳门| 来宾市| 麻城市| 高唐县| 卓尼县| 鄂伦春自治旗| 尚志市| 宜兴市| 康保县| 固安县| 绿春县| 星子县| 滨海县| 台中县| 安阳县| 高陵县| 辽宁省| 法库县| 南和县|