1. 程式人生 > >python中的高階特性

python中的高階特性

迭代

迭代可以對list,tuple和str等型別的資料進行操作,如何判斷一個數據是否可以迭代:

>>> from collections import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代
True
>>> isinstance([1,2,3], Iterable) # list是否可迭代
True
>>> isinstance(123, Iterable) # 整數是否可迭代
False
list中如何實現如Java一樣的下標:使用Python中的內建enumerate函式:
a = [1,2,3]
b = ['a','b','c']
c = 'ABC'
for i , value in enumerate(a):
    print(i,value)
>>>0 1
>>>1 2
>>>2 3
列表生成式

帶if的列表生成式,在生成list時候,進行篩選:

>>>[x*x for i in range(1,11) if i%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']
生成器

為了不佔用很大的記憶體空間,在Python中,有種一邊迴圈一邊計算的機制,稱為生成器:generator

建立generator,只需把列表生成器的[]改為()即可:

g = ( x*x for x in range(10))
next(g)
>>>0
next(g)
>>>1
...
使用for迴圈也可以將g全部輸出:
for n in g:
    print(n)
>>>0
1
4
9
16
25
36
49
64
81
另一種定義生成器的方法就是:函式中的yield關鍵字,該函式為一個generator。則在執行過程中遇到yield就進行返回。
def test():
    print("step1:")
    yield 'a'
    print("step2:")
    yield 'b'
    print("step3:")
    yield 'c'
    print("step4:")
    yield 'd'
    return 'over'
    
for x in test():
    print(x)
>>>step1:
a
step2:
b
step3:
c
step4:
d
但是不能輸出返回語句,如果想要拿到返回值,必須捕獲StopIteration錯誤,返回值包含在StopIterationvalue,需進行改寫:
x = test()    
while 1:
    try:
        print(next(x))
    except StopIteration as e:
        print(e.value)
        break
>>>
step1:
a
step2:
b
step3:
c
step4:
d
over
【注】最後的break如果忘記的話會形成死迴圈!!!