你不知道的18個Python高效編程技巧

2020-08-30 AI科技大本營

來源 | Python編程時光

初識Python語言,覺得python滿足了我上學時候對程式語言的所有要求。python語言的高效編程技巧讓我們這些大學曾經苦逼學了四年c或者c++的人,興奮的不行不行的,終於解脫了。高級語言,如果做不到這樣,還扯啥高級呢?

交換變量

>>>a=3

>>>b=6

這個情況如果要交換變量在c++中,肯定需要一個空變量。但是python不需要,只需一行,大家看清楚了

>>>a,b=b,a

>>>print(a)

>>>6

>>>ptint(b)

>>>5

字典推導(Dictionary comprehensions)和集合推導(Set comprehensions)

大多數的Python程式設計師都知道且使用過列表推導(list comprehensions)。如果你對list comprehensions概念不是很熟悉——一個list comprehension就是一個更簡短、簡潔的創建一個list的方法。

>>> some_list = [1, 2, 3, 4, 5]

>>> another_list = [ x + 1 for x in some_list ]

>>> another_list

[2, 3, 4, 5, 6]

自從python 3.1 起,我們可以用同樣的語法來創建集合和字典表:

>>> Dict Comprehensions

>>> d = { x: x % 2 == 0 for x in range(1, 11) }

>>> d

{1: False, 2: True, 3: False, 4: True, 5: False, 6: True, 7: False, 8: True, 9: False, 10: True}

在第一個例子裡,我們以some_list為基礎,創建了一個具有不重複元素的集合,而且集合裡只包含偶數。而在字典表的例子裡,我們創建了一個key是不重複的1到10之間的整數,value是布爾型,用來指示key是否是偶數。

這裡另外一個值得注意的事情是集合的字面量表示法。我們可以簡單的用這種方法創建一個集合:

>>> my_set = {1, 2, 1, 2, 3, 4}

>>> my_set

set([1, 2, 3, 4])

而不需要使用內置函數set。

計數時使用Counter計數對象

這聽起來顯而易見,但經常被人忘記。對於大多數程式設計師來說,數一個東西是一項很常見的任務,而且在大多數情況下並不是很有挑戰性的事情——這裡有幾種方法能更簡單的完成這種任務。

Python的collections類庫裡有個內置的dict類的子類,是專門來幹這種事情的:

>>> from collections import Counter

>>> c = Counter('hello world')

>>> c

Counter({'l': 3, 'o': 2, ' ': 1, 'e': 1, 'd': 1, 'h': 1, 'r': 1, 'w': 1})

>>> c.most_common(2)

[('l', 3), ('o', 2)]

漂亮的列印出JSON

JSON是一種非常好的數據序列化的形式,被如今的各種API和web service大量的使用。使用python內置的json處理,可以使JSON串具有一定的可讀性,但當遇到大型數據時,它表現成一個很長的、連續的一行時,人的肉眼就很難觀看了。

為了能讓JSON數據表現的更友好,我們可以使用indent參數來輸出漂亮的JSON。當在控制臺交互式編程或做日誌時,這尤其有用:

>>> import json

>>> print(json.dumps(data)) With indention

{

"status": "OK",

"count": 2,

"results": [

{

"age": 27,

"name": "Oz",

"lactose_intolerant": true

},

{

"age": 29,

"name": "Joe",

"lactose_intolerant": false

}

]

}

同樣,使用內置的pprint模塊,也可以讓其它任何東西列印輸出的更漂亮。

解決FizzBuzz

前段時間Jeff Atwood 推廣了一個簡單的編程練習叫FizzBuzz,問題引用如下:

寫一個程序,列印數字1到100,3的倍數列印「Fizz」來替換這個數,5的倍數列印「Buzz」,對於既是3的倍數又是5的倍數的數字列印「FizzBuzz」。

這裡就是一個簡短的,有意思的方法解決這個問題:

for x in range(1,101):

print"fizz"[x%3*len('fizz')::]+"buzz"[x%5*len('buzz')::] or x

if 語句在行內

print "Hello" if True else "World"

>>> Hello

連接

下面的最後一種方式在綁定兩個不同類型的對象時顯得很cool。

nfc = ["Packers", "49ers"]

afc = ["Ravens", "Patriots"]

