91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python生成器generator用法示例

發布時間:2020-08-28 02:46:10 來源:腳本之家 閱讀:183 作者:噴跑的豆子 欄目:開發技術

本文實例分析了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__())   # 0
print(g.__next__())   # 2
print(g.__next__())   # 4
print(g.__next__())   # 6
print(g.__next__())   # 8

yield關鍵字

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

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

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

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

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

def fib():
  print("step 1")
  yield 1
  print("step 2")
  yield 2
  print("step 3")
  yield 3
g = fib()
g.__next__()  # 結果:step 1
g.__next__()  # 結果:step 2
g.__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+=1
g = fib(10)
while True:
  print(g.__next__())

執行結果:

Python生成器generator用法示例

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

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

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

send方法

在單線程下實現一個簡單的并行效果

# -*- coding:utf-8 -*-
#! python3
'''
Created on 2018年8月10日

@author: Administrator
'''
import time
def startEat(name):
  print("%s準備開始吃包子了"%name)
  while True:
    b = yield
    print("%s被%s吃了"%(b,name))
def startMake():
  laowang = startEat("laowang")
  laowang.__next__()
  for index in range(10):
    time.sleep(1)
    print("已經做好了包子%d號"%index)
    laowang.send("包子%d號"%index)
startMake()

執行結果:

Python生成器generator用法示例

更多關于Python相關內容可查看本站專題:《Python列表(list)操作技巧總結》、《Python字符串操作技巧匯總》、《Python數據結構與算法教程》、《Python函數使用技巧總結》、《Python入門與進階經典教程》及《Python文件與目錄操作技巧匯總》

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

建水县| 南安市| 临夏市| 湘乡市| 互助| 镇江市| 游戏| 凤山县| 通榆县| 福建省| 连南| 乌拉特后旗| 甘洛县| 台中县| 昌邑市| 平安县| 陵川县| 汤阴县| 阳春市| 怀集县| 万州区| 天峨县| 郸城县| 土默特右旗| 明溪县| 铁岭县| 昔阳县| 昂仁县| 康马县| 于都县| 锡林浩特市| 林口县| 宽城| 新田县| 当涂县| 庄浪县| 武宁县| 裕民县| 闸北区| 嘉黎县| 曲沃县|