Python學習-列表生成式

#coding=UTF-8
import os 

#要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用list(range(1, 11)):
L=list (range(1,11))
print L

#要生成[1x1, 2x2, 3x3, ..., 10x10]
L2=[x*x for x in range(1, 11)]
print L2

#還可以使用兩層循環,可以生成全排列:
L3=[m + n for m in 'ABC' for n in 'XYZ']
print L3

# os.listdir可以列出文件和目錄
L4=[d for d in os.listdir('.')] 
print L4

#把一個list中所有的字符串變成小寫:
L5 = ['Hello', 'World', 'IBM', 'Apple']
L6=[s.lower() for s in L5]
print L6


通過列表生成式,我們可以直接創建一個列表。但是,受到內存限制,列表容量肯定是有限的。而且,創建一個包含100萬個元素的列表,不僅佔用很大的存儲空間,如果我們僅僅需要訪問前面幾個元素,那後面絕大多數元素佔用的空間都白白浪費了。
所以,如果列表元素可以按照某種算法推算出來,那我們是否可以在循環的過程中不斷推算出後續的元素呢?這樣就不必創建完整的list,從而節省大量的空間。在Python中,這種一邊循環一邊計算的機制,稱爲生成器:generator。

L7=[x*x for x in range(1,10)]
print L7

L8_generator=(x*x for x in range(1,10))
print L8_generator.next()

函數是順序執行,遇到return語句或者最後一行函數語句就返回。而變成generator的函數,在每次調用next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行。

舉個簡單的例子,定義一個generator,依次返回數字1,3,5:

def odd():
    print('step 1')
    yield 1
    print('step 2')
    yield(3)
    print('step 3')
    yield(5)


調用該generator時,首先要生成一個generator對象,然後用next()函數不斷獲得下一個返回值:

>>> o = odd()
>>> next(o)
step 1
1
>>> next(o)
step 2
3
>>> next(o)
step 3
5
>>> next(o)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章