常見的列表生成方式:
1.list
>>
>
list
(range(1
,5))
>[1
,2,3
,4]
2.for迴圈
l=
for i in
range(1
,5):
>>
>l
>[1
,2,3
,4]
3.列表生成式 : 在列表生成時加入限制判斷條件
例:
#[1,2,3,4]
[x for x in
range(1
,5)]
可以新增限制條件
#[2.4]
[x for x in
range(1
,5)if x%2==
0]
用於求全排列
#['ay','az','by','bz']
[a+b for a in
'ab'
for b in
'yz'
]
但是三層或三層以上的迴圈在實際中很少用到。
讀取檔名
>>
>
import os
>>
>
[d for d in os.listdir(
'.')
]# os.listdir可以列出檔案和目錄
['.emacs.d'
,'.ssh'
,'.trash'
,'adlm',,
'desktop'
,'documents'
,'downloads'
,'library'
,'movies'
,'music'
,'pictures'
,'public'
,'virtualbox vms'
,'workspace'
,'xcode'
]
for迴圈其實可以同時使用兩個甚至多個變數,比如dict的items()可以同時迭代key和value。
>>
> d =
>>
>
[k +
'='+ v for k, v in d.items()]
['y=b'
,'x=a'
,'z=c'
]
「列表生成式」式生成器
建立生成器的其中一種方法,就是將列表生成式的 [ ] 換成 ( )
例:
>>
> g =
(x*x for x in
range(1
,5))
> g
>
at 0x02ae8d48
>
與列表生成式不同的是,這樣建立出的生成器不會列印出g中每乙個元素,而是如上所示。這是因為,生成器所儲存的是一種演算法,而不是某些具體的元素。
要列印出g中的每乙個元素,需要使用next()方法:
>>
>
next
(g)>
1>>
>
next
(g)>
4>>
>
next
(g)>
9>>
>
next
(g)>
16>>
>
next
(g)>traceback (most recent call last)
: file ""
, line 1,in
stopiteration
當計算到最後乙個元素後,沒有更多的元素,計算機會丟擲stopiteration錯誤
當然,也可以用for迴圈來直接輸出,可以將g能生成的所有元素列印出來。但是不會有stopiteration
for i in g:
print
(i)
函式式生成器 yield
斐波拉契數列用列表生成式寫不出來,但是,用函式把它列印出來卻很容易:
def
fib(n)
: x,a,b =0,
0,1while xprint
(b) a,b = b,a+b
x +=
1return
'done'
仔細觀察,可以看出,fib函式實際上是定義了斐波拉契數列的推算規則,可以從第乙個元素開始,推算出後續任意的元素,這種邏輯其實非常類似generator。
要把fib()函式變成generator,只需要將print(b)轉換成yield b即可。
這就是定義generator的另一種方法。如果乙個函式定義中包含yield關鍵字,那麼這個函式就不再是乙個普通函式,而是乙個generator:
def
fib(n)
: x,a,b =0,
0,1while xyield b
a,b = b,a+b
x +=
1return
'done'
generator和函式的執行流程不一樣。函式是順序執行,遇到return語句或者最後一行函式語句就返回。而變成generator的函式,在每次呼叫next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行。
>>
>
for fib_num in fib(6)
:...
print
(fib_num)..
.>
1>
1>
2>
3>
5>
8
但是卻提取不到return返回值 『done』。
前面說過,當計算到最後乙個元素後,沒有更多的元素,計算機會丟擲stopiteration錯誤。
因此,如果想要拿到返回值,必須捕獲stopiteration錯誤,返回值包含在stopiteration的value中。
>>
> g = fib(6)
>>
>
while
true:.
..try:..
. x =
next
(g)...
print
('g:'
, x)..
.except stopiteration as e:..
.print
('generator return value:'
, e.value)..
.break..
.g:1g:
1g:2g:
3g:5g:
8generator return value: done
可以直接作用於for迴圈的物件統稱為可迭代物件:iterable
如:list,tuple,dict,set,str
還有上面提到的generator
可以使用isinstance()判斷乙個物件是否是iterable物件.(from collections import iterable)
而可迭代物件卻不一定是迭代器(iterator)。可以被next()函式呼叫並不斷返回下乙個值的物件稱為迭代器:iterator。
符合這一條件的 :generator不但可以作用於for迴圈,還可以被next()函式不斷呼叫並返回下乙個值,直到最後丟擲stopiteration錯誤表示無法繼續返回下乙個值。
可以使用isinstance()判斷乙個物件是否是iterator物件.(from collections import iterator)
集合資料型別如list、dict、str等是iterable但不是iterator,不過可以通過iter()函式獲得乙個iterator物件。
列表生成式,列表生成器
coding utf 8 列表生成式是快速生成乙個列表一些公式 numbers for x in range 0,101 print numbers 要放入列表資料 簡單的表示式 1 表示式 2 x for x in range 0,101 for 迴圈遍歷出來的值,放入列表中 numbers x ...
python列表生成式與列表生成器
列表生成式 會將所有的結果全部計算出來,把結果存放到記憶體中,如果列表中資料比較多,就會占用過多的記憶體空間,可能會導致memoryerror記憶體錯誤或者導致程式在執行時出現卡頓的情況 列表生成器 會建立乙個列表生成器物件,不會一次性的把所有結果都計算出來,如果需要獲取資料,可以使用next 函式...
Python生成器和列表生成式
生成器 在python中,這種一邊迴圈一邊計算的機制,稱為生成器 generator 列表生成式 l list x x for x in range 10 生成器 g generator x x for x in range 10 呼叫該generator時,首先要生成乙個generator物件,然...