python if and_python有趣用法汇总(持续更新)
使用python過(guò)程中經(jīng)常會(huì)不經(jīng)意間遇到非常有趣的用法,于是特意搜集了一些
- 2019年3月19日更新了and的用法
- 2019年3月26日更新了for-else的更多討論
- 2020年9月8日補(bǔ)充了對(duì)and和or的分析
有趣的用法
1.for-else用法
循環(huán)正常結(jié)束則執(zhí)行else語(yǔ)句。一般用于循環(huán)找符合條件的元素,如果找到則break調(diào)出循環(huán),不會(huì)觸發(fā)else;如果沒(méi)有找到(完整運(yùn)行循環(huán))則print not found
詳見(jiàn)Python中循環(huán)語(yǔ)句中的else用法
根據(jù)評(píng)論區(qū)知友的提醒(已置頂),《Effictive Python》一書(shū)中對(duì)for-else用法提出了質(zhì)疑,主要觀點(diǎn)是可以通過(guò)封裝成函數(shù)來(lái)取代這一用法,而封裝成函數(shù)是更加通用易懂的做法,所以一般不會(huì)使用for-else用法。為了不影響文章的緊湊,我把評(píng)論區(qū)對(duì)書(shū)上內(nèi)容的引用放在文末“更新補(bǔ)充”部分,有興趣的讀者可以去看一下。
2.try-else用法
如果沒(méi)有觸發(fā)異常就執(zhí)行else
參考這里
3.解包用法
類似這樣a,b,c = ['a', 'b', 'c']
python有趣的解包用法
4.單行if-else
a = 1 b = 3 if a == 1 else 2 print('it is one' if a == 1 else 'no')5.迭代器傳入函數(shù)中不用加括號(hào)
# 一般是這樣 a = (i for i in range(10)) sum(a) # 我們可以這樣 sum((i for i in range(10))) # 但我們還可以這樣 sum(i for i in range(10)) # 類似的有 ' '.join(str(i) for i in range(10))6.對(duì)生成器進(jìn)行篩選
一個(gè)素?cái)?shù)生成器的例子
7.or的用法
python中x or y表示如果x為真就是x的值,否則為y的值
我們會(huì)經(jīng)常看到類似這樣的用法(比如函數(shù)的一個(gè)value參數(shù)沒(méi)有設(shè)置默認(rèn)值,這樣使用就允許它不賦值)
value = value or {} # 相當(dāng)于 value = value if value else {}8.and的用法
python中x and y表示如果x是假,結(jié)果就是x的值,否則就是y的值
x and y and z多個(gè)and連接時(shí),如果全是真結(jié)果就是最后一個(gè)的值;如果中間有假的值,結(jié)果就是第一個(gè)假的值。
舉一個(gè)例子
def not_empty(a):return a and a.strip()not_empty(' a ') # 值為 'a' not_empty(None) # 不會(huì)報(bào)錯(cuò)(如果 return a.strip() 就會(huì)報(bào)錯(cuò))# 在處理None的問(wèn)題上相當(dāng)于 def not_empty(a):if a is None:return Noneelse:return a.strip()# 或者 def not_empty(a):return a.strip() if a is not None else None細(xì)細(xì)品味and和or的差別,他們邏輯類似,但是實(shí)現(xiàn)的功能是不可以相互替代的
- or 是結(jié)果如果不滿意有個(gè)善后工作
- and是要做一件事之前先檢驗(yàn)一下,不能做就不讓它做
二者都可以用if else替代,而且用一般用if else的可讀性還更強(qiáng),看看下面這個(gè)例子
def get_weight_name_v1(logname=None, savename=None):log_str = '-log_{}'.format(logname) if logname is not None else ''save_str = '-save_{}'.format(savename) if savename is not None else ''return 'weight{}{}.ckpt'.format(log_str, save_str)def get_weight_name_v2(logname=None, savename=None):log_str = logname is not None and '-log_{}'.format(logname) or ''save_str = savename is not None and '-save_{}'.format(savename) or ''return 'weight{}{}.ckpt'.format(log_str, save_str)get_weight_name_v1('abc', 'bcd') # 'weight-log_abc-save_bcd.ckpt' get_weight_name_v1('abc', None) # 'weight-log_abc.ckpt'get_weight_name_v2(None, 'abc') # 'weight-save_abc.ckpt' get_weight_name_v2(None, None) # 'weight.ckpt'兩個(gè)函數(shù)的功能是一樣的,即傳入的參數(shù)如果是None,就不加對(duì)應(yīng)部分字符,不是None就加上,看下面四個(gè)例子的輸出可以很容易明白。而具體看實(shí)現(xiàn),會(huì)發(fā)現(xiàn)第一種比第二種好懂很多,第二種又and又or,比較繞,不了解這一用法的人還得去試。
因此賦值是還是推薦用if/else,and/or更多的應(yīng)用場(chǎng)景是if判斷,要輸出這個(gè)表達(dá)式的True/False,而不是具體什么值。在if語(yǔ)句中,用or表示只要其中一項(xiàng)為T(mén)rue整體就是True,用and表示必須所有項(xiàng)都為T(mén)rue整體才會(huì)是True,結(jié)合上面對(duì)and/or表達(dá)式的輸出,可以發(fā)現(xiàn)輸出的值和True/False結(jié)果對(duì)得上。
另外一點(diǎn)值得注意的是,and/or都有惰性求值的特點(diǎn),不是將連接的所有項(xiàng)都算出來(lái)再統(tǒng)一看True/False,而是從前向后算
- and前面一項(xiàng)如果是False,則后面的項(xiàng)都不會(huì)再計(jì)算。相當(dāng)于從前向后算一直在找False的項(xiàng)。
- or前面一項(xiàng)如果是True,則后面的項(xiàng)都不會(huì)計(jì)算。相當(dāng)于從前向后算一直在找True的項(xiàng)。
正常如果運(yùn)行'a' in None是會(huì)報(bào)錯(cuò)的,但上面的代碼不會(huì)報(bào)錯(cuò),因?yàn)閍nd后面的部分沒(méi)有執(zhí)行。
9.if value:
# 要用 if value: # 不要用 if value == True:這里總結(jié)一下這種情況下什么時(shí)候是True,什么時(shí)候是False
False: 0 0.0 '' [] {} () set() None False
True:
- ' ' 'anything' [''] [0] (None, )
- 沒(méi)有內(nèi)容的可迭代對(duì)象
另外要注意一點(diǎn),我們用if判斷一個(gè)對(duì)象是不是None的時(shí)候,要if a is None而不要直接if a,因?yàn)槿绻呛笳?#xff0c;有非常多不是None的情況也會(huì)判定為False,比如空字符串、空列表等,為了精確指定None還是要用前者,這也是一種規(guī)范。
10.下劃線的特殊使用
python中下劃線是一種特殊的變量和符號(hào),有一些特殊的用途
詳見(jiàn)python中下劃線的使用
11.文檔字符串
python有一種獨(dú)一無(wú)二的注釋方式,在包、模塊、函數(shù)、類中第一句,使用'''doc'''這樣三引號(hào)注釋,就可以在對(duì)象中用__doc__的方式提取;更方便的是,查看一個(gè)函數(shù)幫助文檔時(shí)(比如jupyter中shift+tab),會(huì)把文檔字符串顯示出來(lái)。
比較規(guī)范的寫(xiě)法是這樣的(這里參考grequests模塊的寫(xiě)法)
def myfun(a, b):'''add two numbers:param a: one number:param b: another number:returns: a number'''print(a + b)print(myfun.__doc__)# 結(jié)果為 add two numbers:param a: one number:param b: another number:returns: a number其實(shí)參數(shù)還有其他的寫(xiě)法,如numpy庫(kù)的寫(xiě)法,可以看這里
除此之外,函數(shù)注釋還有另一種方式,函數(shù)名可以直接調(diào)用某個(gè)參數(shù)的注釋,詳見(jiàn)Python 的函數(shù)注釋。還可以參考PEP 257
有用的函數(shù)
1.sum的本質(zhì)
本質(zhì):sum(iterable, start=0)將可迭代對(duì)象使用+連接
所以sum([[1,2],[3,4]], [])返回結(jié)果為[1, 2, 3, 4]
2.range(start, stop[, step])
可以直接用for i in range(10, 0, -1)降序循環(huán)
3.enumerate循環(huán)索引
for index, item in enumerate(['a', 'b', 'c']):print(index, item) 輸出: 0 a 1 b 2 c4.管道操作
func1(func2(func3(a)))寫(xiě)成類似a %>% func3 %>% func2 %>% func1,清晰展示函數(shù)執(zhí)行的順序,增強(qiáng)可讀性
python本身不帶有這樣的用法,只是一些庫(kù)提供了這樣的用法,比如pandas和syntax_sugar
參考stackoverflow上的這個(gè)回答
其他
另外,就是一些基礎(chǔ)的
- 列表推導(dǎo)式
- 裝飾器
- 生成器
- map reduce filter
- 鏈?zhǔn)奖容^
- 類的魔術(shù)方法
上面很多在廖雪峰python教程中都能找到
另外,可以參考知乎上的兩個(gè)問(wèn)題
- Python 有哪些好玩的語(yǔ)法糖?
- Python 有哪些優(yōu)雅的代碼實(shí)現(xiàn)讓自己的代碼更pythonic?
閱讀優(yōu)秀的代碼也是提高編程水平的好方法,參考下面這個(gè)問(wèn)題
初學(xué) Python,有哪些 Pythonic 的源碼推薦閱讀?
學(xué)習(xí)代碼規(guī)范可以參考下面資料
- PEP8
- Python 代碼、單元測(cè)試和項(xiàng)目規(guī)范
- google開(kāi)源項(xiàng)目風(fēng)格指南
更新補(bǔ)充
下面引用《Effictive Python》一書(shū)中內(nèi)容
a = 4b = 9
for i in range(2, min(a, b) + 1):
print('Testing', i)
if a % i == 0 and b % i == 0:
print('Not coprime')
break
else:
print('Coprime')
隨后作者寫(xiě)到:
In practice, you wouldn’t write the code this way. Instead, you’d write a helper function to do the calculation. Such a helper function is written in two common styles.The first approach is to return early when you find the condition you’re looking for. You return the default outcome if you fall through the loop.
def coprime(a, b):
for i in range(2, min(a, b) + 1):
if a % i == 0 and b % i == 0:
return False
return True
The second way is to have a result variable that indicates whether you’ve found what you’re looking for in the loop. You break out of the loop as soon as you find something.
def coprime2(a, b):
is_coprime = True
for i in range(2, min(a, b) + 1):
if a % i == 0 and b % i == 0:
is_coprime = False
break
return is_coprime
結(jié)尾:
Both of these approaches are so much clearer to readers of unfamiliar code. The expressivity you gain from the else block doesn’t outweigh the burden you put on people (including yourself) who want to understand your code in the future. Simple constructs like loops should be self-evident in Python. You should avoid using else blocks after loops entirely.總結(jié)起來(lái)就是for-else的優(yōu)勢(shì)是可以被寫(xiě)函數(shù)的方式替代的
專欄信息
專欄主頁(yè):python編程
專欄目錄:目錄
版本說(shuō)明:軟件及包版本說(shuō)明
總結(jié)
以上是生活随笔為你收集整理的python if and_python有趣用法汇总(持续更新)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 电脑音响怎么插_【图片】汽车音响改装案例
- 下一篇: 笔记本电脑排行_笔记本电脑性价比排行20