使用python過程當中常常會不經意間遇到很是有趣的用法,因而特地蒐集了一些html
1.for-else用法python
循環正常結束則執行else語句。通常用於循環找符合條件的元素,若是找到則break
調出循環,不會觸發else
;若是沒有找到(完整運行循環)則print not found
git
詳見Python中循環語句中的else用法github
《Effictive Python》一書中對for-else用法提出了質疑,主要觀點是能夠經過封裝成函數來取代這一用法,而封裝成函數是更加通用易懂的作法,因此通常不會使用for-else用法。爲了避免影響文章的緊湊,我把評論區對書上內容的引用放在文末「更新補充」部分,有興趣的讀者能夠去看一下。express
2.try-else用法編程
若是沒有觸發異常就執行else
segmentfault
參考這裏app
3.解包用法ide
相似這樣a,b,c = ['a', 'b', 'c']
函數
4.單行if-else
a = 1 b = 3 if a == 1 else 2 print('it is one' if a == 1 else 'no') #加羣:725479218 獲取更多的學習資料
5.迭代器傳入函數中不用加括號
# 通常是這樣 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)) #加羣:725479218 獲取更多的學習資料
6.對生成器進行篩選
7.or的用法
python中x or y
表示若是x爲真就是x的值,不然爲y的值
咱們會常常看到相似這樣的用法(好比函數的一個value
參數沒有設置默認值,這樣使用就容許它不賦值)
value = value or {} # 至關於 value = value if value else {}
8.and的用法
python中x and y
表示若是x是假,結果就是x的值,不然就是y的值
x and y and z
多個and鏈接時,若是全是真結果就是最後一個的值;若是中間有假的值,結果就是第一個假的值
舉一個例子
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 None else: return a.strip() #加羣:725479218 獲取更多的學習資料
細細品味and和or的差異,他們邏輯相似,可是實現的功能是不能夠相互替代的
9.if value:
# 要用 if value: # 不要用 if value == True:
這裏總結一下這種狀況下何時是True
,何時是False
False: 0 0.0 '' [] {} () set() None False
True:
' ' 'anything' [''] [0] (None, )
另外要注意一點,咱們用if
判斷一個對象是否是None
的時候,要if a is None
而不要直接if a
,由於若是是後者,有很是多不是None
的狀況也會斷定爲False
,好比空字符串、空列表等,爲了精確指定None
仍是要用前者,這也是一種規範。
10.下劃線的特殊使用
python中下劃線是一種特殊的變量和符號,有一些特殊的用途
11.文檔字符串
python有一種獨一無二的註釋方式,在包、模塊、函數、類中第一句,使用'''doc'''
這樣三引號註釋,就能夠在對象中用__doc__
的方式提取
比較規範的寫法是這樣的(這裏參考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__) # 結果爲 add two numbers :param a: one number :param b: another number :returns: a number
其實參數還有其餘的寫法,如numpy
庫的寫法,能夠看這裏
除此以外,函數註釋還有另外一種方式,函數名能夠直接調用某個參數的註釋,詳見Python 的函數註釋。還能夠參考PEP 257
1.sum的本質
本質:sum(iterable, start=0)
將可迭代對象使用+
鏈接
因此sum([[1,2],[3,4]], [])
返回結果爲[1, 2, 3, 4]
2.range(start, stop[, step])
能夠直接用for i in range(10, 0, -1)
降序循環
3.enumerate循環索引
for index, item in enumerate(['a', 'b', 'c']): print(index, item) 輸出: 0 a 1 b 2 c
4.管道操做
func1(func2(func3(a)))寫成相似a %>% func3 %>% func2 %>% func1,清晰展現函數執行的順序,加強可讀性
python自己不帶有這樣的用法,只是一些庫提供了這樣的用法,好比pandas和syntax_sugar
另外,就是一些基礎的
map reduce filter
上面不少在廖雪峯python教程中都能找到
閱讀優秀的代碼也是提升編程水平的好方法,參考下面這個問題
初學 Python,有哪些 Pythonic 的源碼推薦閱讀?
學習代碼規範能夠參考下面資料
更新補充
下面引用《Effictive Python》一書中內容 `` a = 4 b = 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
結尾:
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.
總結起來就是for-else的優點是能夠被寫函數的方式替代的