Python是世界上最受歡迎,最流行的編程語言之一。這有很多原因:
- 它很容易學(xué)習(xí)
- 它是超級(jí)多用途的
- 它有大量的模塊和庫
作為數(shù)據(jù)科學(xué)家的我,每天使用Python是我內(nèi)在工作的一部分。在這個(gè)過程中,我學(xué)會(huì)了一些有用的技巧和心得。
在這里,我嘗試以A~Z順序共享其中一些。
學(xué)習(xí)Python中的小伙伴,需要學(xué)習(xí)資料的話,可以到我的微信公眾號(hào):Python學(xué)習(xí)知識(shí)圈,后臺(tái)回復(fù):“01”,即可拿Python學(xué)習(xí)資料
大多數(shù)這些“技巧”是我在日常工作中使用或偶然發(fā)現(xiàn)的事情。一些是我在瀏覽Python標(biāo)準(zhǔn)庫文檔時(shí)發(fā)現(xiàn)的。另外一些是通過PyPi搜索到的。
但是,應(yīng)該歸功于它 - 我在http://awesome-python.com上發(fā)現(xiàn)了其中的四個(gè)或五個(gè)。這是數(shù)百個(gè)有趣的Python工具和模塊的精選列表。這是值得瀏覽的靈感!
all or any
Python是如此流行的編程語言的原因之一是因?yàn)榫哂锌勺x性和表現(xiàn)力。
人們經(jīng)常開玩笑說Python是'可執(zhí)行的偽代碼。但是當(dāng)你可以編寫這樣的代碼時(shí),很難反駁:
x = [True, True, False]
if any(x):
print("At least one True")
if all(x):
print("Not one False")
if any(x) and not all(x):
print("At least one True and one False")
bashplotlib
您想在控制臺(tái)中繪制圖表嗎?
$ pip install bashplotlib
您可以在控制臺(tái)中顯示圖表。
collections
Python有一些很棒的默認(rèn)數(shù)據(jù)類型,但有時(shí)候它們的行為并不像你想要的那樣。
幸運(yùn)的是,Python標(biāo)準(zhǔn)庫提供了集合模塊。這個(gè)方便的附加組件為您提供了更多的數(shù)據(jù)類型。
from collections import OrderedDict, Counter
# Remembers the order the keys are added!
x = OrderedDict(a=1, b=2, c=3)
# Counts the frequency of each character
y = Counter("Hello World!")
DIR
曾經(jīng)想知道如何查看Python對(duì)象并查看它具有哪些屬性?你當(dāng)然有。
從命令行:
>>> dir()
>>> dir("Hello World")
>>> dir(dir)
當(dāng)以交互方式運(yùn)行Python以及動(dòng)態(tài)瀏覽您正在使用的對(duì)象和模塊時(shí),這可能是一個(gè)非常有用的功能。
$ pip install emoji
from emoji import emojize
print(emojize(":thumbs_up:"))
from future import
Python受歡迎的一個(gè)后果是一直有新的版本在開發(fā)中。新版本意味著新功能 - 除非您的版本已過時(shí)。
但是,不要害怕。該f="https://link.juejin.im/?target=https%3A%2F%2Flink.zhihu.com%2F%3Ftarget%3Dhttps%253A%2F%2Fdocs.python.org%2F2%2Flibrary%2F__future__.html">future模塊,讓您可以用Python導(dǎo)入未來版本的功能。它實(shí)際上就像時(shí)間旅行,魔術(shù)或其他東西。
from __future__ import print_function
print("Hello World!")
為什么不去導(dǎo)入花括號(hào)?
geopy
對(duì)于程序員來說,地理位置可能是一個(gè)具有挑戰(zhàn)性的領(lǐng)域(ha,a pun?。?。但是geopy模塊讓它變得非常簡單。
pip install geopy
它的工作原理是抽象出一系列不同地理編碼服務(wù)的API。它使您可以獲得一個(gè)地方的完整街道地址,緯度,經(jīng)度,甚至高度。
還有一個(gè)有用的距離類。它會(huì)計(jì)算您最喜歡的測量單位中兩個(gè)位置之間的距離。
from geopy import GoogleV3
place = "221b Baker Street, London"
location = GoogleV3().geocode(place)
print(location.address)
print(location.location)
howdoi
遇到編碼問題而忘記了之前看到過的解決方案?需要檢查StackOverflow,但不想離開終端?
然后你需要這個(gè)有用的命令行工具。
$ pip install howdoi
問你有什么問題,它會(huì)盡力回答。
$ howdoi vertical align css
$ howdoi for java in java
$ howdoi undo commits in git
請(qǐng)注意 - 它從StackOverflow的頂級(jí)答案中刪除代碼。它可能并不總能提供最有用的信息......
$ howdoi退出vim
inspect 檢查
Python的檢查模塊非常適合理解幕后發(fā)生的事情。你甚至可以自己調(diào)用它的方法!
下面的代碼示例inspect.getsource()用于打印自己的源代碼。它還inspect.getmodule()用于打印定義它的模塊。
最后一行代碼打印出自己的行號(hào)。
import inspect
print(inspect.getsource(inspect.getsource))
print(inspect.getmodule(inspect.getmodule))
print(inspect.currentframe().f_lineno)
當(dāng)然,除了這些微不足道的用途之外,檢查模塊對(duì)于理解代碼的作用非常有用。您也可以使用它來編寫自我記錄代碼。
Jedi
Jedi庫是一個(gè)代碼輔助和代碼分析的庫。它使編寫代碼更快,更高效。
除非您正在開發(fā)自己的IDE,否則您可能最感興趣的是將Jedi用作編輯器插件。幸運(yùn)的是,已經(jīng)可用了!
但是,您可能已經(jīng)在使用Jedi了。IPython項(xiàng)目利用Jedi實(shí)現(xiàn)其代碼自動(dòng)完成功能。
** kwargs
學(xué)習(xí)任何語言時(shí),沿途都有許多里程碑。使用Python,理解神秘的**kwargs語法可能算作一個(gè)。
字典對(duì)象前面的雙星號(hào)允許您將該字典的內(nèi)容作為命名參數(shù)傳遞給函數(shù)。
字典的鍵是參數(shù)名稱,值是傳遞給函數(shù)的值。你甚至不需要叫它kwargs!
dictionary = {"a": 1, "b": 2}
def someFunction(a, b):
print(a + b)
return
# these do the same thing:
someFunction(**dictionary)
someFunction(a=1, b=2)
當(dāng)您想要編寫可以處理未事先定義的命名參數(shù)的函數(shù)時(shí),這非常有用。
List comprehensions
我最喜歡用Python編程的一點(diǎn)是列表推導(dǎo)。
這些表達(dá)式可以很容易地編寫非常干凈的代碼,幾乎就像自然語言一樣。
您可以在此處詳細(xì)了解如何使用它們。
numbers = [1,2,3,4,5,6,7]
evens = [x for x in numbers if x % 2 is 0]
odds = [y for y in numbers if y not in evens]
cities = ['London', 'Dublin', 'Oslo']
def visit(city):
print("Welcome to "+city)
for city in cities:
visit(city)
map
Python通過許多內(nèi)置功能支持函數(shù)式編程。其中最有用的是map()函數(shù) - 特別是與lambda函數(shù)結(jié)合使用。
x = [1, 2, 3]
y = map(lambda x : x + 1 , x)
# prints out [2,3,4]
print(list(y))
在上面的示例中,map()將簡單的lambda函數(shù)應(yīng)用于每個(gè)元素x。它返回一個(gè)map對(duì)象,可以將其轉(zhuǎn)換為某個(gè)可迭代對(duì)象,例如list或tuple。
newspaper3k
如果你還沒有看過它,那么請(qǐng)準(zhǔn)備好讓你的思緒被Python的報(bào)紙模塊所震撼。
它允許您從一系列領(lǐng)先的國際出版物中檢索新聞文章和相關(guān)的元數(shù)據(jù)。您可以檢索圖像,文本和作者姓名。
它甚至還有一些內(nèi)置的NLP功能。
因此,如果您正在考慮將BeautifulSoup或其他DIY網(wǎng)頁爬蟲庫用于您的下一個(gè)項(xiàng)目,請(qǐng)節(jié)省您自己的時(shí)間和精力,用`$ pip install newspaper3k 代替。
Operator overloading 運(yùn)算符重載
Python提供了對(duì)運(yùn)算符重載的支持,這是使你聽起來像一個(gè)合法的計(jì)算機(jī)科學(xué)家的術(shù)語之一。
這實(shí)際上是一個(gè)簡單的概念。有沒有想過為什么Python允許你使用+運(yùn)算符來添加數(shù)字以及連接字符串?那是運(yùn)算符重載在起作用。
您可以按照自己的特定方式定義使用Python標(biāo)準(zhǔn)運(yùn)算符符號(hào)的對(duì)象。這使您可以在與您正在使用的對(duì)象相關(guān)的上下文中使用它們。
class Thing:
def __init__(self, value):
self.__value = value
def __gt__(self, other):
return self.__value > other.__value
def __lt__(self, other):
return self.__value < other.__value
something = Thing(100)
nothing = Thing(0)
# True
something > nothing
# False
something < nothing
# Error
something + nothing
pprint
Python的默認(rèn)print函數(shù)可以完成它的工作。但是嘗試打印出任何大的嵌套對(duì)象,結(jié)果相當(dāng)丑陋。
這是標(biāo)準(zhǔn)庫的漂亮打印模塊(Standard Library’s pretty-print module)的用武之地。它以易于閱讀的格式打印出復(fù)雜的結(jié)構(gòu)化對(duì)象。
任何使用非常規(guī)數(shù)據(jù)結(jié)構(gòu)的Python開發(fā)人員必備的。
import requests
import pprint
url = 'https://randomuser.me/api/?results=1'
users = requests.get(url).json()
pprint.pprint(users)
Queue 隊(duì)列
Python支持多線程,標(biāo)準(zhǔn)庫的隊(duì)列模塊為此提供了便利。
此模塊允許您實(shí)現(xiàn)隊(duì)列數(shù)據(jù)結(jié)構(gòu)。這些是允許您根據(jù)特定規(guī)則添加和檢索條目的數(shù)據(jù)結(jié)構(gòu)。
'先進(jìn)先出'(或FIFO)隊(duì)列允許您按照添加的順序檢索對(duì)象?!昂筮M(jìn)先出”(LIFO)隊(duì)列允許您首先訪問最近添加的對(duì)象。
最后,優(yōu)先級(jí)隊(duì)列允許您根據(jù)對(duì)象的排序順序檢索對(duì)象。
這是一個(gè)如何在Python中使用隊(duì)列進(jìn)行多線程編程的示例。
repr
在Python中定義類或?qū)ο髸r(shí),提供一種將該對(duì)象表示為字符串的“官方”方法很有用。例如:
>>> file = open('file.txt', 'r')
>>> print(file)
<open file 'file.txt', mode 'r' at 0x10d30aaf0>
這使調(diào)試代碼更容易。將其添加到您的類定義中,如下所示:
class someClass:
def __repr__(self):
return "<some description here>"
someInstance = someClass()
# prints <some description here>
print(someInstance)
SH
Python是一種很棒的腳本語言。有時(shí)使用標(biāo)準(zhǔn)的操作系統(tǒng)和子進(jìn)程庫可能會(huì)讓人頭疼。
該SH庫提供了一個(gè)整潔的替代品。
它允許您調(diào)用任何程序,就像它是一個(gè)普通函數(shù)一樣 - 對(duì)于自動(dòng)化工作流和任務(wù)非常有用,所有這些都來自Python。
import sh
sh.pwd()
sh.mkdir('new_folder')
sh.touch('new_file.txt')
sh.whoami()
sh.echo('This is great!')
Type hints
Python是一種動(dòng)態(tài)類型語言。定義變量,函數(shù),類等時(shí),不需要指定數(shù)據(jù)類型。
這允許快速開發(fā)時(shí)間。但是,有一些事情比簡單的鍵入問題導(dǎo)致的運(yùn)行時(shí)錯(cuò)誤更令人討厭。
從Python 3.5開始,您可以選擇在定義函數(shù)時(shí)提供類型提示。
def addTwo(x : Int) -> Int:
return x + 2
您還可以定義類型別名:
from typing import List
Vector = List[float]
Matrix = List[Vector]
def addMatrix(a : Matrix, b : Matrix) -> Matrix:
result = []
for i,row in enumerate(a):
result_row =[]
for j, col in enumerate(row):
result_row += [a[i][j] + b[i][j]]
result += [result_row]
return result
x = [[1.0, 0.0], [0.0, 1.0]]
y = [[2.0, 1.0], [0.0, -2.0]]
z = addMatrix(x, y)
雖然不是強(qiáng)制性的,但類型注釋可以使您的代碼更容易理解。
它們還允許您使用類型檢查工具在運(yùn)行時(shí)捕獲那些雜散的TypeErrors。如果您正在開展大型復(fù)雜項(xiàng)目,那可能是值得的!
uuid
生成通用唯一ID(或“UUID”)的快捷方法是通過Python標(biāo)準(zhǔn)庫的uuid模塊。
import uuid
user_id = uuid.uuid4()
print(user_id)
這會(huì)創(chuàng)建一個(gè)隨機(jī)的128位數(shù)字,幾乎肯定是唯一的。
實(shí)際上,可以生成超過2 12 2個(gè)可能的UUID。這超過五億十億(或5,000,000,000,000,000,000,000,000,000,000,000,000,000)。
在給定集合中找到重復(fù)的概率非常低。即使有萬億UUID,重復(fù)存在的可能性也遠(yuǎn)遠(yuǎn)低于十億分之一。
兩行代碼相當(dāng)不錯(cuò)。
Virtual environments
這可能是我最喜歡的Python的地方。
您有可能在任何時(shí)候都在處理多個(gè)Python項(xiàng)目。不幸的是,有時(shí)兩個(gè)項(xiàng)目將依賴于同一依賴項(xiàng)的不同版本。你在系統(tǒng)上安裝了哪些?
幸運(yùn)的是,Python 對(duì)虛擬環(huán)境的支持讓您擁有兩全其美的優(yōu)勢。從命令行:
python -m venv my-project
source my-project/bin/activate
pip install all-the-modules
現(xiàn)在,您可以在同一臺(tái)計(jì)算機(jī)上運(yùn)行獨(dú)立版本和Python安裝。
wikipedia 維基百科
維基百科有一個(gè)很棒的API,允許用戶以編程方式訪問無與倫比的完全免費(fèi)的知識(shí)和信息。
在維基百科模塊,使訪問該API幾乎令人意想不到的方便。
import wikipedia
result = wikipedia.page('freeCodeCamp')
print(result.summary)
for link in result.links:
print(link)
與真實(shí)網(wǎng)站一樣,該模塊提供對(duì)多種語言的支持,頁面消歧,隨機(jī)頁面檢索,甚至還有一種donate()方法。
XKCD
幽默是Python語言的一個(gè)關(guān)鍵特征 - 畢竟,它是以英國喜劇素描Monty Python的飛行馬戲團(tuán)命名的。Python的大部分官方文檔都引用了該劇最著名的草圖。
但幽默感并不局限于文檔。請(qǐng)按以下方式運(yùn)行:
import antigravity
永遠(yuǎn)不要改變,Python。從不改變。
YAML
YAML代表' YAML Is Not Markup Language '。它是一種數(shù)據(jù)格式化語言,是JSON的超集。
與JSON不同,它可以存儲(chǔ)更復(fù)雜的對(duì)象并引用它自己的元素。您還可以編寫注釋,使其特別適合編寫配置文件。
該PyYAML模塊可讓您使用YAML使用Python。安裝:
$ pip install pyyaml
然后導(dǎo)入到您的項(xiàng)目中:
import yaml
PyYAML允許您存儲(chǔ)任何數(shù)據(jù)類型的Python對(duì)象,以及任何用戶定義類的實(shí)例。
zip 壓縮
技巧的最后一招,真的很酷。曾經(jīng)需要從兩個(gè)列表中形成字典嗎?
keys = ['a', 'b', 'c']
vals = [1, 2, 3]
zipped = dict(zip(keys, vals))
該zip()內(nèi)置函數(shù)需要一系列可迭代的對(duì)象,并返回一個(gè)元組列表。每個(gè)元組按位置索引對(duì)輸入對(duì)象的元素進(jìn)行分組。
您也可以通過調(diào)用*zip()它們來“解壓縮”對(duì)象。