列表解析式是一種利用 [ 表達式 + for 循環 [ + if判斷 ] ] 快速生成列表對象的python語法,方便使用者快速構建列表。
語法:python
# 列表解析式 第一種效率會明顯高於第二種 [(i,j) for i in range(1000) if i > 700 for j in range(1000) if j > 900] [{i,j} for i in range(1000) for j in range(1000) if j>900 if i > 700]
# 注:其中的元素必須可哈希,不容許是列表,字典,set()等不可哈希對象,不然將會報錯 { (i,j) for i in range(1000) if i > 700 for j in range(1000) if j > 900 }
it = (i for i in range(10)) #將會返回一個生成器對象
一個能夠作指定操做,並在每次next()時返回一個值的對象,節省空間存放數據,但每次計算須要等待.ide
一個能夠被迭代的對象,for 將會所有迭代其中的元素,也可以使用next()一個個取值返回,迭代器只能夠使用一輪,沒法反覆使用,生成器也是一個迭代器函數
能夠被迭代的對象,例如元組,字典,集合,列表等容器,生成器和迭代器也是可迭代對象編碼
# len():返回集合類型的長度,注:沒法計算生成器或迭代器的長度,可計算list,set,dict等集合的長度 # len((i for i in range(5))) # ==> TypeError:object of type 'generator' has no len() 計算生成器的長度 isinstance(True, int), issubclass(bool, int) # 實例判斷,子類判斷 divmod(124,3) # ==> (124/3, 124%3)==(41, 1) chr(97) # ==> int(0-255) --> char ord("a") # ==> char --> int hex(ord("中")) # 中文使用的是unicode編碼表對應關係, 兩字節長度 '0x4e2d' # 排序 迭代內部容器,默認升序並返回排序後的列表,set和dict也可排序,迭代器也可排序 sorted([1,2,3] + ['a'],reverse=True, key=str ) # 臨時轉化類型進行比較,原值不會改變,123仍是int類型 ['a', 3, 2, 1] a = iter("abcd") # 對迭代器排序,會遍歷整個迭代器,返回一個排序好的列表; sorted(a) # ['a', 'b', 'c', 'd']
返回迭代器的BIFcode
# reversed(seq) # 翻轉一個有序容器,set和dict沒法翻轉 ==> 返回一個翻轉後的迭代器,單個對象 [ i for i in reversed("abcd") ] # ==> ['d', 'c', 'b', 'a'] it = reversed(sorted({1,49,0,6,7,8,})) # ==> <list_reverseiterator at 0x212dce3ccf8> print( [ i for i in it ] ) # 遍歷迭代器 [49, 8, 7, 6, 1, 0] # 枚舉:enumerate(seq, start=0) # ==> 返回一個迭代器,每次返回一個二元組==> (index, elem) en = enumerate([1,2,3,4,5]) next(en) # ==> (0, 1) next(en) # ==>(1, 2) print([i for i in en]) # [(2, 3), (3, 4), (4, 5)] 徹底遍歷 # 迭代器 iter(iterable) # ==> 返回一個迭代器 iter(callable, sentinel) # ==> iterator def fun(): x = 0 def fun1(): nonlocal x x += 1 return x return fun1 f = fun() it = iter(f, 7) # == > f 必須可調用,0參,當返回值等於 sentinel 結束 [i for i in it] # == > [1,2,3,4,5,6] # 文件讀取操做時的使用 with open('mydata.txt') as fp: for line in iter(fp.readline, ''): process_line(line) from functools import partial with open('somefile.data', 'rb') as f: records = iter(partial(f.read, RECORD_SIZE), b'') for r in records: pass # iter() 函數有一個不爲人知的特性,若是你給它傳遞一個可調用對象和一個標記值,它 # 會建立一個迭代器。這個迭代器會一直調用傳入的可調用對象直到它返回標記值爲止 # 可迭代對象,包括:set, dict, 生成器,string,range(), # in, not in # 執行in操做,對於線性順序結構來講,本質上就是對其進行遍歷 # 生成器和迭代器也能夠進行 in 操做 a = iter("abcd") "a" in a # ==> True, 遍歷到第一個元素找到 "a", 迭代器爲使用完,能夠繼續使用 next(a) # ==> 繼續使用返回下一個 ==> 'b' # zip() for i in zip(range(5), "abcde"): print(i ,end=" ") #==> (0, 'a') (1, 'b') (2, 'c') (3, 'd') (4, 'e')輸出結果使用enumerate()同樣