python輸出器 Python生成器

2021-10-12 15:04:30 字數 3611 閱讀 6009

簡單的生成器,生成器解析式:

1 #usr/bin/env python3

2 #-*- codign=utf-8 -*-

4 mygenerator = (x*x for x in range(10)) #簡單的生成器

5 print(type(mygenerator)) #輸出

6 print(dir(mygenerator)); #輸出:['__class__', '__del__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__name__', '__ne__', '__new__', '__next__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'gi_code', 'gi_frame', 'gi_running', 'gi_yieldfrom', 'send', 'throw']

dir()發現裡面發現有迭代器中的__iter__()和__next__(),這說明mygenerator是迭代器,是迭代器就可以用for迴圈。

1 #既然有迭代器的屬性就可以用next()迴圈讀取

2 print("first number:", next(mygenerator)) #first number: 0

3 print("second number:", next(mygenerator)) #second number: 1

5 #迴圈讀取餘下的

6 for i inmygenerator:7 print(i) #輸出1-10的平方的結果

再看熟知的list:

1 mylist = [x*x for x in range(10)]; #定義列表解析式

2 print(type(mylist)) #輸出:

5 #print(next(mylist)) #出錯:typeerror: 'list' object is not an iterator,說明不可迭代

6 #第一次迴圈有輸出

7 for i inmylist:8 print(i) #有輸出

9 #第二次迴圈還是有輸出

10 for j inmylist:11 print(j) #有輸出

總結:1,生成器在第一次迴圈的時候,將mygenerator裡的值依次讀取並列印,再次讀取的,就發現沒有任何結果了。迭代器所具有的特性。這與列表不同。

2,生成器解析在很多地方都可以替代列表解析,因為,它占用記憶體少。

3,**優雅簡潔。如下:

1 sum(i*i for i in range(10)) #生成器

2 sum([i*i for i in range(10)]) #列表解析

yield,真正的生成器利器。

1 defmygenerator():2 yield03 yield 1

4 yield 2

6 mygenerator =mygenerator()7 print(mygenerator) #輸出:

8 print(type(mygenerator)) #輸出:

9 print(dir(mygenerator)) #輸出有:__iter__()和__next__()說明是迭代器

10 print(next(mygenerator)) #輸出0

11 print(next(mygenerator)) #輸出1

12 print(next(mygenerator)) #輸出2

13 print(next(mygenerator)) #讀取完了,錯誤提示,發起stopiteration

mygenerator = mygenerator()。呼叫函式並把它賦值給變數mygenerator,除了返回生成器外什麼都沒有做,任何值都不會返回。

print(mygenerator)。列印一下物件,說明是生成器型別。

print(type(mygenerator))。檢視型別。

print(dir(mygenerator))。還是檢視。

print(next(mygenerator))。生成器開始執行,遇到第乙個yeild語句,將值返回並暫停執行(有的稱之為掛起)。

print(next(mygenerator))。再次呼叫next(),從上次暫停的位置開始,將值返回,並暫停。

print(next(mygenerator))。重複上面操作。

print(next(mygenerator))。重複上面操作。

執行過程:yeild除了作為生成器的標誌之外,還有乙個功能就是返回值。既然是返回值,那麼在函式內部跟return有什麼區別?

首先看return:

1 defcheckreturn():2 print "begin......"

3 while n >0:4 print("before return.")5 returnn6 n -= 1

7 print("after return.")8 a = checkreturn(3) #輸出了函式體內的第乙個和第二個print語句:begin...... before return.

9 print(a) #執行函式體內的return n 語句,輸出3

上面的**並沒有執行函式體內return語句後面的語句,也就是函式體內遇到return後只執行return語句,return語句後面的**都不執行。

再看yeild:

1 defcheckyeild(n):2 print("begin to check yield.....")3 while n >0:4 print("before yeild.")5 yieldn6 n -= 1

7 print("after yeild")8

9 b = checkyeild(3) #呼叫函式checkyeild,除了返回生成器什麼都不做

10 print("first time to call:", next(b)) #遇到yeild,返回值,暫停。

11 print("second time to call:", next(b)) #從上次暫停位置繼續執行

12 print("third time to call:", next(b)) #又遇到yeild,返回值,暫停。

13 print("forth time to call:", next(b)) #第四次呼叫的時候,發現n已經不滿足條件while n>0了,發起stopiteration

用生成器些斐波那契數列:

1 deffibs(fmax):2 '''

3 generator for fibonacci sequence4 '''

5 n, a, b = 0, 0, 1

6 while n <7 yieldb8 a b n="n">

11 if __name__ == "__main__":12 fs = fibs(10)13 for i infs:14 print(i)

生成器yeild還有幾個方法:send(),throw(),close()。以後再說。

7>

python輸出 Python輸出

簡單來說,就是將程式的執行結果顯示出來。print hello world 比如有以下 pirnt 我今年10歲 pirnt 我今年11歲 pirnt 我今年12歲 在輸出年齡的時候,用了多次 我今年xx歲 能否簡化一下程式呢?字串格式化看如下 age 10 print 我今年 d歲 age age...

python輸出 認識python之輸出(3)

1.普通的輸出 軟體中的 輸出 列印提示 print hello world print 給我的卡 印度語,你好的意思 2.格式化輸出 1 格式化操作的目的比如有以下 pirnt 我今年10歲 pirnt 我今年11歲 pirnt 我今年12歲 在輸出年齡的時候,用了多次 我今年xx歲 能否簡化一下...

python日誌輸出

import logging logger logging.getlogger 生成乙個日誌物件,內為日誌物件的名字,可以不帶,名字不給定就是root,一般給定名字,否則會把其他的日誌輸出也會列印到你的檔案裡。handler logging.filehandler log test.txt 生成乙個...