本文的文字及圖片來源于網路,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理
以下文章來源于云+社區 ,作者:職場亮哥
Python決議式
在python中經常能夠看到形如ret = [x ** 2 for x in lst]這樣的賦值陳述句,對于從C++轉到python的人不太容易理解這種for回圈的使用,這就是python為了簡潔而發明的新語法,python決議式有以下優點:
- 代碼簡潔,可讀性強
- 效率比普通迭代稍高
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 # 耗時稍高
可以發現效率是要稍高一點,最主要的還是代碼簡潔,
串列決議式可以和if陳述句一起使用
例如篩選出串列lst中的偶數:
In [4]: ret = []
In [5]: for x in lst:
...: if x % 2 == 0:
...: ret.append(x) # 使用for回圈
...:
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回圈一樣使用if陳述句,
- 帶多個if陳述句的,都可以轉化為條件的邏輯運算, 所以一般來說,不會帶多個if陳述句
串列決議式的for陳述句可以嵌套,
In [9]: (x, y) for x in range(0, 5) for y in range(5, 10)
File "<ipython-input-9-825e2443da8b>", line 1
(x, y) for x in range(0, 5) for y in range(5, 10)
^
SyntaxError: invalid syntax
# 說明串列決議式一定要使用中括號括起來
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陳述句的寫法和串列決議式很像,
運算式形式:x if cond else y
if和else必須同時存在,
下面以偶數求平方,奇數求立方為例進行演示
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]
生成器決議式
串列決議式回傳的是一個串列,而生成器決議式回傳的是一個決議式,串列決議式的中括號變成小括號就是生成器決議式了
In [1]: range(10000)
Out[1]: range(0, 10000)
In [2]: g = (x ** 2 for x in range(100000000000))
In [3]: g
Out[3]: <generator object <genexpr> at 0x7f9f08a5f0a0>
In [4]: next(g)
Out[4]: 0
In [5]: next(g)
Out[5]: 1
In [6]: next(g)
Out[6]: 4
串列決議式和生成器決議式的選擇
- 需要用下標訪問的時候,用串列決議式
- 只需要對結果迭代的時候,優先使用生成器決議式
集合決議式
將串列決議式的中括號換成大括號就是集合決議式了,
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} # 可見串列決議式生成的時候會去掉重復,符合集合要求
In [4]: type(s)
Out[4]: set
字典決議式
字典決議式使用的也是大括號,但是和集合決議式不同的是在expr處使用的不是單個元素而是k,v對,
In [1]: {str(x): x for x in range(5)}
Out[1]: {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4}
這四種決議式中使用最廣泛的還是串列決議式,會經常有一些很巧妙的用法,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/200003.html
標籤:Python
