10 個 pythonic 的“語法糖”
眾所周知,Python 以語法簡潔著稱,同樣實(shí)現(xiàn)一個功能,C++/Java 可能要十來行,Python 可能一行就可以搞定。
Python 的代碼之所以這么優(yōu)雅,歸功于其獨(dú)有的特性,以及一些非常好用的“語法糖”。所謂“語法糖”,指的是一些可以讓代碼更簡潔、更具可讀性的語法。你掌握了這些,也可以寫出像詩一樣的代碼。
下面我們就一起看看 Python 中的幾個“語法糖”。
0x00 Hello World
對于大部分程序員來說,第一個程序應(yīng)該都是 "Hello World!" 了,Python 直接將該入門程序做成了一個包。
In?[1]:?import?__hello__
Hello?world!
0x01 交換變量
一行代碼搞定變量交換,無需臨時變量,也無需異或操作。
In?[1]:?x,y?=?y,x
0x02 變量比較
對于變量的連續(xù)比較,Python 是支持的比較好的。
In?[24]:?x?=?10
In?[25]:?5?20
Out[25]:?True
In?[26]:?11?20
Out[26]:?False
0x03 列表推導(dǎo)式
In?[2]:?list?=?list(range(10))
#?取偶數(shù)
In?[3]:?even?=?[x?for?x?in?list?if?x?%?2?==?0]
In?[4]:?even
Out[4]:?[0,?2,?4,?6,?8]0x04 合并字符串
很多語言合并字符串大都是通過 + 號來實(shí)現(xiàn)的,但由于字符串的不可變性,不斷合并后的字符串會不斷的申請新的內(nèi)存。
In?[5]:?x?=?['a',?'b',?'c',?'d',?'e',?'f',?'g']
In?[6]:?''.join(x)
Out[6]:?'abcdefg'
0x05 列表切片
In?[2]:?x
Out[2]:?[0,?1,?2,?3,?4,?5,?6,?7,?8,?9]
#?取索引為?2?到?8?的值,步長為?2
In?[4]:?x[2:8:2]
Out[4]:?[2,?4,?6]
#?步長為負(fù)值,表示從后面取值
In?[6]:?x[::-2]
Out[6]:?[9,?7,?5,?3,?1]
0x06 反轉(zhuǎn)字符串
In?[7]:?x?=?'Hello?Python!'
In?[8]:?x[::-1]
Out[8]:?'!nohtyP?olleH'
0x07 同時獲取下標(biāo)和值
x?=?list(range(10))
for?index,?value?in?enumerate(x):
????print(index,?value)
0x08 zip()函數(shù)
In?[7]:?a?=?[1,2,3]
In?[8]:?b?=?[4,5,6]
In?[9]:?c?=?[7,8,9]
In?[16]:?list(zip(a,?b,?c))
Out[16]:?[(1,?4,?7),?(2,?5,?8),?(3,?6,?9)]
#?逆操作
In?[18]:?zz?=?(zip(a,?b,?c))
In?[19]:?x,?y,?z?=?zip(*zz)
In?[20]:?x,y,z
Out[20]:?((1,?2,?3),?(4,?5,?6),?(7,?8,?9))
#?合并列表相鄰項(xiàng)
In?[22]:?a?=?[1,?2,?3,?4,?5,?6]
In?[23]:?list(zip(a[::2],?a[1::2]))
Out[23]:?[(1,?2),?(3,?4),?(5,?6)]
0x09 閉包
def?outer(x):
????def?inner(y):
????????#?在內(nèi)函數(shù)中?用到了外函數(shù)的變量
????????nonlocal?x
????????x?+=?y
????????return?x?+?y
????#?外函數(shù)的返回值是內(nèi)函數(shù)的引用
????return?inner
fun?=?outer(10)
print(fun(10))?#?30
print(fun(10))?#?40
print(fun(10))?#?50
總結(jié)
今天給大家分享了一些 Python 的“語法糖”,或許你也可以把它們用在你的代碼里,讓你的代碼更加 pythonic!
類似的 python 小技巧還有很多,歡迎大家留意補(bǔ)充。
_往期文章推薦_
評論
圖片
表情
