高級(jí)特性

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)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容