print nfc + afc

>>> ['Packers', '49ers', 'Ravens', 'Patriots']

print str(1) + " world"

>>> 1 world

print `1` + " world"

>>> 1 world

print 1, "world"

>>> 1 world

print nfc, 1

>>> ['Packers', '49ers'] 1

數值比較

這是我見過諸多語言中很少有的如此棒的簡便法

x = 2

if 3 > x > 1:

print x

>>> 2

if 1 < x > 0:

print x

>>> 2

同時迭代兩個列表

nfc = ["Packers", "49ers"]

afc = ["Ravens", "Patriots"]

for teama, teamb in zip(nfc, afc):

print teama + " vs. " + teamb

>>> Packers vs. Ravens

>>> 49ers vs. Patriots

帶索引的列表迭代

teams = ["Packers", "49ers", "Ravens", "Patriots"]

for index, team in enumerate(teams):

print index, team

>>> 0 Packers

>>> 1 49ers

>>> 2 Ravens

>>> 3 Patriots

列表推導式

已知一個列表,我們可以刷選出偶數列表方法:

numbers = [1,2,3,4,5,6]

even =

for number in numbers:

if number%2 == 0:

even.append(number)

轉變成如下:

numbers = [1,2,3,4,5,6]

even = [number for number in numbers if number%2 == 0]

字典推導

和列表推導類似,字典可以做同樣的工作:

teams = ["Packers", "49ers", "Ravens", "Patriots"]

print {key: value for value, key in enumerate(teams)}

>>> {'49ers': 1, 'Ravens': 2, 'Patriots': 3, 'Packers': 0}

初始化列表的值

items = [0]*3

print items

>>> [0,0,0]

列錶轉換為字符串

teams = ["Packers", "49ers", "Ravens", "Patriots"]

print ", ".join(teams)

>>> 'Packers, 49ers, Ravens, Patriots'

從字典中獲取元素

我承認try/except代碼並不雅致,不過這裡有一種簡單方法,嘗試在字典中查找key,如果沒有找到對應的alue將用第二個參數設為其變量值。

data = {'user': 1, 'name': 'Max', 'three': 4}

try:

is_admin = data['admin']

except KeyError:

is_admin = False

替換成這樣

data = {'user': 1, 'name': 'Max', 'three': 4}

is_admin = data.get('admin', False)

獲取列表的子集

有時,你只需要列表中的部分元素,這裡是一些獲取列表子集的方法。

x = [1,2,3,4,5,6]

中間4個

print x[1:5]

>>> [2,3,4,5]

奇數項

print x[::2]

>>> [1,3,5]

#偶數項

print x[1::2]

>>> [2,4,6]

除了python內置的數據類型外,在collection模塊同樣還包括一些特別的用例,在有些場合Counter非常實用。如果你參加過在這一年的Facebook HackerCup,你甚至也能找到他的實用之處。

from collections import Counter

print Counter("hello")

>>> Counter({'l': 2, 'h': 1, 'e': 1, 'o': 1})

迭代工具

和collections庫一樣,還有一個庫叫itertools,對某些問題真能高效地解決。其中一個用例是查找所有組合,他能告訴你在一個組中元素的所有不能的組合方式

from itertools import combinations

teams = ["Packers", "49ers", "Ravens", "Patriots"]

for game in combinations(teams, 2):

print game

>>> ('Packers', '49ers')

>>> ('Packers', 'Ravens')

>>> ('Packers', 'Patriots')

>>> ('49ers', 'Ravens')

>>> ('49ers', 'Patriots')

>>> ('Ravens', 'Patriots')

False == True

比起實用技術來說這是一個很有趣的事,在python中,True和False是全局變量,因此:

False = True

if False:

print "Hello"

else:

print "World"

>>> Hello

原文:Improving Your Python Productivity

推薦三個網站

1.Python進階知識: http://python.iswbm.com

2.Python魔法技巧: http://magic.iswbm.com

3.PyCharm 手冊: http://pycharm.iswbm.com

