3.22 爬蟲小記

伊念發表於2019-03-22

今天刷視訊的時候發現有些語法細節忘記了,隨手一記:

在文字編輯器中,需要設定把Tab自動轉換為4個空格,確保不混用Tab和空格。

整數運算永遠是精確的(除法難道也是精確的?是的!),而浮點數運算則可能會有四捨五入的誤差。

如果字串裡面有很多字元都需要轉義,就需要加很多\,為了簡化,Python還允許用r''表示''內部的字串預設不轉義,

print('\\t\') \ \

print(r'\\t\') \\t\

上面是在互動式命令列內輸入,注意在輸入多行內容時,提示符由>>>變為...,提示你可以接著上一行輸入,注意...是提示符,不是程式碼的一部分

│>>> print('''line1
... line2
... line3''')
line1
line2
line3

│>>> _

Python的整數沒有大小限制,Python的浮點數也沒有大小限制,但是超出一定範圍就直接表示為inf(無限大)。

預設情況下,dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同時迭代key和value,可以用for k, v in d.items()。

由於字串也是可迭代物件,因此,也可以作用於for迴圈:

因為dict的儲存不是按照list的方式順序排列,所以,迭代出的結果順序很可能不一樣。

預設情況下,dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同時迭代key和value,可以用for k, v in d.items()。

由於字串也是可迭代物件,因此,也可以作用於for迴圈:

for ch in 'ABC': ... print(ch) ... A B C

所以,當我們使用for迴圈時,只要作用於一個可迭代物件,for迴圈就可以正常執行,而我們不太關心該物件究竟是list還是其他資料型別。

通過collections模組的Iterable型別判斷一個物件是可迭代物件:

from collections import Iterable isinstance('abc', Iterable) # str是否可迭代 True

isinstance([1,2,3], Iterable) # list是否可迭代 True

isinstance(123, Iterable) # 整數是否可迭代 False

Python內建的enumerate函式可以把一個list變成索引-元素對,這樣就可以在for迴圈中同時迭代索引和元素本身:

for i, value in enumerate(['A', 'B', 'C']): ... print(i, value) ... 0 A 1 B 2 C 上面的for迴圈裡,同時引用了兩個變數,在Python裡是很常見的:

for x, y in [(1, 1), (2, 4), (3, 9)]: ... print(x, y) ... 1 1 2 4 3 9

但如果要生成[1x1, 2x2, 3x3, ..., 10x10]怎麼做?方法一是迴圈:

L = [] for x in range(1, 11): ... L.append(x * x) ...

L [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

但是迴圈太繁瑣,而列表生成式則可以用一行語句代替迴圈生成上面的list:

[x * x for x in range(1, 11)] [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

寫列表生成式時,把要生成的元素x * x放到前面,後面跟for迴圈,就可以把list建立出來 for迴圈後面還可以加上if判斷,這樣我們就可以篩選出僅偶數的平方:

[x * x for x in range(1, 11) if x % 2 == 0] [4, 16, 36, 64, 100] 還可以使用兩層迴圈,可以生成全排列:

[m + n for m in 'ABC' for n in 'XYZ'] ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ'] 三層和三層以上的迴圈就很少用到了。

for迴圈其實可以同時使用兩個甚至多個變數,比如dict的items()可以同時迭代key和value:

d = {'x': 'A', 'y': 'B', 'z': 'C' } for k, v in d.items(): ... print(k, '=', v) ... y = B x = A z = C

相關文章