Python 列表生成式 生成器 迭代器

2021-09-28 22:42:31 字數 4285 閱讀 7886

常見的列表生成方式:

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物件,然...