用到函式的乙個常見操作是將其用於乙個列表的所有項,並使用結果來建立乙個新的列表。如果我們要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]能用哪種方法呢?當然最基礎的方法可以參見列表(上)但是,這種只適合項比較少的一些場景,現在我們要生成1到999的列表怎麼辦呢?
list(range(1,11)) #生成的結果不包含11,只是1到10的區間,前開後閉
接下來再加點複雜的成分,生成乙個[1x1, 2x2, 3x3, …, 10x10]這樣的列表怎麼做呢?
#方法一:
l =
for x in range(1, 11)
#方法二:
l = [x * x for x in range(1, 11)]
#還可以加上if判斷做篩選
l = [x * x for x in range(1, 11) if x % 2 != 0] #篩選出奇數的平方
l = [x * x for x in range(1, 11) if x % 2 == 0] #篩選出偶數的平方
#除了生成上述列表外,還可以列出當前目錄下的所有檔案和目錄名,通過一行**實現:
import os
p = [d for d in os.listdir('.')]
#將字典轉換為列表
dict1 =
t = [a + '=' + b for a , b in dict1.items()]
print(t)
[expression for item1 in iterable1 if condition1
for item2 in iterable2 if condition2
...for itemn in iterablen if conditionn]
if子句是可選的,但是如果使用它,那麼只有condition為真的時候才會對expression求值並新增到結果中
生成器表示式是乙個物件,它執行的計算與列表推導相同,但是迭代地生成結果。他的語法也是與列表推導相同,但是要用元括號替代方括號。當然和列表推導不同的是,生成器表示式不會建立序列形式的物件。你不能對它進行任何索引,也不能進行任何常規操作。但是使用內建的list()函式可以將生成器表示式轉換為列表。clist = list(comments)和列表推導不同,生成器表示式實際上不建立列表或者立即對圓括號內的表示式求值。相反,它會建立乙個生成器物件,該物件通過迭代並按照需要生成值,如下**:
a = [1, 2, 3, 4]
b = (10 * i for i in a)
>>> b.__next__()
10>>> b.__next__()
20>>> b.__next__()
30>>> b.__next__()
40
生成器表示式的一些實戰用法
#讀取乙個檔案
f = open("data.txt") #開啟乙個檔案
lines = (t.strip() for t in f) #讀取行,並刪除前後空白
comments = (t for t in lines if t[0] == '#') #所有注釋
for c in comments:
print(c)
在這段**中生成器表示式提取各行並刪除其中空白,但它實際上沒有將整個檔案讀取到記憶體中。提取注釋的表示式也是如此。相反,當程式開始在for迴圈中進行迭代時,才會去讀取檔案的各行。在這個迭代的過程中,每一行都是按需生成的,按條件進行過濾。事實上,該過程從未把整個檔案載入到記憶體中。因此,這是一種從gb級別大小的python原始檔中提取注釋的高效方法。. python 自學筆記(四) 列表
有幾天沒有更新部落格了,畢竟是自學,最近事情確實比較多,有時候想學的時候反而沒時間,到有時間的時候反而不想學。以後得想辦法改掉這個缺點,只要有時間就要學習自己想學的東西,希望自學的同學能和我共同交流,其實我自學的道路非常孤獨,我也希望在學習的道路有個朋友。今天學習一下 python的列表,以後可能還...
html自學筆記五 列表
前言 這一節學習列表內容,列表分為無序列表和有序列表 無序列表 有序列表 列表項1li 列表項1li 列表項1li 列表項1li 列表項1li 列表項1li ul type circle 列表項1li 列表項1li 列表項1li 列表項1li 列表項1li 列表項1li ul type square...
vue 自學筆記 5 列表渲染
列表渲染 一 v for 指令 當我們涉及到列表渲染資料的時候,不可能做乙個重複的工作去不停的乙個乙個的渲染每一項列表。並且列表資料的表現,比如從後端請求過來的資料,不可能是乙個乙個的單獨的 json 資料,通常會是乙個陣列或者物件。針對這樣的情景,vue 提供了v for指令使列表使我們可以根據一...