函式與生成器

2022-01-29 14:49:18 字數 2526 閱讀 2364

一、函式屬性

函式可以在內部建立預設的屬性,還可以在外部通過句點屬性識別符號來動態建立該函式的屬性。

>>> def

foo():

'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:

print

(i) 01

491625

3649

6481

3、在函式中使用yield語法構造生成器:

1)使用函式列印斐波那契數列:

>>> def

fib(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、修改函式使它成為乙個生成器而不再是函式:

>>> def

fib(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):

print

(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...