python if and_python有趣用法汇总(持续更新)
使用python過程中經(jīng)常會不經(jīng)意間遇到非常有趣的用法,于是特意搜集了一些
- 2019年3月19日更新了and的用法
- 2019年3月26日更新了for-else的更多討論
- 2020年9月8日補充了對and和or的分析
有趣的用法
1.for-else用法
循環(huán)正常結(jié)束則執(zhí)行else語句。一般用于循環(huán)找符合條件的元素,如果找到則break調(diào)出循環(huán),不會觸發(fā)else;如果沒有找到(完整運行循環(huán))則print not found
詳見Python中循環(huán)語句中的else用法
根據(jù)評論區(qū)知友的提醒(已置頂),《Effictive Python》一書中對for-else用法提出了質(zhì)疑,主要觀點是可以通過封裝成函數(shù)來取代這一用法,而封裝成函數(shù)是更加通用易懂的做法,所以一般不會使用for-else用法。為了不影響文章的緊湊,我把評論區(qū)對書上內(nèi)容的引用放在文末“更新補充”部分,有興趣的讀者可以去看一下。
2.try-else用法
如果沒有觸發(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ù)中不用加括號
# 一般是這樣 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.對生成器進行篩選
一個素數(shù)生成器的例子
7.or的用法
python中x or y表示如果x為真就是x的值,否則為y的值
我們會經(jīng)常看到類似這樣的用法(比如函數(shù)的一個value參數(shù)沒有設(shè)置默認值,這樣使用就允許它不賦值)
value = value or {} # 相當于 value = value if value else {}8.and的用法
python中x and y表示如果x是假,結(jié)果就是x的值,否則就是y的值
x and y and z多個and連接時,如果全是真結(jié)果就是最后一個的值;如果中間有假的值,結(jié)果就是第一個假的值。
舉一個例子
def not_empty(a):return a and a.strip()not_empty(' a ') # 值為 'a' not_empty(None) # 不會報錯(如果 return a.strip() 就會報錯)# 在處理None的問題上相當于 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細細品味and和or的差別,他們邏輯類似,但是實現(xiàn)的功能是不可以相互替代的
- or 是結(jié)果如果不滿意有個善后工作
- and是要做一件事之前先檢驗一下,不能做就不讓它做
二者都可以用if else替代,而且用一般用if else的可讀性還更強,看看下面這個例子
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'兩個函數(shù)的功能是一樣的,即傳入的參數(shù)如果是None,就不加對應(yīng)部分字符,不是None就加上,看下面四個例子的輸出可以很容易明白。而具體看實現(xiàn),會發(fā)現(xiàn)第一種比第二種好懂很多,第二種又and又or,比較繞,不了解這一用法的人還得去試。
因此賦值是還是推薦用if/else,and/or更多的應(yīng)用場景是if判斷,要輸出這個表達式的True/False,而不是具體什么值。在if語句中,用or表示只要其中一項為True整體就是True,用and表示必須所有項都為True整體才會是True,結(jié)合上面對and/or表達式的輸出,可以發(fā)現(xiàn)輸出的值和True/False結(jié)果對得上。
另外一點值得注意的是,and/or都有惰性求值的特點,不是將連接的所有項都算出來再統(tǒng)一看True/False,而是從前向后算
- and前面一項如果是False,則后面的項都不會再計算。相當于從前向后算一直在找False的項。
- or前面一項如果是True,則后面的項都不會計算。相當于從前向后算一直在找True的項。
正常如果運行'a' in None是會報錯的,但上面的代碼不會報錯,因為and后面的部分沒有執(zhí)行。
9.if value:
# 要用 if value: # 不要用 if value == True:這里總結(jié)一下這種情況下什么時候是True,什么時候是False
False: 0 0.0 '' [] {} () set() None False
True:
- ' ' 'anything' [''] [0] (None, )
- 沒有內(nèi)容的可迭代對象
另外要注意一點,我們用if判斷一個對象是不是None的時候,要if a is None而不要直接if a,因為如果是后者,有非常多不是None的情況也會判定為False,比如空字符串、空列表等,為了精確指定None還是要用前者,這也是一種規(guī)范。
10.下劃線的特殊使用
python中下劃線是一種特殊的變量和符號,有一些特殊的用途
詳見python中下劃線的使用
11.文檔字符串
python有一種獨一無二的注釋方式,在包、模塊、函數(shù)、類中第一句,使用'''doc'''這樣三引號注釋,就可以在對象中用__doc__的方式提取;更方便的是,查看一個函數(shù)幫助文檔時(比如jupyter中shift+tab),會把文檔字符串顯示出來。
比較規(guī)范的寫法是這樣的(這里參考grequests模塊的寫法)
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ù)還有其他的寫法,如numpy庫的寫法,可以看這里
除此之外,函數(shù)注釋還有另一種方式,函數(shù)名可以直接調(diào)用某個參數(shù)的注釋,詳見Python 的函數(shù)注釋。還可以參考PEP 257
有用的函數(shù)
1.sum的本質(zhì)
本質(zhì):sum(iterable, start=0)將可迭代對象使用+連接
所以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)))寫成類似a %>% func3 %>% func2 %>% func1,清晰展示函數(shù)執(zhí)行的順序,增強可讀性
python本身不帶有這樣的用法,只是一些庫提供了這樣的用法,比如pandas和syntax_sugar
參考stackoverflow上的這個回答
其他
另外,就是一些基礎(chǔ)的
- 列表推導式
- 裝飾器
- 生成器
- map reduce filter
- 鏈式比較
- 類的魔術(shù)方法
上面很多在廖雪峰python教程中都能找到
另外,可以參考知乎上的兩個問題
- Python 有哪些好玩的語法糖?
- Python 有哪些優(yōu)雅的代碼實現(xiàn)讓自己的代碼更pythonic?
閱讀優(yōu)秀的代碼也是提高編程水平的好方法,參考下面這個問題
初學 Python,有哪些 Pythonic 的源碼推薦閱讀?
學習代碼規(guī)范可以參考下面資料
- PEP8
- Python 代碼、單元測試和項目規(guī)范
- google開源項目風格指南
更新補充
下面引用《Effictive Python》一書中內(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')
隨后作者寫到:
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é)起來就是for-else的優(yōu)勢是可以被寫函數(shù)的方式替代的
專欄信息
專欄主頁:python編程
專欄目錄:目錄
版本說明:軟件及包版本說明
總結(jié)
以上是生活随笔為你收集整理的python if and_python有趣用法汇总(持续更新)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑音响怎么插_【图片】汽车音响改装案例
- 下一篇: python import 原理-Pyt