本篇內(nèi)容介紹了“Python解析式有哪些”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
為贛縣等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及贛縣網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、贛縣網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
在python中經(jīng)常能夠看到形如ret = [x ** 2 for x in lst]這樣的賦值語句,對(duì)于從C++轉(zhuǎn)到python的人不太容易理解這種for循環(huán)的使用,這就是python為了簡潔而發(fā)明的新語法。python解析式有以下優(yōu)點(diǎn):
代碼簡潔,可讀性強(qiáng)
效率比普通迭代稍高
python的解析式具體分為以下四種:
列表解析式
生成器解析式
集合解析式
字典解析式
下面分別介紹這四種解析式的使用。
列表解析式的形式
[expr for e in iterator]
In [1]: lst = range(10) In [2]: %%timeit ...: ret = [x ** 2 for x in lst] ...: 100000 loops, best of 3: 5.28 μs per loop In [3]: %%timeit ...: ret = [] ...: for x in lst: ...: ret.append(x ** 2) ...: 100000 loops, best of 3: 6.09 μs per loop # 耗時(shí)稍高
可以發(fā)現(xiàn)效率是要稍高一點(diǎn),最主要的還是代碼簡潔。
列表解析式可以和if語句一起使用
例如篩選出列表lst中的偶數(shù):
In [4]: ret = [] In [5]: for x in lst: ...: if x % 2 == 0: ...: ret.append(x) # 使用for循環(huán) ...: In [6]: ret Out[6]: [0, 2, 4, 6, 8] In [7]: ret = [x for x in lst if x % 2 == 0] # 使用列表解析式 In [8]: ret Out[8]: [0, 2, 4, 6, 8]
列表解析式可以像for循環(huán)一樣使用if語句。
帶多個(gè)if語句的,都可以轉(zhuǎn)化為條件的邏輯運(yùn)算, 所以一般來說,不會(huì)帶多個(gè)if語句
列表解析式的for語句可以嵌套。
In [9]: (x, y) for x in range(0, 5) for y in range(5, 10) File "", line 1 (x, y) for x in range(0, 5) for y in range(5, 10) ^ SyntaxError: invalid syntax # 說明列表解析式一定要使用中括號(hào)括起來 In [10]: [(x, y) for x in range(5) for y in range(5, 10)] Out[10]: [(0, 5), (0, 6), (0, 7), (0, 8), (0, 9), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (2, 5), (2, 6), (2, 7), (2, 8), (2, 9), (3, 5), (3, 6), (3, 7), (3, 8), (3, 9), (4, 5), (4, 6), (4, 7), (4, 8), (4, 9)] In [11]: ret = [] In [12]: for x in range(5): ...: for y in range(5, 10): ...: ret.append((x, y)) ...: In [13]: ret Out[13]: [(0, 5), (0, 6), (0, 7), (0, 8), (0, 9), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (2, 5), (2, 6), (2, 7), (2, 8), (2, 9), (3, 5), (3, 6), (3, 7), (3, 8), (3, 9), (4, 5), (4, 6), (4, 7), (4, 8), (4, 9)]
if語句的特殊用法
單行if語句的寫法和列表解析式很像。
表達(dá)式形式:x if cond else y
if和else必須同時(shí)存在。
下面以偶數(shù)求平方,奇數(shù)求立方為例進(jìn)行演示
In [14]: ret = [] In [15]: for x in lst: ...: if x % 2 == 0: ...: ret.append(x ** 2) ...: else: ...: ret.append(x ** 3) ...: In [16]: ret Out[16]: [0, 1, 4, 27, 16, 125, 36, 343, 64, 729] In [17]: x = 3 # if特殊用法 In [18]: x ** 2 if x % 2 == 0 else x ** 3 Out[18]: 27 In [19]: 3 if True else 4 Out[19]: 3 # 如果采用if特殊用法配合列表解析式 x if cond else y for ... In [20]: [x ** 2 if x % 2 == 0 else x ** 3 for x in lst] Out[20]: [0, 1, 4, 27, 16, 125, 36, 343, 64, 729]
列表解析式返回的是一個(gè)列表,而生成器解析式返回的是一個(gè)解析式。列表解析式的中括號(hào)變成小括號(hào)就是生成器解析式了
In [1]: range(10000) Out[1]: range(0, 10000) In [2]: g = (x ** 2 for x in range(100000000000)) In [3]: g Out[3]:at 0x7f9f08a5f0a0> In [4]: next(g) Out[4]: 0 In [5]: next(g) Out[5]: 1 In [6]: next(g) Out[6]: 4
列表解析式和生成器解析式的選擇
需要用下標(biāo)訪問的時(shí)候,用列表解析式
只需要對(duì)結(jié)果迭代的時(shí)候,優(yōu)先使用生成器解析式
將列表解析式的中括號(hào)換成大括號(hào)就是集合解析式了。
In [1]: lst = [2, 4, 5, 6, 3, 4, 2] In [2]: s = {x for x in lst} In [3]: s Out[3]: {2, 3, 4, 5, 6} # 可見列表解析式生成的時(shí)候會(huì)去掉重復(fù),符合集合要求 In [4]: type(s) Out[4]: set
字典解析式使用的也是大括號(hào),但是和集合解析式不同的是在expr處使用的不是單個(gè)元素而是k,v對(duì)。
In [1]: {str(x): x for x in range(5)} Out[1]: {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4}
這四種解析式中使用最廣泛的還是列表解析式,會(huì)經(jīng)常有一些很巧妙的用法。
“Python解析式有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!