python 函式高階 列表生成式,生成器,

2022-09-16 19:54:19 字數 2372 閱讀 7614

列表生成式

需求:迴圈0-10,把其中每個值加一並列印

# 文藝青年版

n = list(range(10))

for index, i in enumerate(n):

n[i] += 1

print(n)

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # 執行結果

# 裝逼青年版

n = list(range(10))

print(list(map(lambda x:x+1, n)))

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # 執行結果

# 更加裝逼青年版(列表生成式)

n = [i+1 for i in range(10)]

print(n)

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # 執行結果

列表生成式作用就是在一行內實現對列表的操作,其中 a 可以放任何東西,如字串, 字典,元祖等 , i可以進行普通運算,也可以進行三元運算,比如,實現i< 5, 什麼也不幹,如果i >5, 自己乘自己

n = list(range(10))

a = [i if i < 5 else i*i for i in n]

print(a)

[0, 1, 2, 3, 4, 25, 36, 49, 64, 81] #執行結果

n = 'alex'

n = [i for i in range(10)]

print(n)

['a', 'l', 'e', 'x'] # 執行結果

生成器

生成器特點:

1.要什麼不會立即產生,只能乙個乙個產

2.只能往前走,不能回退

3.走到最後一步的時候,就會報錯

根據上面的需求,以個列表生成器可以生成乙個列表,但是列表的容量是有限的,因為受到記憶體的限制。

如果我要建立乙個包含100w元素的列表,他占用的記憶體很大,而且如果我只需要訪問前面的一些元素,那後面的就白建立了。也就是建立好了列表取值的同時,不是知道什麼時候停,這個方法是直接建立乙個100w資料的列表,然後取的時候乙個乙個取,這種低效浪費空間。現在有個需求,就是滿足我取到著100w個資料而且省空間,就可以先生成乙個1,然後下次呼叫的時候生成2,依次類推,這樣不涉及列表的切片操作,也就是說再呼叫資料之前,不會一次生成100w的資料,但知道資料的規律,知道要什麼資料,然後乙個乙個往上加,就是取得時候直接呼叫乙個公式,每取一次資料加1.

舉例:我現在有乙個工廠,要給使用者提供100w個杯子,使用者給你提供了10%的預付款,你不能就一下子給他產了100w個,要是他只要了1000個,就倒閉了,那你就涼涼了。所以第一種方案可以讓他要幾個你生產幾個,也就是邊取邊生產,這樣的話你就不會有庫存,放到計算機裡邊就是不占用記憶體空間了。這種方法就是生產能力,放到這裡就是這種方法,這種方法需要提前定義好,再python中,這種一邊迴圈一邊計算的方法就是生成器:generator

#原來,列表生成式裡是這麼寫的

a = [i for i in range(5)]

print(a)

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # 執行結果

# 現在

a = (i for i in range(10))

print(a)

at 0x0000023520717c50> # 執行結果

# 生產10個資料的演算法已經存到a裡邊了,也就是說a有生產能力了

#呼叫next(a)

0next(a)

1next(a)

2 # 這裡邊是由序號的

如果生產到一半,使用者不要了,那麼因為你的演算法已經有了。所以直接調就可以了

a

at 0x0000023520717c50>

next(a)

3

但是只能一直往前走,就是往前一直加1,走到最後就會報錯

next(a)

4next(a)

traceback (most recent call last):

file "", line 1, in stopiteration #可以理解成停止生產

生成器的兩種建立方式:

1.列表生成式()

2.函式()

區別:列表生成式最多只能生成乙個複雜的三元運算,涉及到比較複雜的,只能用函式

舉例 : 如果你要開啟乙個用函式定義好的檔案,不能做到先讀一部分然後處理完再讀一部分,這樣用生成器就可以實現,其實在學檔案操作的時候,for迴圈檔案一行一行的讀就是生成器

2 3 13 Python 函式高階 列表生成式

列表生成式即list comprehensions,是python內建的非常簡單卻強大的可以用來建立list的生成式。舉個例子,要生成list 1,2,3,4,5,6,7,8,9,10 可以用list range 1,11 list range 1,11 1,2,3,4,5,6,7,8,9,10 但...

python函式,列表生成式及高階函式

函式 函式生命成後若不呼叫則不會執行 形式引數 位置引數 可變引數 預設引數 關鍵字引數 返回值 返回值為函式運算的結果,返回函式執行結果,可以以與元組形式返回多個返回值 eg def sum a,b return a b result sum 1,2 print result 變數的作用域區域性變...

python高階特性 列表生成式

本文 廖雪峰的官方 列表生成式即list comprehensions,是python內建的非常簡單卻強大的可以用來建立list的生成式。舉個例子,要生成list 1,2,3,4,5,6,7,8,9,10 可以用list range 1,11 list range 1,11 1,2,3,4,5,6,...