相關焦點

  • 容易被忽略的Python高效編程技巧
    【IT168 技術】我已經使用Python編程有多年了,即使今天我仍然驚奇於這種語言所能讓代碼表現出的整潔和對DRY編程原則的適用。這些年來的經歷讓我學到了很多的小技巧和知識,大多數是通過閱讀很流行的開源軟體,如Django, Flask, Requests中獲得的。
  • python編程30個常用技巧
    打開APP python編程30個常用技巧 深度學習這件小事 發表於 2020-12-24 15:07:51 通過指定end參數的值,可以取消在末尾輸出回車符,實現不換行。 12、替換列表中所有的3為3a
  • 如何高效自學編程?天下沒有難學的python
    這是一個不一樣的python教程,我們的特點是教會如何高效地自學,化被動學習為主動學習在過往的經驗中發現,很多學習編程的同學,都有過 從入門到放棄 的體驗,我也曾是其中一員。後來經過深入分析,發現了其中主要有三個原因:第一,深受」好記性不如爛筆頭「的影響。
  • Python編程常用技巧大全
    現在Python是個炙手可熱的技能,很多人都想著入手學學Python編程,甚至包括一些知名人士,比如知名地產商潘石屹就開始學Python。關於Python編程的內容在網絡上也非常多,本文蟲蟲給大家總結一些Python編程的常見技巧,以幫助初學者快速入門。
  • 常用的10個Python編程小技巧
    主要介紹常用的10個Python實用小技巧,幫助大家更好的理解和學習Python,感興趣的朋友可以了解下~對編程感興趣,對Python感興趣,可以關注我噢·~私信發送「獲取」,更可以免費獲得Python編程學習資料~都說追女孩方法大於態度,學Python也是,今天就給大家分享的是我在用
  • 自學python編程有哪些教程和書籍?python之父:這些資源你必須有
    要說資源,那小編姐姐最有經驗那,今天給大家帶來最全的python編程自學資料和書籍,希望大家喜歡。首先我們應該知道python編程需要學習那些知識,通過這些知識來尋找相對應的資料和書籍。當然,在此之前,你需要將python基礎及爬蟲等書籍學習知識查看一遍,這些書籍能夠帶領你走入正確的python程式語言世界。而python編程而言是需要我們不斷的學習,不斷的提升!
  • 零基礎學python,你需要掌握這8個技巧!
    作為這幾年火爆的python,想要零基礎起步學習,興趣愛好是首要的,什麼語言都是入門簡單,精通難。相比java,c等語言來說python極其容易入門,但是簡單的語法也正是它的缺點,靈活導致很多bug在運行過程中才能發現,導致多人協同上很難保證統一的風格。
  • 這些Python代碼技巧,你肯定還不知道
    選自FreeCodeCamp作者:Peter Gleeson機器之心編譯參與:路、王淑婷被人工智慧捧紅的 Python 已是一種發展完善且非常多樣化的語言,其中肯定有一些你尚未發現的功能。本文或許能夠讓你學到一些新技巧。
  • 自學PY編程有哪些教程和書籍?python之父:這些資源收好
    首先我們應該知道python編程需要學習那些知識,通過這些知識來尋找相對應的資料和書籍。當然,在此之前,你需要將python基礎及爬蟲等書籍學習知識查看一遍,這些書籍能夠帶領你走入正確的python程式語言世界。而python編程而言是需要我們不斷的學習,不斷的提升!
  • 掌握這10個python技巧,讓你代碼工作如魚得水!
    但要問程式語言流行指數之王非,那真的非Python莫屬了。據Stack Overflow數據顯示,Python是使用量增長最快的程式語言。福布斯最新發布的一篇報告指出,python的使用量在去年增長了456%。Netfix、IBM以及其它數以百計的公司都在使用python。包括Dropbox也是由python創建的。
  • 如何以有趣的方式學習Python編程
    2.寫關於如何學習python編程的第二個技巧是做筆記。當我們學習一種程式語言時,很難記住我們學到的一切。因此,始終建議您記下所學內容。因此,作為新程式設計師,您還應該在學習中記筆記。這些筆記將幫助您長期記住它們,因為手工書寫筆記有助於長期保存。如果您正在處理小型程序,那麼手工記筆記將有助於您在開始之前計劃代碼。
  • 你可能不知道的 Python 技巧
    但是這有個重要的提醒,即它會消耗掉切片前以及切片對象 islice 中的所有元素。3、跳過可迭代對象的開始有時候你必須處理某些文件,它們以可變數量的不需要的行(例如注釋)為開頭。如果我們只想丟棄迭代器的開頭部分(在此例中是注釋),並且不知道有多少內容,那麼此方法很有用。
  • Github上7個絕佳的:Python編程學習開源庫!很贊
    它涵蓋了字符串和條件之類的基礎知識,然後討論了面向對象編程,以及如何處理異常和一些Python標準庫的特性等。每一個主題都有一個「notebook」連結,它會向你介紹該主題和一些示例代碼,當你完成這些內容之後,還有一個練習連結,點擊後你就可以做一些測試題。
  • 零基礎如何高效學習編程|成就我的10個編程學習實用小技巧
    這幾天有很多小夥伴私信問我:老鬼呀,我最近開始學習編程,但是感覺自己的學習效率特別的低,你是怎麼學習編程的呢,有什麼好的學習方法,如何高效的學習編程,學習編程有什麼方法論嗎?我總結了一下,大概有以下4個原因,第一是編程對你只是一個興趣和愛好,你想開發一些有趣的東西,通過編寫一些小工具來幫助自己提升一些工作上的效率。第二是你有一個很棒的idea,你想自己開發app,或者說是開發一個網站。第三是你是計算機相關專業的學生,為了以後方便找工作,想去進大廠,想拿高薪的工資。第四個是你想轉行進入網際網路行業,成為一個程式設計師。
  • 代碼森林帶你實踐熱門編程書籍——《Python編程:從入門到實踐》
    Python它作為一門熱門的語言,已經高居程式語言排行榜前三名。Python主要用於機器學習、爬蟲、數據分析、腳本編寫、人工智慧等領域,語言簡潔靈活,高效方便。第一本你必須要擁有的書籍一定是《Python編程:從入門到實踐》它是一本針對所有層次的Python讀者的編程學習書——《Python編程:從入門到實踐》本書內容本書旨在讓你成為優秀的程式設計師,具體地說,是優秀的Python程式設計師。
  • 超全面python入門圖書清單,你知道幾本?
    ,兼顧Python 3和Python 2,告訴你Python中不親自動手實踐就無法理解的語言陷阱成因和解決之道,教你寫出風格地道的Python代碼。書中包含了大量實用的編程技巧和示例代碼,非常適合具有一定編程基礎的Python程式設計師閱讀
  • 復旦大學計算機系推薦:986集編程視頻+python電子書
    能不能將python學個通透,也是一名程式設計師是不是優秀的標準之一,今天小編便將python視頻教程+電子書籍資料一個個放在文章裡面免費送給你收藏啦!如果覺得此文章對你學python有很大的提升,請各位粉絲給個評論和轉發,讓更多的人養成收藏python知識的好習慣。
  • 假如這篇文章都不能讓你學通python,編程界你恐怕是進不來
    與此同時,本書述提供了大量的示例代碼和編程技巧與提示,幫助讀者搭建良好的知識結構,養成良好的編程習慣,指導讀者如何避免常見的編程錯誤以及寫出高效、可靠的應用程式。《笨辦法學Python》本書結構非常簡單,共包括52個習題,其中26個覆蓋了輸入/輸出、變量和函數三個主題,另外26個覆蓋了一些比較高級的話題
  • 編程的入門學習心得,python
    編程入門剛開始學習編程,主要是以為自己想動手做個網站,但是由於技術原因,最後抱著「求人不如求己」的想法,乾脆自學編程難不難?程式語言選擇這邊說個題外話,關於當時程式語言的選擇,很多時候我覺得不是你選擇程式語言,而是程式語言選擇你,也就是你的「本命程式語言」至於程式語言,沒有高低之分,因為無論你學習哪門語言,你都非常有市場,
  • Python如何入門?搭配這些遊戲,學習高效還有趣
    Python是最適合初學者的程式語言,相對其他語言來說,它有著更好的可讀性,所以上手會更加容易。很簡單,首先請你放棄完全看書學基礎的想法,因為過程太枯燥,對於我來說,完全堅持不下來。因為Python再簡單也是一門程式語言,所以持續學習很重要。學Python,應該結合下面的python入門小遊戲,不僅有趣,還能讓學習更高效。這些Python小遊戲的源碼和完整教程在底部能直接提供。