Python高階特性

2022-08-17 19:51:17 字數 3808 閱讀 1013

減少**,提高效率

取乙個序列的部分元素

l [ start : end : step ]  含頭不含尾

1

#!/usr/bin/python32#

-*- coding:utf-8 -*-

34 l = [ 1, 3, 6, 9, 45, 66]56

print ( l[:4] ) #等同於l[0:4]

切片下標為 0 ~ 3

7print ( l[-2:] ) #

倒數切片 從倒數第2開始往後切 倒數第

二、倒數第一

8print ( l[:5:2] ) #

前5個數,每2個取乙個

9print ( l[::5] ) #

所有數,每5個取乙個

l[ : : -1]     倒切

在python中,迭代是通過 for...in 來完成的,而很多語言迭代 list 是通過下標完成的。

無論有無下標都可以迭代,如dict

dict不是按順序排列儲存,迭代出的結果順序很可能不一樣

dict預設迭代 key 如要要迭代 value:

同時迭代 key 和 value :

判斷是否可以迭代

迭代是python最強大的功能之一,是訪問集合元素的一種方式。

凡是可作用於for迴圈的物件都是iterable型別,即迭代物件

凡是可作用於next()函式的物件都是iterator型別,即迭代器,表示乙個惰性計算的序列(只有在需要返回下乙個資料時它才會計算)

迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。

迭代器有兩個基本的方法:iter()next()

集合資料型別如list、dict、str等是迭代物件,但不是迭代器,可通過 iter() 函式獲得乙個迭代器物件

字串,列表或元組物件都可用於建立迭代器

迭代器物件可以使用常規for語句進行遍歷:

1

#!/usr/bin/python32#

-*- coding:utf-8 -*-

34 list = [1, 2, 3, 4]

5 it = iter(list) #

建立迭代器物件67

for x in

it:8

print(x, end="

") #

不換行輸出

也可以使用 next() 函式:

1

#!/usr/bin/python32#

-*- coding:utf-8 -*-

34 list = [1, 2, 3, 4]

5 it = iter(list) #

建立迭代器物件67

stopiteration 異常用於標識迭代的完成,防止出現無限迴圈的情況

簡單卻強大的可用來建立list的生成式

如:生成乙個列表 [1x1,  2x2,  3x3,  ...,  10x10]

用迴圈做

1

#!/usr/bin/python32#

-*- coding:utf-8 -*-

34 l =

5for x in range(1,11):

7for i in

l[:]:

8print (i, end = "

")

用列表生成式做

1

#!/usr/bin/python32#

-*- coding:utf-8 -*-

34 l = [ x*x for x in range(1,11)]56

for i in

l[:]:

7print (i, end = "

")

列表生成式內還可加 if 判斷

1

#!/usr/bin/python32#

-*- coding:utf-8 -*-

34 l = [ x*x for x in range(1,11) if x%2 ==0 ]5#

篩選出僅偶數的平方

6for i in

l[:]:

7print (i, end = "

")

還可使用兩層循壞,如生成乙個全排列

1

#!/usr/bin/python32#

-*- coding:utf-8 -*-

34 l = [ m+n for m in

'abc

'for n in

'xyz']

5for i in

l[:]:

6print (i, end = "

")

通過列表生成式,我們可以直接建立乙個列表。但是,受到記憶體限制,列表容量肯定是有限的。而且,建立乙個包含100萬個元素的列表,不僅占用很大的儲存空間,如果我們僅僅需要訪問前面幾個元素,那後面絕大多數元素占用的空間都白白浪費了。

所以,如果列表元素可以按照某種演算法推算出來,那我們是否可以在迴圈的過程中不斷推算出後續的元素呢?這樣就不必建立完整的list,從而節省大量的空間。在python中,這種一邊迴圈一邊計算的機制,稱為生成器:generator。

在 python 中,使用了 yield 的函式被稱為生成器(generator)。

跟普通函式不同的是,生成器是乙個返回迭代器的函式,只能用於迭代操作,更簡單點理解生成器就是乙個迭代器。

在呼叫生成器執行的過程中,每次遇到 yield 時函式會暫停並儲存當前所有的執行資訊,返回 yield 的值, 並在下一次執行 next() 方法時從當前位置繼續執行。

呼叫乙個生成器函式,返回的是乙個迭代器物件。

以下例項使用 yield 實現斐波那契數列:

1

#!/usr/bin/python3

2import

sys3

4def fibonacci(n): #

生成器函式 - 斐波那契

5 a, b, counter = 1, 1, 0

6while

true:

7if (counter >n):

8return

9yield

a10 a, b = b, a +b

11 counter += 1

1213 f = fibonacci(10) #

f 是乙個迭代器,由生成器返回生成

14while

true:

15try:16

print (next(f), end="")

17except

stopiteration:

18 sys.exit()

Python高階特性

l csx sarah tracy bob jack print l 0 l 1 l 2 輸出 csx sarah tracy l 0 3 輸出 csx sarah tracy 如果第乙個索引是0,還可以省略 print l 2 輸出 bob jack print l 2 1 輸出 bob d fo...

Python高階特性

python 高階特性 from collections import iterable from collections import iterator 切片 list切片 l list range 100 print l 0 3 取前3個元素 print l 3 取前3個元素 print l 4...

Python高階特性

切片 slice 非常靈活,體現了python的簡便性 1.取乙個list和tuple的部分元素時的簡化操作 l michael sarah tracy bob jack l 0 3 michael sarah tracy 從0開始不包括3,第乙個索引是0可省略,也支援負數按倒數的順序取值,什麼都不...