你想要的 Python 編程技巧,我都給你整理好了
Python 是這個世界上***的按需編程語言之一。其中包含很多原因:
-
易學習
-
應用范圍廣
-
具備非常多的模型和庫
Python 是我作為數據科學家日常生活中不可或缺的一部分。在學習 Python 的過程中,我領悟到了很多的方法和技巧。
在這里,我嘗試用 A-Z 的格式來做一些分享。
大部分的技巧是我在日常工作中使用的或是偶然發現的。 其中一些是在瀏覽 Python Standard Library docs 找到的。其他的一些是我在 PyPi 中搜索找到的。
但事實上,還是應該歸功于 awesome-python.com ,因為我在上面找到了四個或五個實用的技巧。這是數百個有趣的 Python 工具和模塊。非常值得瀏覽以獲取靈感。
all or any
Python 受歡迎的眾多原因之一是它的可讀性和易表達性。
人們經常笑稱 Python 是可執行的偽代碼。但當你寫出下述代碼,很難去反駁這種言論。
- 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
想在控制臺中繪圖嗎?
- $ pip install bashplotlib
使用上述命令行,即可在控制臺中繪圖。
集合
Python 內置默認的數據類型,但有時它們的使用效果會不盡如人意。
幸運的是,Python 的標準庫提供了 collections 模塊,這個方便的附加庫提供了更多的數據類型。
- from collections import OrderedDict, Counter x = OrderedDict(a=1, b=2, c=3) y = Counter("Hello World!")
dir
你是否曾經有過深入 Python 對象內部并且觀察它具備哪些屬性的想法呢?
輸入下述命令行:
- >>> dir() >>> dir("Hello World") >>> dir(dir)
以交互式運行 Python 時,這是一個非常實用的特征,并且可以動態地搜索正在使用的對象和模塊。
emoji
Python 包含 emoji 模塊,在這里!
- $ pip install emoji
別以為我不知道你會偷偷下載...
- from emoji import emojize print(emojize(":thumbs_up:"))
from _future_import
Python 流行的一個結果是新版本總是在開發中。新版本意味著新功能——除非版本已經過時
不過別擔心。_future_module 允許用戶通過函數導入新版本 Python 的功能。這就像是時間旅行,或是奇異魔法之類......
- from __future__ import print_function print("Hello World!")
為什么不導入花括號呢?
geopy
地理知識對于程序猿來說是非常大的挑戰是,但是 geopy 模塊讓它變得更簡單。
- $ pip install geopy
它通過提取不同的地理編碼服務 API 進行工作,以此能獲取一個地方的完整街道地址,經度,緯度,甚至是海拔高度。
geopy 還提供一個非常有用的距離類。它支持用戶喜歡的度量方式來計算兩個地點之間的距離。
- from geopy import GoogleV3 place = "221b Baker Street, London" location = GoogleV3().geocode(place) print(location.address) print(location.location)
howdoi
受困于編程問題并且不記得之前看到過的解決方法?用戶需要使用 StackOverflow ,但是不想離開終端?
那么需要使用這個非常使用的命令行工具 howdoi
- $ pip install howdoi
無論你有什么問題,它都會幫你解答。
- $ howdoi vertical align css $ howdoi for loop in java $ howdoi undo commits in git
但是請注意,它會從 StackOverflow 的***票答案中抓取代碼,這意味著它的回答并不總是最有用的。
- $ howdoi exit vim
inspect
Python 的 inspects 模塊對于理解背后的原理是非常有幫助的。用戶甚至可以在 inspect 模塊上調用其方法!
下述代碼示例使用
inspect.getsource()
來打印它的源代碼。同時它也使用
inspect.getmodule()
來打印定義它的模塊。
***一行代碼打印出自身的行號。
- import inspect print(inspect.getsource(inspect.getsource)) print(inspect.getmodule(inspect.getmodule)) print(inspect.currentframe().f_lineno)
當然,除了這些瑣碎的用途之外 , inspect 模塊還支持理解用戶代碼正在做什么。用戶還可以利用 Inspect 模塊編寫自文檔化代碼。
Jedi
Jedi 是一個自動完成以及代碼分析庫。它使得編寫代碼更加快速以及更高產。
除非用戶正在自主開發 IDE,否則肯定會對使用 Jedi 作為編輯器插件非常感興趣。幸運的是,已經開放下載。
用戶可能已經在使用 Jedi。 IPython 項目基于 Jedi 實現了代碼自動完成功能。
**kwargs
在學習任何編程語言時,一路上會遇到很多里程碑。在學習 Python 時,理解神秘的 **kwargs 是其中一塊里程碑。
字典前面的雙星號支持把字典的內容作為命名參數傳遞給函數。
字典的秘鑰是參數名,值是傳遞給函數的值,用戶甚至都不需要稱它為 kwargs
- dictionary = {"a": 1, "b": 2} def someFunction(a, b): print(a + b) return 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)
map
Python通過許多內置功能支持函數式編程,其中最有用的是 map()
特別是結合lambda函數使用時。
- x = [1, 2, 3] y = map(lambda x : x + 1 , x) print(list(y))
在上面的例子中 map() 對X中的每個元素應用了簡單的lambda函數
它返回一個map object類型,可以被轉換成一些可迭代對象,例如列表或元組
newspaper3k
如果你之前沒有見過newspaper3k的話,那么請準備好被這個Python的newspaper模塊所震撼吧
newspaper模塊允許你從一系列國際領先的出版物中檢索新聞文章和相關的元數據。你可以檢索圖像,文本和作者姓名。
newspaper模塊甚至有一些內置的NLP功能。
因此,如果你想在下一個項目中使用BeautifulSoup或其他DIY網頁查詢庫,節省自己的時間和精力,并改為
- $ pip install newspaper3k
Operator overloading
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) something > nothing something < nothing something + nothing
pprint
Python 的默認函數 print 可以實現打印功能,但是如果打印的嵌套對象體量比較大,就會發現打印結果不太美觀。
這時就需要用到標準庫pretty-print 模塊。它能用可讀性強的方式打印出復雜結構的對象。
Python 開發者的必備技能之一是處理復雜的數據結構。
- import requests import pprint url = 'https://randomuser.me/api/?results=1' users = requests.get(url).json() pprint.pprint(users)
Queue
Python 支持多線程,這可以通過標準庫的 Queue 模塊來實現。Queue 模塊讓用戶可以實現隊列數據結構,該數據結構允許用戶通過特定的方法添加和檢索數據。
“First in ,first out ”(或 FIFO) 隊列數據結構允許用戶依據對象添加的順序檢索對象,“Last in,first out”(LIFO)數據結構允許用戶先連接到最近添加的對象。
***,優先隊列允許用戶依據存儲順序檢索對象。
這是 Python 中針對多線程編程使用queues 的一個實例。
_rep r_
在 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() print(someInstance)
Sh
Python 是一種很棒的腳本語言。有時使用標準操作系統以及子進程庫是很令人頭疼的一個問題。
Sh 庫提供了一種簡介的替代方案。
它允許用戶在調用程序時如同調用函數一般,這對自動化工作流和任務非常有用。所有的都來自 Python 內部。
- from sh import * sh.pwd() sh.mkdir('new_folder') sh.touch('new_file.txt') sh.whoami() sh.echo('This is great!')
類型提示
Python 是動態語言,在定義變量,函數,類別……時無需指定數據類型。
這個設定允許快速開發,但是由于簡單的類型錯誤比運行錯誤更煩人。
從Python3.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)
盡管類型注釋是非強制性的,但是這能讓代碼更具可讀性。
Python3.5+ 還允許用戶使用類型提示工具在運行前知曉類型錯誤,這在大型的復雜項目中是非常值得的。
uuid
生成通用唯一標識符的快速簡便方法是Python 標準庫中的 uuid 模塊。
- import uuid user_id = uuid.uuid4() print(user_id)
它隨機生成 128位唯一數字。
事實上一共有 個可能生成的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 了。問題解決!
Wikipedia
Wikipedia 具備非常棒的 API ,允許用戶以編程方式訪問龐大的知識和信息。
Wikipedia 模塊使得訪問 Wikipedia API 非常地方便。
- import wikipedia result = wikipedia.page('freeCodeCamp') print(result.summary) for link in result.links: print(link)
和真實的 Wikipedia 類似,模塊支持多種語言,頁面消歧,隨機頁面檢索,甚至還有donate()方法
Xkcd
Humour 是 Python的關鍵特征——畢竟它的名字來源于英國喜劇片《Monty Python 的飛行馬戲團》,Python 的很多官方文檔引用了該片的情節。
Python 的幽默感并不局限于官方文檔 。運行下述命令行:
- import antigravity
希望Python 不要改變它的幽默風格
YAML
YAML ’t Markup Language。它是一種數據格式語言,是JSON 的超集
與 JSON不同的是,它可以存儲更復雜的對象并引用自己的元素。用戶可以編寫注釋,使其適用于編寫配置文件。
PyYAML模塊讓用戶在 Python 中使用 YAML 。安裝命令行如下:
- $ pip install pyyaml
然后導入到用戶的項目中:
- import yaml
PyYAML允許您存儲任何數據類型的Python對象,以及任何用戶定義類的實例。
Zip
***的一個 Python 技巧,它真的很棒。還在用兩個列表來組成字典這樣的方法嗎?
- keys = ['a', 'b', 'c'] vals = [1, 2, 3] zipped = dict(zip(keys, vals))
Zip() 內置函數使用多個可迭代對象作為輸入并返回元組列表。每個元組列表依據位置索引對輸入對象的元素進行分組。
用戶也可以使用 *zip() 來解壓對象
感謝閱讀
以上就是 A-Z 的 Python 技巧——相信你已經找到有用于下一個項目的技巧了。
Python 是一個非常多樣化并且發展良好的編程語言,所以我對 Python 許多非常棒的特征會有疏漏。