1、切片:slice操作符
L[0:3] #從0開始,0可以省略
L[:3]
L = ['Michael','Sarah','Tracy','Bob','Jack']
>>>L[-2:]
['Bob', 'Jack']
>>>L[-2:-1]
['Bob']
前10個(gè)數(shù),每兩個(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]
甚至什么都不寫,只寫[:]就可以原樣復(fù)制一個(gè)list:
>>>L[:]
[0, 1, 2, 3, ..., 99]
**利用切片操作,實(shí)現(xiàn)一個(gè)trim()函數(shù),去除字符串首尾的空格,注意不要調(diào)用str的strip()方法
迭代
for key in 集合:
for value in 集合.values():
for k,v in 集合.items():
如何判斷一個(gè)對(duì)象是迭代對(duì)象:
from? collections? import? Iterable
>>> isinstance('abc', Iterable)# str是否可迭代
eg:使用迭代找最大最小值,并返回Tuple
if L!=[] :
? ? ? ? (min,max)=(L[0],L[0])
? ? ? ? for x in L :
? ? ? ? ? ? if x<min :
? ? ? ? ? ? ? ? min=x
? ? ? ? ? ? if x>max :
? ? ? ? ? ? ? ? max=x
? ? ? ? return (min,max)
? ? else :
? ? ? ? return (None,None)
print(findMinAndMax([7,3,1,9,5]))
列表生成器:
練習(xí):
#L2=[x.lower() for x in L1 if isinstance(x,str)]
L2=[x.lower() if isinstance(x,str) else -1 for x in L1]
>>> [m + n form in 'ABC' form in' XYZ']['AX','AY','AZ','BX','BY','BZ','CX','CY','CZ']
>>> L = ['Hello','World','IBM','Apple']
>>> [s.lower() for s in? L]
['hello','world','ibm','apple']
if ... else
使用列表生成式的時(shí)候,有些童鞋經(jīng)常搞不清楚if...else的用法。
例如,以下代碼正常輸出偶數(shù):
>>> [x for x in range(1,11)? if x %2==0]
[2,4,6,8,10]
但是,我們不能在最后的if加上else:
>>> [xforxinrange(1,11)ifx %2==0else0]? File"<stdin>", line1[xforxinrange(1,11)ifx %2==0else0]? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ^SyntaxError: invalid syntax
這是因?yàn)楦趂or后面的if是一個(gè)篩選條件,不能帶else,否則如何篩選?
另一些童鞋發(fā)現(xiàn)把if寫在for前面必須加else,否則報(bào)錯(cuò):
>>> [xifx %2==0forxinrange(1,11)]? File"<stdin>", line1[xifx %2==0forxinrange(1,11)]? ? ? ? ? ? ? ? ? ? ? ^SyntaxError: invalid syntax
這是因?yàn)閒or前面的部分是一個(gè)表達(dá)式,它必須根據(jù)x計(jì)算出一個(gè)結(jié)果。因此,考察表達(dá)式:x if x % 2 == 0,它無法根據(jù)x計(jì)算出結(jié)果,因?yàn)槿鄙賓lse,必須加上else:
>>> [xifx %2==0else-xforxinrange(1,11)][-1,2, -3,4, -5,6, -7,8, -9,10]
上述for前面的表達(dá)式x if x % 2 == 0 else -x才能根據(jù)x計(jì)算出確定的結(jié)果。
可見,在一個(gè)列表生成式中,for前面的if ... else是表達(dá)式,而for后面的if是過濾條件,不能帶else。
isinstance(x,str) #判斷是不是字符串
def trim(s):
l=len(s)
? ? if l==0 :
? ? ? ? return s
? ? elif s[0]==' ' :
? ? ? ? return trim(s[1:])? ?#trim()去除首尾空格
? ? elif s[-1]==' ' :?
? ? ? ? return trim(s[:-1])
? ? return s
print(trim(' hello'))
print(trim('hello '))
print(trim(' hello '))
生成器(generator)
g=(x for x in range(10))
next(g)#計(jì)算打印出下下個(gè)元素
#沒有更多的元素時(shí),拋出StopIteration的錯(cuò)誤。
也可以使用迭代:
for x in g :
? ? print(x)
yeid簡單理解:
帶有 yield 的函數(shù)不再是一個(gè)普通函數(shù),而是一個(gè)生成器generator,可用于迭代,工作原理同上。
yield 是一個(gè)類似 return 的關(guān)鍵字,迭代一次遇到y(tǒng)ield時(shí)就返回yield后面(右邊)的值。重點(diǎn)是:下一次迭代時(shí),從上一次迭代遇到的yield后面的代碼(下一行)開始執(zhí)行。
用isinstance()判斷一個(gè)對(duì)象是否是Iterable(可迭代)對(duì)象
用isinstance()判斷一個(gè)對(duì)象是否是Iterable對(duì)象
可以被next()函數(shù)調(diào)用并不斷返回下一個(gè)值的對(duì)象稱為迭代器:Iterator
可以直接作用于for循環(huán)的對(duì)象統(tǒng)稱為可迭代對(duì)象:Iterable
生成器都是Iterator對(duì)象,但list、dict、str雖然是Iterable,卻不是Iterator。
把list、dict、str等Iterable變成Iterator可以使用iter()函數(shù):
iter('abc',lterator)
Iterator甚至可以表示一個(gè)無限大的數(shù)據(jù)流
變量可以指向函數(shù)
函數(shù)名也是變量
傳入函數(shù)
def? add(x, y, f):? ?#高階函數(shù)
? ? returnf(x) + f(y)
add(-5,6,abs)
f=abs
f(x)+f(y)=f(-5)+f(6)=11
map(函數(shù)本身,迭代對(duì)象)
def f(x):
? ? return x*x
stu=map(f,[1,23,34])
list(stu)
reduce(f,[x1,x2,x3,x4,x5])=f(f(f(f(x1,x2)x3)x4)x5)
def add(x,y)
? ? retuurn x+y
reduce(add,[1,3,6,9])
def normalize(name):
? ? name=name[0].upper() + name[1:].lower() #首字符大寫,其他字符小寫
? ? return name
? ? L1=['adam','LISA','barT']
? ? L2=list(map(normalize,L1))
? ? print(L2)
def not_emtpy(s):
? ? return s and s.strip()
filter(函數(shù),序列)
list(filter(not_emtpy,['a',' ','c',' ',' ']))
注意到filter()函數(shù)返回的是一個(gè)Iterator,也就是一個(gè)惰性序列,所以要強(qiáng)迫filter()完成計(jì)算結(jié)果,需要用list()函數(shù)獲得所有結(jié)果并返回list
sorted(list或key)排序
>>> sorted([36,5, -12,9, -21], key=abs)[5,9, -12, -21,36]
key=str.lower()#忽略大小寫
反向排序:
sorted([list],key=str.lower()/upper(),reverse=True)
返回函數(shù)不要引用任何循環(huán)變量,或者后續(xù)會(huì)發(fā)生變化的變量。
關(guān)鍵字lambda表示匿名函數(shù),冒號(hào)前面的x表示函數(shù)參數(shù)。
匿名函數(shù)
L=list(filter(lambda n: n%2==1,range(1,20)))
**裝飾器
函數(shù)名._name_? ? ? ?#打印函數(shù)名
定義:需要增強(qiáng)一個(gè)函數(shù)的功能,在函數(shù)調(diào)用前后自動(dòng)打印日志,又不修改函數(shù)本身的定義,這種在代碼運(yùn)行期間動(dòng)態(tài)增加功能的方式,叫裝飾器(Decorator)