最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python3.6生成器yield用法實例分析

 更新時間:2019年08月23日 11:35:30   作者:thormas1996  
這篇文章主要介紹了python3.6生成器yield用法,結合實例形式分析了Python3.6中生成器yield的功能、用法及相關操作注意事項,需要的朋友可以參考下

本文實例講述了python3.6生成器yield用法。分享給大家供大家參考,具體如下:

今天看源碼的時候看到了一個比較有意思的函數(shù):yield

功能與return類似,都是返回定義的函數(shù)的一個結果,不同的是return返回后這次調(diào)用函數(shù)就結束了,除了返回值,其余臨時變量都會被清除。而yield會停止在當前步,并保留其余變量的值,等下次調(diào)用該函數(shù)時,從yield的下一步繼續(xù)往下運行。

yield的好處是如果函數(shù)需要很大的內(nèi)存,比方說需要計算并返回一個很大的數(shù)列,如果用return,我們只能用一個list來存儲每一步再輸出,而用yield的話,只需要一個變量的內(nèi)存即可,每次輸出當前步的值,下次調(diào)用函數(shù)接著從這一步繼續(xù)。

文字不太好說明,看一個很容易理解的例子:(python3.6)

我們定義一個函數(shù)test(),看看return的效果

def test(n):
  for i in range(n):
    return i
    print('mark')

測試結果

for i in range(5):
  print(test(3))

輸出

0
0
0
0
0

每次調(diào)用函數(shù)時碰到return就自動結束了,返回當前i值

再來看看yield的效果:

def test2(n):
  for i in range(n):
    yield i
    print('mark')

測試

for i in range(5):
  print(test2(3))

輸出

<generator object test2 at 0x12d245200>
<generator object test2 at 0x12d245200>
<generator object test2 at 0x12d245200>

只要函數(shù)中含有yield,python就會默認這個函數(shù)是一個生成器,這個測試相當于重復打開了三次生成器

生成器需要用next()調(diào)用

測試

t = test2(3)
for i in range(3):
  print('i=',i)
  print(next(t))

next(t) 等同于 t.__next__()

結果

i= 0
0
i= 1
mark
1
i= 2
mark
2

可以看到,第一次返回i=0之后,第二次再調(diào)用函數(shù)時,從yield i的下一步繼續(xù),即print('mark')。

生成器還支持用send()將值傳遞進函數(shù):

def test3():
  value = (yield 1)
  print(value)
  print('mark1')
  value = (yield value)
  print(value)
  print('mark2')

測試

t2 = test3()
print(t2.__next__())
print('-----------')
print(t2.send(2))
print('-----------')
print(t2.send(3))

輸出

1
-----------
2
mark1
2
-----------
3
mark2
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-102-56e62df29d71> in <module>()
      4 print(t2.send(2))
      5 print('-----------')
----> 6 print(t2.send(3))

StopIteration:

第一次next()返回1,并在當前停止,send(2)會將2傳輸給當前停止的那一步y(tǒng)ield處,即相當于value = (yield 1)變?yōu)?code>value = (2)

然后繼續(xù)運行

print(value)
print('mark1')
value = (yield value)

碰到y(tǒng)ield再次停止,返回此時的vlue值2,之后send(3)將3傳輸給當前停止那一步y(tǒng)ield處,即第二個yield value處,繼續(xù)運行

print(value)
print('mark2')

生成器運行結束后生成StopIteration

更多關于Python相關內(nèi)容可查看本站專題:《Python數(shù)據(jù)結構與算法教程》、《Python Socket編程技巧總結》、《Python函數(shù)使用技巧總結》、《Python字符串操作技巧匯總》及《Python入門與進階經(jīng)典教程

希望本文所述對大家Python程序設計有所幫助。

相關文章

最新評論

荔浦县| 鸡东县| 龙南县| 凭祥市| 凤山县| 南通市| 泗洪县| 松潘县| 孝感市| 莒南县| 琼海市| 洛扎县| 金塔县| 万全县| 太湖县| 丰都县| 荔波县| 南部县| 广南县| 巨野县| 盖州市| 商洛市| 吴旗县| 德昌县| 灯塔市| 朔州市| 武汉市| 拜城县| 青阳县| 中江县| 蚌埠市| 万盛区| 阿勒泰市| 新河县| 东至县| 宁河县| 新宁县| 虹口区| 寻乌县| 安远县| 临朐县|