參考鏈接: Python | 生成器表達式
解析式和生成器表達式?
列表解析List Comprehension?
語法?
? [返回值 for 元素 in 可迭代對象 if 條件]使用中括號[],內部是for循環,if條件語句可選,會返回一個新的列表 列表解析試優點?
? 編譯器會優化,不會因為簡寫而影響效率,反而因優化提高了效率減少程序工作量,減少出錯簡化代碼,可讀性增強 簡單示例:?
?
例子No1?
#NO1 返回1-10平方的列表
[_*_ for _ in range(1,11)]
?
例子No2?
#NO2 有一個列表lst = [1,4,9,16,2,5,10,15],生成一個新列表,要求新列表元素是lst相鄰2項的和
lst = [1,4,9,16,2,5,10,15]
[lst[i]+lst[i+1] for i in range(len(lst)-1)]
?
例子No3?
#No3 打印9*9乘法表
var = [print("{}*{}={}".format(j,i,i*j),end="\n" if i==j else "\t") for i in range(1,10) for j in range(1,i+1)]
?
例子No4?
#No4 "0001.abadicddws"是ID格式,要求ID格式是以點分割,左邊4位從1開始的整數,右邊是10位隨機小寫英文字母,請依次生成100個ID的列表
import random,string
#["{:0>4}.{}{}{}{}{}{}{}{}{}{}".format(i,*[random.choice(string.ascii_lowercase) for _ in range(10)]) for i in range(1,101)]
#["{:0>4}.{}".format(i,bytes(random.choices(range(97,123),k=10)).decode()) for i in range(1,101)]
["{:0>4}.{}".format(i,"".join(random.choices(string.ascii_lowercase,k=10))) for i in range(1,101)]
?
生成器表達式Generator expression?
?語法?
? (返回值 for 元素 in 可迭代對象 if 條件)使用小括號(),內部是for循環,if條件語句可選,會返回一個生成器對象? 生成器與列表解釋器的區別?
? 生成器表達式是按需計算(或稱為惰性求值、延遲計算),需要的時候才計算值列表解析式是立即返回值? 生成器:是一個可迭代對象。是一個迭代器? 例子:?
? 生成器表達式 g = ( _ for _ in range(10))
print(g)?
key = next(g)? #生成器g游標下移一位。并返回第一個值
for x in g:? # 由于生成器是按需計算,只有當需要對x進行賦值時,才會從生成器g中計算出當前游標對應的值。賦給x
? ? print(x)
print("-----------------")
for x in g:? #注意:生成器游標不能回滾,即后退。生成器只能迭代一次。所以本次迭代沒有數據
print(x)
? 2. 例子3:生成器中的閉包 def getcont():
? ? key = 5
? ? hh = (key+i for i in range(4))
? ? key = 100? #注意此時生成器中的key對應的值會變成100
? ? return hh
hh = getcont()? ## 注意此時生成器中key對應的值變成100,形成閉包。
key = 120 #此時key與hh中生成器的key不同
list(hh)
? ?生成器表達式和列表解析式的區別?
? 計算方式?
? ? 生成器表達式:延遲計算,按需取值。列表解析器:立即計算,得到所有值 內存占用?
? ? 生成器表達式:節約內存,生成器對象是個對象,需要數據時就計算獲取一個值列表解析式:占用內存與數據總量一致。 計算速度:兩者設計思路不一致,沒有可比性。??
集合解析式?
語法?
? {返回值 for 元素 in 可迭代對象 if 條件}使用大括號{},值必須是可哈希,內部是for循環,if條件語句可選,會返回一個集合 用法?
{(x,x+1) for x in range(10)}
{ _ for _ in range(10)}
?
?
字典解析式?
語法?
? {返回值 for 元素 in 可迭代對象 if 條件}使用大括號{},值使用key:value形式定義,key必須是可哈希,內部是for循環,if條件語句可選,會返回一個字典 用法?
dictt1 = { x:x+1 for x in range(10)}
dictt2 = {x:[x+1] for x in range(10)}
dictt3 = {(x,):[x+1] for x in range(10)}
dictt4 = {str(x):[x,x+1] for x in range(10)}
dictt5 = {chr(0x41+x):x**2 for x in range(10)}
print(dictt1,dictt2,dictt3,dictt4,dictt5,sep="\n")??
?
?
總結?
Python2 引入列表解析式Python2.4 引入生成器表達式Python3 引入集合、字典解析式,并遷移到了2.7?
一般來說應該多用解析式,簡短、高效。如果一個解析式非常復雜難讀懂,要考慮使用for循環生成器和迭代器是不同的對象,單都是可迭代對象?
生成器對象—》一定是迭代器—》一定可迭代迭代器:能用next()函數調用取下一個值。是迭代器 —》一定可迭代可迭代對象,不一定是迭代器,也不一定是生成器對象