一、函式屬性
函式可以在內部建立預設的屬性,還可以在外部通過句點屬性識別符號來動態建立該函式的屬性。
>>> deffoo():
'foo() -- properly created doc string!
'>>> def
bar():
pass
>>> foo.__doc__
'foo() -- properly created doc string!
'>>> bar.__doc__
>>> bar.version = 0.1
>>>bar.version
0.1>>> bar.hehe = 1
>>>bar.hehe
1
二、生成器:generator
一邊迴圈,一邊計算的機制,稱為生成器,每次迴圈只會取出乙個元素,可以節省大量記憶體空間。
1、通過小括號的方式建立生成器:(),並用next()函式輸出每乙個元素
#使用中括號時是列表推導式:
>>> l = [x * x for x in range(10)]
>>>l
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
#使用小括號時是生成器:
>>> g = (x * x for x in range(10))
>>>g
at 0x000002299458af68>
>>> #
生成器取出元素可以使用next()函式,一次取出乙個元素:
>>>next(g)
0>>>next(g)
1>>>next(g)
4>>>next(g)
9>>>next(g)
16>>>next(g)
25>>>next(g)
36>>>next(g)
49>>>next(g)
64>>>next(g)81#
取到最後時會丟擲stopiteration異常,不能再取出元素:
>>>next(g)
traceback (most recent call last):
file
"", line 1, in
next(g)
stopiteration
>>>
2、使用for迴圈取出生成器中的元素:
>>> g = (x * x for x in range(10))>>> for i in
g:
(i) 01
491625
3649
6481
3、在函式中使用yield語法構造生成器:
1)使用函式列印斐波那契數列:
>>> deffib(max):
n,a,b = 0,0,1
while n print
(b) a,b = b,a+b
n += 1
return
'done
'>>> fib(6)11
2358
'done
'
2、修改函式使它成為乙個生成器而不再是函式:
>>> deffib(max):
n,a,b = 0,0,1
while n yield
b a,b = b,a+b
n += 1
return
'done
'>>>fib
** 函式和生成器的區別在於,生成器有yield,而yield的機制是遇到此語句後即返回,然後繼續執行函式內後面的語句,而函式中的return語句是直接從函式返回,不會再執行後面的語句。
可以通過for迭代語句取出每次返回的yield值:
>>> for n in fib(6):(n) 11
2358
同樣也可以使用next()函式迭代生成器:
#注意這裡的f = fib(6)是必須有的,這個表示可迭代物件,且只執行一次生成器,如果使用next(fib(6)),那麼每次next都會執行一次生成器,也就只會執行到第一次yield。
>>> f = fib(6)
>>>next(f)
1>>>next(f)
1>>>next(f)
2>>>next(f)
3>>>next(f)
5>>>next(f)
8# 可以看到在沒有yield語句後引發了異常,而異常的value值就是生成器
>>>next(f)
traceback (most recent call last):
file
"", line 1, in
next(f)
stopiteration: done
>>>
函式與生成器
一 函式 1.1 函式的關鍵字 def 定義函式 return 返回值 pass 佔位 exit 1 直接退出並返回1 1.2 高階函式 高階函式都是可以通過 邏輯實現,但是自己寫的函式的複雜程度或者演算法不一定有人家內建的好 map高階函式 def f x return x x print map...
python生成器函式 Python 生成器函式
一 生成器 生成器指的是生成器物件,可由生成器表示式得到,也可使用 yield 關鍵字得到乙個生成器函式,呼叫這個函式得到乙個生成器物件 生成器物件,是乙個可迭代物件,是乙個迭代器 生成器物件,是延遲計算 惰性求值的 1.1 生成器函式 函式體重包含 yield 語句的函式,就是生成器函式,呼叫後返...
生成器函式
pyhon優雅的魔力使生成器函式很特殊,它們像定格相機一樣工作。當乙個標準函式遇到return語句時,它會返回值,然後函式會丟棄內部的所有資料。當下次呼叫時,一切從頭開始。yield語句會做不同的事情。它像return一樣返回乙個值,但是它不會使函式丟棄資料,相反所有資料都被儲存起來。usr bin...