Python是世界上最受歡迎,最流行的編程語言之一。這有不少緣由:css
做爲數據科學家的我,天天使用Python是我內在工做的一部分。在這個過程當中,我學會了一些有用的技巧和心得。html
在這裏,我嘗試以A~Z順序共享其中一些。java
大多數這些「技巧」是我在平常工做中使用或偶然發現的事情。一些是我在瀏覽Python標準庫文檔時發現的。另一些是經過PyPi搜索到的。python
可是,應該歸功於它 - 我在awesome-python.com上發現了其中的四個或五個。這是數百個有趣的Python工具和模塊的精選列表。這是值得瀏覽的靈感!git
Python是如此流行的編程語言的緣由之一是由於具備可讀性和表現力。程序員
人們常常開玩笑說Python是' 可執行的僞代碼 '。可是當你能夠編寫這樣的代碼時,很難反駁:github
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")複製代碼
您想在控制檯中繪製圖表嗎?express
$ pip install bashplotlib複製代碼
您能夠在控制檯中顯示圖表。編程
Python有一些很棒的默認數據類型,但有時候它們的行爲並不像你想要的那樣。json
幸運的是,Python標準庫提供了集合模塊。這個方便的附加組件爲您提供了更多的數據類型。
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!")複製代碼
曾經想知道如何查看Python對象並查看它具備哪些屬性?你固然有。
從命令行:
>>> dir()
>>> dir("Hello World")
>>> dir(dir)複製代碼
當以交互方式運行Python以及動態瀏覽您正在使用的對象和模塊時,這多是一個很是有用的功能。
在這裏閱讀更多。
是的,真的。
$ pip install emoji
from emoji import emojize
print(emojize(":thumbs_up:"))複製代碼
Python受歡迎的一個後果是一直有新的版本在開發中。新版本意味着新功能 - 除非您的版本已過期。
可是,不要懼怕。該__future__模塊,讓您能夠用Python導入將來版本的功能。它實際上就像時間旅行,魔術或其餘東西。
from __future__ import print_function
print("Hello World!")複製代碼
爲何不去導入花括號?
對於程序員來講,地理位置多是一個具備挑戰性的領域(ha,a pun!)。可是geopy模塊讓它變得很是簡單。
pip install geopy複製代碼
它的工做原理是抽象出一系列不一樣地理編碼服務的API。它使您能夠得到一個地方的完整街道地址,緯度,經度,甚至高度。
還有一個有用的距離類。它會計算您最喜歡的測量單位中兩個位置之間的距離。
from geopy import GoogleV3
place = "221b Baker Street, London"
location = GoogleV3().geocode(place)
print(location.address)
print(location.location)複製代碼
遇到編碼問題而忘記了以前看到過的解決方案?須要檢查StackOverflow,但不想離開終端?
而後你須要這個有用的命令行工具。
$ pip install howdoi複製代碼
問你有什麼問題,它會盡力回答。
$ howdoi vertical align css
$ howdoi for java in java
$ howdoi undo commits in git複製代碼
請注意 - 它從StackOverflow的頂級答案中刪除代碼。它可能並不總能提供最有用的信息......
$ howdoi退出vim複製代碼
Python的檢查模塊很是適合理解幕後發生的事情。你甚至能夠本身調用它的方法!
下面的代碼示例inspect.getsource()
用於打印本身的源代碼。它還inspect.getmodule()
用於打印定義它的模塊。
最後一行代碼打印出本身的行號。
import inspect
print(inspect.getsource(inspect.getsource))
print(inspect.getmodule(inspect.getmodule))
print(inspect.currentframe().f_lineno)複製代碼
固然,除了這些微不足道的用途以外,檢查模塊對於理解代碼的做用很是有用。您也可使用它來編寫自我記錄代碼。
Jedi庫是一個代碼輔助和代碼分析的庫。它使編寫代碼更快,更高效。
除非您正在開發本身的IDE,不然您可能最感興趣的是將Jedi用做編輯器插件。幸運的是,已經可用了!
可是,您可能已經在使用Jedi了。IPython項目利用Jedi實現其代碼自動完成功能。
學習任何語言時,沿途都有許多里程碑。使用Python,理解神祕的**kwargs
語法可能算做一個。
字典對象前面的雙星號容許您將該字典的內容做爲命名參數傳遞給函數。
字典的鍵是參數名稱,值是傳遞給函數的值。你甚至不須要叫它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)複製代碼
當您想要編寫能夠處理未事先定義的命名參數的函數時,這很是有用。
我最喜歡用Python編程的一點是列表推導。
這些表達式能夠很容易地編寫很是乾淨的代碼,幾乎就像天然語言同樣。
您能夠在此處詳細瞭解如何使用它們。
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)複製代碼
Python經過許多內置功能支持函數式編程。其中最有用的是map()
函數 - 特別是與lambda函數結合使用。
x = [1, 2, 3]
y = map(lambda x : x + 1 , x)
# prints out [2,3,4]
print(list(y))複製代碼
在上面的示例中,map()
將簡單的lambda函數應用於每一個元素x
。它返回一個map對象,能夠將其轉換爲某個可迭代對象,例如list或tuple。
若是你尚未看過它,那麼請準備好讓你的思緒被Python的報紙模塊所震撼。
它容許您從一系列領先的國際出版物中檢索新聞文章和相關的元數據。您能夠檢索圖像,文本和做者姓名。
它甚至還有一些內置的NLP功能。
所以,若是您正在考慮將BeautifulSoup或其餘DIY網頁爬蟲庫用於您的下一個項目,請節省您本身的時間和精力,用`$ pip install newspaper3k 代替。
Python提供了對運算符重載的支持,這是使你聽起來像一個合法的計算機科學家的術語之一。
這其實是一個簡單的概念。有沒有想過爲何Python容許你使用+
運算符來添加數字以及鏈接字符串?那是運算符重載在起做用。
您能夠按照本身的特定方式定義使用Python標準運算符符號的對象。這使您能夠在與您正在使用的對象相關的上下文中使用它們。
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複製代碼
Python的默認print
函數能夠完成它的工做。可是嘗試打印出任何大的嵌套對象,結果至關醜陋。
這是標準庫的漂亮打印模塊(Standard Library’s pretty-print module)的用武之地。它以易於閱讀的格式打印出複雜的結構化對象。
任何使用很是規數據結構的Python開發人員必備的。
import requests
import pprint
url = 'https://randomuser.me/api/?results=1'
users = requests.get(url).json()
pprint.pprint(users)複製代碼
Python支持多線程,標準庫的隊列模塊爲此提供了便利。
此模塊容許您實現隊列數據結構。這些是容許您根據特定規則添加和檢索條目的數據結構。
'先進先出'(或FIFO)隊列容許您按照添加的順序檢索對象。「後進先出」(LIFO)隊列容許您首先訪問最近添加的對象。
最後,優先級隊列容許您根據對象的排序順序檢索對象。
在Python中定義類或對象時,提供一種將該對象表示爲字符串的「官方」方法頗有用。例如:
>>> file = open('file.txt', 'r')
>>> print(file)
<open file 'file.txt', mode 'r' at 0x10d30aaf0>複製代碼
這使調試代碼更容易。將其添加到您的類定義中,以下所示:
class someClass:
def __repr__(self):
return "<some description here>"
someInstance = someClass()
# prints <some description here>
print(someInstance)複製代碼
Python是一種很棒的腳本語言。有時使用標準的操做系統和子進程庫可能會讓人頭疼。
該SH庫提供了一個整潔的替代品。
它容許您調用任何程序,就像它是一個普通函數同樣 - 對於自動化工做流和任務很是有用,全部這些都來自Python。
import sh
sh.pwd()
sh.mkdir('new_folder')
sh.touch('new_file.txt')
sh.whoami()
sh.echo('This is great!')複製代碼
Python是一種動態類型語言。定義變量,函數,類等時,不須要指定數據類型。
這容許快速開發時間。可是,有一些事情比簡單的鍵入問題致使的運行時錯誤更使人討厭。
從Python 3.5開始,您能夠選擇在定義函數時提供類型提示。
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)複製代碼
雖然不是強制性的,但類型註釋可使您的代碼更容易理解。
它們還容許您使用類型檢查工具在運行時捕獲那些雜散的TypeErrors。若是您正在開展大型複雜項目,那多是值得的!
生成通用惟一ID(或「UUID」)的快捷方法是經過Python標準庫的uuid模塊。
import uuid
user_id = uuid.uuid4()
print(user_id)複製代碼
這會建立一個隨機的128位數字,幾乎確定是惟一的。
實際上,能夠生成超過2 12 2個可能的UUID。這超過五億十億(或5,000,000,000,000,000,000,000,000,000,000,000,000,000)。
在給定集合中找到重複的機率很是低。即便有萬億UUID,重複存在的可能性也遠遠低於十億分之一。
兩行代碼至關不錯。
這多是我最喜歡的Python的地方。
您有可能在任什麼時候候都在處理多個Python項目。不幸的是,有時兩個項目將依賴於同一依賴項的不一樣版本。你在系統上安裝了哪些?
幸運的是,Python 對虛擬環境的支持讓您擁有一箭雙鵰的優點。從命令行:
python -m venv my-project
source my-project/bin/activate
pip install all-the-modules複製代碼
如今,您能夠在同一臺計算機上運行獨立版本和Python安裝。
維基百科有一個很棒的API,容許用戶以編程方式訪問無與倫比的徹底免費的知識和信息。
在維基百科模塊,使訪問該API幾乎使人意想不到的方便。
import wikipedia
result = wikipedia.page('freeCodeCamp')
print(result.summary)
for link in result.links:
print(link)複製代碼
與真實網站同樣,該模塊提供對多種語言的支持,頁面消歧,隨機頁面檢索,甚至還有一種donate()
方法。
幽默是Python語言的一個關鍵特徵 - 畢竟,它是以英國喜劇素描Monty Python的飛行馬戲團命名的。Python的大部分官方文檔都引用了該劇最着名的草圖。
但幽默感並不侷限於文檔。請按如下方式運行:
import antigravity複製代碼
永遠不要改變,Python。從不改變。
YAML表明' YAML Is Not Markup Language '。它是一種數據格式化語言,是JSON的超集。
與JSON不一樣,它能夠存儲更復雜的對象並引用它本身的元素。您還能夠編寫註釋,使其特別適合編寫配置文件。
該PyYAML模塊可以讓您使用YAML使用Python。安裝:
$ pip install pyyaml複製代碼
而後導入到您的項目中:
import yaml複製代碼
PyYAML容許您存儲任何數據類型的Python對象,以及任何用戶定義類的實例。
技巧的最後一招,真的很酷。曾經須要從兩個列表中造成字典嗎?
keys = ['a', 'b', 'c']
vals = [1, 2, 3]
zipped = dict(zip(keys, vals))複製代碼
該zip()
內置函數須要一系列可迭代的對象,並返回一個元組列表。每一個元組按位置索引對輸入對象的元素進行分組。
您也能夠經過調用*zip()
它們來「解壓縮」對象。
公衆號:銀河系1號聯繫郵箱:public@space-explore.com(未經贊成,請勿轉載)