python有趣用法彙總(持續更新)

使用python過程當中常常會不經意間遇到很是有趣的用法,因而特地蒐集了一些html

有趣的用法

1.for-else用法python

循環正常結束則執行else語句。通常用於循環找符合條件的元素,若是找到則break調出循環,不會觸發else;若是沒有找到(完整運行循環)則print not foundgit

詳見Python中循環語句中的else用法github

《Effictive Python》一書中對for-else用法提出了質疑,主要觀點是能夠經過封裝成函數來取代這一用法,而封裝成函數是更加通用易懂的作法,因此通常不會使用for-else用法。爲了避免影響文章的緊湊,我把評論區對書上內容的引用放在文末「更新補充」部分,有興趣的讀者能夠去看一下。express

2.try-else用法編程

若是沒有觸發異常就執行elsesegmentfault

參考這裏app

3.解包用法ide

相似這樣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')
 #加羣: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的差異,他們邏輯相似,可是實現的功能是不能夠相互替代的

  • or 是結果若是不滿意有個善後工做
  • and是要作一件事以前先檢驗一下,不能作就不讓它作

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中下劃線是一種特殊的變量和符號,有一些特殊的用途

詳見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

參考stackoverflow上的這個回答

其餘

另外,就是一些基礎的

上面不少在廖雪峯python教程中都能找到

閱讀優秀的代碼也是提升編程水平的好方法,參考下面這個問題

初學 Python,有哪些 Pythonic 的源碼推薦閱讀?

學習代碼規範能夠參考下面資料

更新補充

  1. for-else的更多討論

下面引用《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的優點是能夠被寫函數的方式替代的

相關文章
相關標籤/搜索