高級(jí)特性
通過(guò)python的數(shù)據(jù)類型刀疙、語(yǔ)句和函數(shù),可以編寫程序扫倡。
構(gòu)造1-99的列表谦秧,可以通過(guò)循環(huán)實(shí)現(xiàn):
L=[]
n=1
while n<=99:
????L.append(n)
? ? n=n+2
切片
>>> L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
>>>L[0:3] (從索引0開(kāi)始取,取3個(gè)元素)
['Michael', 'Sarah', 'Tracy']
>>>L[:3]? (也可以省略0,默認(rèn)從頭開(kāi)始扔凸弧)?
>>>L[-2:]? (倒數(shù)第二個(gè)開(kāi)始取蚁袭,取到最后)
['Bob', 'Jack']
>>>L[-2:-1]? (倒數(shù)第二個(gè)取征懈,取1個(gè)元素)
['Bob']
>>> L = list(range(100))
>>> L
[0,1,2,3, ...,99]
前十個(gè)數(shù):
>>>L[:10]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
后十個(gè)數(shù):
>>>L[-10:]
[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
前10個(gè)數(shù)石咬,每?jī)蓚€(gè)取一個(gè):
>>>L[:10:2]
[0, 2, 4, 6, 8]
所有數(shù),每5個(gè)取一個(gè):
>>>L[::5]
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]
作業(yè)
去掉空格
def trim(s)
? ? while s==None:
? ? ? ? return '測(cè)試失敗'
? ? while s[:1] == ' ':
? ? ? ? s = s[1:]
? ? while s[-1:] == ' ':
? ? ? ? s = s[:-1]
? ? return s
迭代
通過(guò)for循環(huán)來(lái)遍歷list或tuple
dict也可以迭代卖哎。因?yàn)閐ict的存儲(chǔ)不是按照l(shuí)ist的方式順序排列鬼悠,所以,迭代出的結(jié)果順序很可能不一樣亏娜。
>>> d = {'a':1,'b':2,'c':3}
>>> for key in d:
... ????????print(key)
...
a
c
b
默認(rèn)情況下焕窝,dict迭代的是key。如果要迭代value维贺,可以用for value in d.values()它掂,如果要同時(shí)迭代key和value,可以用for k, v in d.items()
字符串的迭代
>>> for ch in 'ABC':
... ????????print(ch)
...
A
B
C
判斷是否為可迭代對(duì)象?collections模塊的Iterable類型判斷
>>> from collections import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代
True
>>> isinstance([1,2,3], Iterable) # list是否可迭代
True
>>> isinstance(123, Iterable)? # 整數(shù)是否可迭代
False
enumerate函數(shù)可以把一個(gè)list變成索引-元素對(duì)
>>> for i, value in enumerate(['A','B','C']):
... print(i, value)
...
0 A
1 B
2 C
同時(shí)引用兩個(gè)變量
>>>for x,y in [(1,1),(2,4),(3,9)]:
...? ? ? ? print(x,y)
...
1 1
2 4
3 9
作業(yè)
def?findMinAndMax(L):
????if?L==[]:
????????return(None,None)
????max=min=L[0]
????for?n?in?L:
????????if?n>max:
????????????max=n?
????????if?n<min:
????????????min=n?
????return(min,max)
列表生成式
生成list?[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用list(range(1, 11))
>>>list(range(1, 11))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
生成平方數(shù)溯泣。方法一(循環(huán)):
>>> L=[]
>>> for x in range(1,11):
...? ? L.append(x*x)
...
>>> L
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
方法二(列表生成式代替循環(huán)生成上面的list):
>>> [x*x for x in range(1,11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
寫列表生成式時(shí)虐秋,把要生成的元素x * x放到前面,后面跟for循環(huán)垃沦,就可以把list創(chuàng)建出來(lái)
加上if判斷客给,這樣我們就可以篩選出僅偶數(shù)的平方:
>>> [x*x for x in range(1,11) if x%2==0]
[4, 16, 36, 64, 100]
使用兩層循環(huán):
>>> [m+n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
同時(shí)迭代key和value:
>>> d={'x':'A','y':'B','z':'C'}
>>> [k+ '='+ v for k, v in d.items()]
['x=A', 'y=B', 'z=C']
最后把一個(gè)list中所有的字符串變成小寫/大寫:
>>> L=['LESLIE','IS','SO','CUTE']
>>> [s.lower() for s in L]
['leslie', 'is', 'so', 'cute']
>>> L=['leslie', 'is', 'so', 'cute']
>>> [s.upper() for s in L]
['LESLIE', 'IS', 'SO', 'CUTE']
不能在最后的if加上else:
>>> [x for x in range(1,11) if x %2==0 else 0]?
?File"<stdin>", line1
????[x for x in range(1,11) if x %2==0 else 0]?
?SyntaxError: invalid syntax
把if寫在for前面必須加else,否則報(bào)錯(cuò):
>>> [x if x %2==0 for x in range(1,11)]?
File"<stdin>", line1
????[x if x %2==0 for x in range(1,11)]?
SyntaxError: invalid syntax
for前面的if要加else:
>>> [x if x %2==0 else -x for x in range(1,11)]
[-1,2, -3,4, -5,6, -7,8, -9,10]
在一個(gè)列表生成式中肢簿,for前面的if ... else是表達(dá)式靶剑,而for后面的if是過(guò)濾條件,不能帶else池充。
作業(yè)
L1?=?['Hello',?'World',?18,?'Apple',?None]
L2=[x.lower()?for?x?in?L1?if?isinstance(x,str)==True]
print(L2)
生成器
一邊循環(huán)一邊計(jì)算的機(jī)制桩引,稱為生成器:generator
創(chuàng)建generator? 方法一:
把一個(gè)列表生成式的[]改成(),就創(chuàng)建了一個(gè)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
<generator object <genexpr> at 0x00000217AB9E46D0>
generator保存的是算法收夸,每次調(diào)用next(g)阐污,就計(jì)算出g的下一個(gè)元素的值,直到計(jì)算到最后一個(gè)元素咱圆,沒(méi)有更多的元素時(shí)笛辟,拋出StopIteration的錯(cuò)誤
>>> g=(x*x for x in range(10))
>>> for n in g:
...? ? print(n)
...
0
1
4
9
16
25
36
49
64
81
斐波那契數(shù)列數(shù)列
def?fib(max):
????n,a,b=0,0,1
????while?n<max:
????????print(b)
????????a,b=b,a+b? #(b,a+b)是一個(gè)tuple
????????n=n+1
????return'done'
把print(b)改為yield b, fib函數(shù)變成generator
楊輝三角作業(yè)
def?triangles():
????L=[1]
????while?true:
????????yield?L
????????L=[1]+[L[n]+L[n+1]?for?n?in?range(len(L)-1)]+[1]
疑問(wèn)
程序?qū)懲炅耍绾屋敵鲂蛩眨坑只蛘呤钦f(shuō)不同情況下怎么輸出手幢?有何不同?
迭代器
用于for循環(huán)的數(shù)據(jù)類型:
集合數(shù)據(jù)類型:list忱详、tuple围来、dict、set、str等
generator:生成器和帶yield的generator function
可以直接作用于for循環(huán)的對(duì)象統(tǒng)稱為可迭代對(duì)象:Iterable
可以使用isinstance()判斷一個(gè)對(duì)象是否是Iterable對(duì)象:
>>> from collections.abc import Iterable
>>> isinstance([], Iterable)
????????True
>>> isinstance({}, Iterable)
????????True
>>> isinstance('abc', Iterable)
????????True
>>> isinstance((x for x in range(10)), Iterable)
????????True
>>> isinstance(100, Iterable)
????????False
生成器都是Iterator對(duì)象监透,但list桶错、dict、str雖然是Iterable胀蛮,卻不是Iterator院刁。
疑問(wèn)
這是因?yàn)镻ython的Iterator對(duì)象表示的是一個(gè)數(shù)據(jù)流,Iterator對(duì)象可以被next()函數(shù)調(diào)用并不斷返回下一個(gè)數(shù)據(jù)粪狼,直到?jīng)]有數(shù)據(jù)時(shí)拋出StopIteration錯(cuò)誤退腥。可以把這個(gè)數(shù)據(jù)流看做是一個(gè)有序序列再榄,但我們卻不能提前知道序列的長(zhǎng)度狡刘,只能不斷通過(guò)next()函數(shù)實(shí)現(xiàn)按需計(jì)算下一個(gè)數(shù)據(jù),所以Iterator的計(jì)算是惰性的困鸥,只有在需要返回下一個(gè)數(shù)據(jù)時(shí)它才會(huì)計(jì)算嗅蔬。(?)