Python三大神器之 生成器

2021-09-25 20:14:58 字數 3371 閱讀 9987

方法1:

list1 =

[x for x in

range(5

)]print

(list1)

obj1 =

(x for x in

range(5

))print

(obj1)

展示:

[0, 1, 2, 3, 4]

at 0x00000000020d98e0>

方法2:

函式版本

def

fei(num)

: a =

0 b =

1 current_index =

0while current_index < num:

print

(a) a,b = b,a+b

current_index +=

1def

fei(num)

: a =

0 b =

1 current_index =

0while current_index < num:

# print(a)

yield a

a,b = b,a+b

current_index +=

1print

(fei)

gen = fei(4)

for i in gen:

print

(i)# ret = next(gen)

# print(ret)

# ret = next(gen)

# print(ret)

# ret = next(gen)

# print(ret)

注意點:

函式裡面出現yield,說明已經不是乙個簡單的函式,而是生成器,用for來遍歷(或者next但少用)。

from collections import iterable

list1 =

[x for x in

range(5

)]print

(list1)

obj1 =

(x for x in

range(5

))# print(tuple(obj1))

print

(obj1)

print

(isinstance

(obj1,iterable)

)

注意點:

1、(推導式)生成的是乙個生成器

2、如果想要轉元組,tuple進行強轉

3、可以用isinstance判斷,生成器是乙個可迭代物件,用for迴圈可以挨個取出每乙個物件

obj1 =

(x for x in

range(5

))# print(tuple(obj1))

print

(obj1)

print

(next

(obj1)

)print

(next

(obj1)

)print

(next

(obj1)

)print

(next

(obj1)

)print

(next

(obj1)

)print

(next

(obj1,

'沒有資料啦'))

for i in obj1:

print

('###########'

)print

(i)

注意點:

訪問方式:

(1)通過for迴圈來進行遍歷

(2)next() 如果遍歷的次數超過總個數,會報錯,所以使用的時候,要麼賦值預設值,要麼使用try

方法二:使用send

def

fei(num)

: a =

0 b =

1 current_index =

0while current_index < num:

params =

yield a

print

('本次接收的引數'

,params)

# print('這是在yield後面?')

a,b = b,a+b

current_index +=

1#產生乙個生成器物件

gen = fei(5)

# gen.send(none)

print

(next

(gen)

)print

('################'

)print

(gen.send(

'hello'))

print

('################'

)print

(gen.send(

'python'))

print

('################'

)print

(gen.send(

'python'

))

注意點:

第一次使用send喚醒生成器,需要出入none,但是一般情況下,我們用next來執行第一次喚醒

def

fei(num)

: a =

0 b =

1 current_index =

0while current_index < num:

yield a

print

('這是在yield後面'

) a,b = b,a+b

# current_index = current_index+1

current_index +=

1gen = fei(5)

# print(gen)

ret =

next

(gen)

ret2 =

next

(gen)

print

('%%%%%'

)ret3 =

next

(gen)

# print(ret)

注意點:

yield的特點:

程式在執行的時候遇到yield會暫停執行,如果yield後面有返回值,先把值返回再暫停

再次啟動生成器獲取資料的時候會從暫停的地方開始執行

return只返回一次值,後面有**不執行,yield可以多次返回值

Python 三大神器

python 中有很多優秀的包,本文主要講一下 pip,virtualenv,fabric 文件 3456 78910 1112 1314 1516 17 安裝,可指定版本號 sudo pip install django 1.6.8 公升級 sudo pip install bpython upg...

python三大神器之virtualenv

pip,virtualenv,fabric通稱為pythoner的三大神器。virtualenv 用來建立乙個虛擬的python環境,乙個專屬於專案的python環境。用virtualenv 來保持乙個乾淨的環境非常有用 測試環境 linux下 通過pip安裝virtualenv pip insta...

python三大神器之pip

pip是一款管理python各類包和庫的工具,非常好用。下文介紹常用的一些命令。安裝 pip install 庫名 也可以指定版本 pip install 庫名 版本 解除安裝 pip uninstall 庫名 公升級 pip install upgrade 庫名 檢視所有第三方庫 pip list...