python初心記錄二

2022-03-09 10:54:05 字數 3377 閱讀 1711

切片

l =[1,2,3,4,5,6,7,8,9,0]

l[0:3]

l[-3]

迭代如果給定乙個list或tuple,我們可以通過for迴圈來遍歷這個list或tuple,這種遍歷我們稱為迭代(iteration)。

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

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

列表生成式

列表生成式即list comprehensions,是python內建的非常簡單卻強大的可以用來建立list的生成式。

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

>>> l = 

>>> for x in range(1, 11):

...>>> 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]

生成器

python中,這種一邊迴圈一邊計算的機制,稱為生成器:generator。

要建立乙個generator,有很多種方法。第一種方法很簡單,只要把乙個列表生成式的改成(),就建立了乙個generator:

>>> l = [x * x for x in range(10)]

>>> l

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

>>> g = (x * x for x in range(10))

>>> g

at 0x1022ef630>

建立lg的區別僅在於最外層的()l是乙個list,而g是乙個generator。

我們可以直接列印出list的每乙個元素,但我們怎麼列印出generator的每乙個元素呢?

如果要乙個乙個列印出來,可以通過next()函式獲得generator的下乙個返回。

generator是非常強大的工具,在python中,可以簡單地把列表生成式改成generator,也可以通過函式實現複雜邏輯的generator。

要理解generator的工作原理,它是在for迴圈的過程中不斷計算出下乙個元素,並在適當的條件結束for迴圈。對於函式改成的generator來說,遇到return語句或者執行到函式體最後一行語句,就是結束generator的指令,for迴圈隨之結束。

請注意區分普通函式和generator函式,普通函式呼叫直接返回結果:

>>> r = abs(6)

>>> r

6

generator函式的「呼叫」實際返回乙個generator物件:

>>> g = fib(6)

>>> g

迭代器

可以直接作用於for迴圈的資料型別有以下幾種:

一類是集合資料型別,如listtupledictsetstr等;

一類是generator,包括生成器和帶yield的generator function。

這些可以直接作用於for迴圈的物件統稱為可迭代物件:iterable

可以使用isinstance()判斷乙個物件是否是iterable物件。

凡是可作用於for迴圈的物件都是iterable型別;

凡是可作用於next()函式的物件都是iterator型別,它們表示乙個惰性計算的序列;

集合資料型別如listdictstr等是iterable但不是iterator,不過可以通過iter()函式獲得乙個iterator物件。

python的for迴圈本質上就是通過不斷呼叫next()函式實現的,例如:

for x in [1, 2, 3, 4, 5]:

pass

實際上完全等價於:

# 首先獲得iterator物件:

it = iter([1, 2, 3, 4, 5])

# 迴圈:

while true:

try:

# 獲得下乙個值:

x = next(it)

except stopiteration:

# 遇到stopiteration就退出迴圈

break

函式式程式設計

函式是python內建支援的一種封裝,我們通過把大段**拆成函式,通過一層一層的函式呼叫,就可以把複雜任務分解成簡單的任務,這種分解可以稱之為面向過程的程式設計。函式就是面向過程的程式設計的基本單元。

高階函式

變數可以指向函式

函式名也是變數

python學習記錄(二)

物件 名字和變數 python是強型別的,你永遠無法修改乙個已有物件的型別。python中的變數有乙個非常重要的性質 它僅僅是乙個名字。類似c語言指標 名字是物件的引用而不是物件本身。type thing 了解乙個物件的型別。python中 類和型別不加區分。用來執行浮點除法,用來執行整數除法。為冪...

python 學習筆記記錄(二)

號表示之後的字元為python的注釋 換行 n 是標準的行分隔符 通常乙個語句一行 反斜槓 繼續上一行 分號 將兩個語句連線在一行中 冒號 將 塊的頭和體分開 語句 塊 用縮排塊的方式體現 不同的縮排的深度分隔不同的 塊 python檔案以模組的形式組織 在python 語言中,物件是通過引用傳遞的...

C 高階與初心 (二)P Invoke平台呼叫

最近某個專案要採集交易終端的資訊用於監管,主要廠商給出了api,c 版的。開啟hard模式!c 呼叫c 的dll基本就兩種方法 加乙個vc 專案包一層,或者使用p invoke 平台呼叫 前者對於純c 的客戶端來說,增加了複雜性。那就只剩下平台呼叫了。使用平台呼叫的過程比較艱辛,主要遇到了兩個問題 ...