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

首頁 > 編程 > Python > 正文

Python生成器generator用法示例

2020-02-15 22:43:10
字體:
來源:轉載
供稿:網友

本文實例分析了Python生成器generator用法。分享給大家供大家參考,具體如下:

生成器generator本質是一個函數,它記住上一次在函數體中的位置,在生成器函數下一次調用,會自動找到該位置,局部變量都保持不變

l = [x * 2 for x in range(10)] # 列表生成式g = (x * 2 for x in range(10))print(l,g) # l打印的是一個列表,g則是一個generator的內存地址

一次性打印獲取generator的所有元素:

for index in g:  print(index)

逐步獲取generator的元素:

print(g.__next__())   # 0print(g.__next__())   # 2print(g.__next__())   # 4print(g.__next__())   # 6print(g.__next__())   # 8

yield關鍵字

通常我們做一個打印0-50的數時,會定義一個函數,只要調用這個函數,它就會自定打印0-50的數

def fib(num):  n = 0  while n < num:    print(n)    n+=1fib(50)

其實我們只需要改動那么一丟丟,就可以將上面那個函數改變成一個generator

def fib(num):  n = 0  while n < num:    yield n   # 在使用yield關鍵字時,需在前面先定義一個變量n    n+=1g = fib(50)   # 此時的g是一個generator

generator原理:通過某一種特定的算法,在一個特定的條件下,不斷向下推算,得出后續的元素。因為generator不必創建list,所以可以大大的節約內存空間。舉個栗子:

def fib():  print("step 1")  yield 1  print("step 2")  yield 2  print("step 3")  yield 3g = fib()g.__next__()  # 結果:step 1g.__next__()  # 結果:step 2g.__next__()  # 結果:step 3

根據結果可以看出,每次執行next(),都會打印一句,而遇到yield就直接跳出,并記錄位置,再次執行next()時,會從記錄的那個位置開始往下執行,再次遇到yield時跳出。

此時我們不經會想,如果我們不斷的調用next(),該如何判斷是否已經完畢,如果越界了,是否會報錯?

# -* coding:utf-8 -*-#! python3'''Created on 2018年8月10日@author: Administrator'''def fib(num):  n = 0  while n < num :    yield n    n+=1g = fib(10)while True:  print(g.__next__())

執行結果:

可以看出當遍歷完畢之后,如果在此調用next()將會報錯,我們是無法獲取到遍歷的下標的,那么我們該如何規避這個錯誤呢?對next()拋異常處理

def fib(num):  n = 0  while n < num :    yield n    n+=1g = fib(10)while True:  try:    print(g.__next__())  except StopIteration:    print("已經完畢")    break

此時將不再報錯,當越界的時候,系統會自動捕捉該異常,并且打印你想要輸出的信息

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 静安区| 利川市| 阳西县| 侯马市| 南川市| 保定市| 会理县| 望城县| 前郭尔| 通州市| 高尔夫| 铁力市| 大荔县| 敦煌市| 彩票| 临漳县| 化德县| 扶余县| 开鲁县| 宕昌县| 鹤峰县| 碌曲县| 株洲市| 合作市| 呼伦贝尔市| 阿鲁科尔沁旗| 新丰县| 本溪市| 巴彦县| 临颍县| 德江县| 平安县| 永仁县| 湾仔区| 宝鸡市| 林州市| 合作市| 商南县| 靖宇县| 繁昌县| 惠州市|