一、推導式
1.1 列表推導式
語法:[最終結果(變量) for 變量 in 可迭代對象]
1
lst = [x
for
x
in
range(1, 15
)]
2
print
(lst)
3
4
5
#
獲取1-100以內能被3整除的數
6
lst = [i
for
i
in
range(100)
if
i % 3 ==
0]
7
8
#
獲取1-100以內能被3整除的數的平方
9
lst = [i*i
for
i
in
range(100)
if
i % 3 == 0]
1.2 字典推導式
1
dic = {
"
a
"
:
"
b
"
,
"
c
"
:
"
d
"
}
2
#
把字典中的key,value互換,{"b":"a", "d":"c"}
3
new_dic = {dic[key]: key
for
key
in
dic}
4
print
(new_dic)
5
6
7
lst1 = [
"
alex
"
,
"
wusir
"
,
"
taibai
"
,
"
ritian
"
]
8
lst2 = [
"
sb
"
,
"
很色
"
,
"
很白
"
,
"
很牛
"
]
9
#
組成一個字典
10
new_dic = {lst1[i]:lst2[i]
for
i
in
range(len(lst1))}
11
print
(new_dic)
1.3 集合推導式
1
lst = [
"
馬化騰
"
,
"
王建忠
"
,
"
張建忠
"
,
"
張雪峰
"
,
"
張雪峰
"
,
"
張雪峰
"
]
2
s = {i
for
i
in
lst}
3
print
(s)
二、生成器
利用迭代器,我們可以在每次迭代獲取數據(通過next()方法)時按照特定的規律進行生成。但是我們在實現一個迭代器時,關于當前迭代到的狀態需要我們自己記錄,進而才能根據當前狀態生成下一個數據。為了達到記錄當前狀態,并配合next()函數進行迭代使用,我們可以采用更簡便的語法,即生成器(generator)。生成器是一類特殊的迭代器。
2.1?創建生成器的方法1(生成器表達式)
In [15]: L = [ x*2
for
x
in
range(5
)]
In [
16
]: L
Out[
16]: [0, 2, 4, 6, 8
]
In [
17]: G = ( x*2
for
x
in
range(5
))
In [
18
]: G
Out[
18]:
at 0x7f626c132db0>
In [
19]:
創建 L 和 G 的區別僅在于最外層的 [ ] 和 ( ) , L 是一個列表,而 G 是一個生成器。我們可以直接打印出列表L的每一個元素,而對于生成器G,我們可以按照迭代器的使用方法來使用,即可以通過next()函數、for循環、list()等方法使用。
In [19
]: next(G)
Out[
19
]: 0
In [
20
]: next(G)
Out[
20]: 2
In [
21
]: next(G)
Out[
21]: 4
In [
22
]: next(G)
Out[
22]: 6
In [
23
]: next(G)
Out[
23]: 8
In [
24
]: next(G)
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
in
()
----> 1
next(G)
StopIteration:
In [
25
]:
In [
26]: G = ( x*2
for
x
in
range(5
))
In [
27]:
for
x
in
G:
....:
print
(x)
....:
0
2468
In [
28]:
2.2?創建生成器的方法2
In [30]:
def
fib(n):
....: current
=
0
....: num1, num2
= 0, 1
....:
while
current <
n:
....: num
=
num1
....: num1, num2
= num2, num1+
num2
....: current
+= 1
....:
yield
num
....:
return
'
done
'
....:
In [
31]: F = fib(5
)
In [
32
]: next(F)
Out[
32]: 1
In [
33
]: next(F)
Out[
33]: 1
In [
34
]: next(F)
Out[
34]: 2
In [
35
]: next(F)
Out[
35]: 3
In [
36
]: next(F)
Out[
36]: 5
In [
37
]: next(F)
-----------------------------------------------------------------------
StopIteration Traceback (most recent call last)
in
()
----> 1
next(F)
StopIteration: done
在使用生成器實現的方式中,我們將原本在迭代器__next__方法中實現的基本邏輯放到一個函數中來實現,但是將每次迭代返回數值的return換成了yield,此時新定義的函數便不再是函數,而是一個生成器了。簡單來說: 只要在def中有yield關鍵字的 就稱為 生成器.
?
In [38]:
for
n
in
fib(5
):
....:
print
(n)
....:
11235
In [
39]:
In [39]: g = fib(5
)
In [
40]:
while
True:
....:
try
:
....: x
=
next(g)
....:
print
(
"
value:%d
"
%
x)
....:
except
StopIteration as e:
....:
print
(
"
生成器返回值:%s
"
%
e.value)
....:
break
....:
value:
1
value:
1
value:
2
value:
3
value:
5
生成器返回值:done
In [
41]:
-
使用了yield關鍵字的函數不再是函數,而是生成器。(使用了yield的函數就是生成器)
-
yield關鍵字有兩點作用:
-
保存當前運行狀態(斷點),然后暫停執行,即將生成器(函數)掛起
-
將yield關鍵字后面表達式的值作為返回值返回,此時可以理解為起到了return的作用
-
可以使用next()函數讓生成器從斷點處繼續執行,即喚醒生成器(函數)
-
Python3中的生成器可以使用return返回最終運行的返回值,而Python2中的生成器不允許使用return返回一個返回值(即可以使用return從生成器中退出,但return后不能有任何表達式。
2.3 使用send喚醒
In [10]:
def
gen():
....: i
=
0
....:
while
i<5
:
....: temp
=
yield
i
....:
print
(temp)
....: i
+=1
....:
使用send(send不能第一次使用):
In [43]: f =
gen()
In [
44
]: next(f)
Out[
44
]: 0
In [
45]: f.send(
'
haha
'
)
haha
Out[
45]: 1
In [
46
]: next(f)
None
Out[
46]: 2
In [
47]: f.send(
'
haha
'
)
haha
Out[
47]: 3
In [
48]:
使用next()函數:
In [11]: f =
gen()
In [
12
]: next(f)
Out[
12
]: 0
In [
13
]: next(f)
None
Out[
13]: 1
In [
14
]: next(f)
None
Out[
14]: 2
In [
15
]: next(f)
None
Out[
15]: 3
In [
16
]: next(f)
None
Out[
16]: 4
In [
17
]: next(f)
None
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
in
()
----> 1
next(f)
StopIteration:
使用__next__():
In [18]: f =
gen()
In [
19]: f.
__next__
()
Out[
19
]: 0
In [
20]: f.
__next__
()
None
Out[
20]: 1
In [
21]: f.
__next__
()
None
Out[
21]: 2
In [
22]: f.
__next__
()
None
Out[
22]: 3
In [
23]: f.
__next__
()
None
Out[
23]: 4
In [
24]: f.
__next__
()
None
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
in
()
----> 1 f.
__next__
()
StopIteration:
案例:
1
def
add(a, b):
2
return
a +
b
3
4
5
def
test():
6
for
r_i
in
range(4
):
7
yield
r_i
8
9
10
g =
test()
11
12
13
for
n
in
[2, 10
]:
14
g = (add(n, i)
for
i
in
g)
15
16
17
print
(list(g))
#
[20, 21, 22, 23] 惰性機制
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

