你想要的Python編程技巧,我都給你整理好了

2021-03-02 戀習Python

這是戀習Python推薦的第11篇好文

翻譯|蔣餘杭、李灝   校對|志豪   整理|志豪

來源|AI研習社

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 模塊,在這裡!

別以為我不知道你會偷偷下載...

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 模塊讓它變得更簡單。

它通過提取不同的地理編碼服務 API 進行工作,以此能獲取一個地方的完整街道地址,經度,緯度,甚至是海拔高度。

geopy 還提供一個非常有用的距離類。它支持用戶喜歡的度量方式來計算兩個地點之間的距離。

from geopy import GoogleV3
place = "221b Baker Street, London"
location = GoogleV3().geocode(place)
print(location.address)
print(location.location)


howdoi 

受困於編程問題並且不記得之前看到過的解決方法?用戶需要使用 StackOverflow ,但是不想離開終端?

那麼需要使用這個非常使用的命令行工具 howdoi 

無論你有什麼問題,它都會幫你解答。

$ howdoi vertical align css
$ howdoi for loop in java
$ howdoi undo commits in git

但是請注意,它會從 StackOverflow 的最高票答案中抓取代碼,這意味著它的回答並不總是最有用的。


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 的幽默感並不局限於官方文檔 。運行下述命令行:

希望Python 不要改變它的幽默風格

YAML

YAML ’t  Markup Language。它是一種數據格式語言,是JSON 的超集

與 JSON不同的是,它可以存儲更複雜的對象並引用自己的元素。用戶可以編寫注釋,使其適用於編寫配置文件。

PyYAML模塊讓用戶在 Python 中使用 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 許多非常棒的特徵會有疏漏。

想要繼續查看該篇文章更多代碼、連結和參考文獻?

戳連結:

http://www.gair.link/page/TextTranslation/948

怕你錯過

點擊圖片即可跳轉文章

數說|月餅之王花落誰手?全網都在銷售它!


相關焦點

  • 乾貨 | 從 A 到 Z 的 Python 編程技巧
    它能使用你選定的度量去計算了兩個地點之間的距離。有時候你碰到了一個編程問題,覺得自己之前明明見過它的解決方法,但是卻記不起來具體是怎麼樣的了。於是你想要去StackOverflow上找,但又不想離開這個終端。這個時候,你需要下面這個工具——howdoi你所遇到的任何問題都可以問它,它會盡他所能給你返回一個答案。需要注意的是——它只從StackOverflow最頂端的答案中抓取代碼。
  • 零基礎學python,你需要掌握這8個技巧!
    作為這幾年火爆的python,想要零基礎起步學習,興趣愛好是首要的,什麼語言都是入門簡單,精通難。相比java,c等語言來說python極其容易入門,但是簡單的語法也正是它的缺點,靈活導致很多bug在運行過程中才能發現,導致多人協同上很難保證統一的風格。
  • 杭州少兒編程培訓機構哪家好?少兒編程Python語言好學嗎
    少兒編程Python語言好學嗎Python語言好學嗎我們都知道,在當下這個大數據時代,要想走在時代的前沿,就必須學習先進有用的知識。現在,人工智慧和數據分析正在蓬勃發展,python是一顆冉冉升起的新星。有人說python可能是所有語言中最適合人類編程的。為什麼?因為python比任何其他語言更高效、更快、更強大!
  • 容易被忽略的Python高效編程技巧
    【IT168 技術】我已經使用Python編程有多年了,即使今天我仍然驚奇於這種語言所能讓代碼表現出的整潔和對DRY編程原則的適用。這些年來的經歷讓我學到了很多的小技巧和知識,大多數是通過閱讀很流行的開源軟體,如Django, Flask, Requests中獲得的。
  • 程式語言那麼多,為何都建議你學Python
    當然,學習編程不分早晚,26歲以後才開始學習變成的工作者當中,也有36%是現在的高級別的開發人員,他們是編程開發的中堅力量,在編程工作中也佔比較大的比例,而且當前企業聘請的大多數程式設計師也是這些人群。高薪酬以及人工智慧的發展,吸引了越來越多的人加入學習編程的行列,但是,學習哪種語言入門,就難到了很多「小白」。
  • 教你怎麼用 Python 自動整理文件
    我以前經常把下載的東西放在桌面或者「下載」文件夾中,使用完後再也沒管它,久而久之便變得亂七八糟,再整理的時候非常痛苦,巴不得有一個自動化的工具幫我歸類文檔。不知道你是不是有過跟我一樣糟糕的體驗,不過,前段時間我用Python做了一個根據後綴名整理文件的工具,先來看看效果:自動整理前:自動整理後:效果非常好,舒服多了如果你想要直接下載原始碼試試看,請在公眾號後臺回復文件自動整理獲得原始碼下載地址。
  • 潘石屹也要學編程了?Python 之父:並非人人都需要了解計算機發生了...
    因為當時的程式語言存在缺陷,他決定創建一種新的語言——一種更易於使用又功能強大的語言。「我的初衷就想著,好吧,為什麼我不開發一種自己的語言,我可以利用現有的ABC語言,但將開發規模從需要三年完成的大項目縮小到自己可以在三個月內完成的小項目,於是python誕生了。」Van Rossum說到。
  • 鄭州金水少兒編程Python10-16歲哪家好?
    課程介紹樂博樂博少兒編程Python少兒編程你了解嗎樂博樂博Python課程是基於CSTA頒布的《K-12 階段計算機科學標準》研發,採用圖形+源碼對照的編程模式,逐步讓孩子過渡到源碼編程的世界。  能力的提升編程知識對標青少年編程能力等級第2部分:Python編程。學習樂博樂博Python基礎語法知識,包括順序結構、循環結構、分支結構的語法規則,教授孩子更多的源碼編程技巧,讓孩子逐步適應源碼編程的方式。
  • 西安雁塔少兒編程Python10-16歲哪家好?
    課程介紹樂博樂博少兒編程Python少兒編程你了解嗎樂博樂博Python課程是基於CSTA頒布的《K-12 階段計算機科學標準》研發,採用圖形+源碼對照的編程模式,逐步讓孩子過渡到源碼編程的世界。  能力的提升編程知識對標青少年編程能力等級第2部分:Python編程。學習樂博樂博Python基礎語法知識,包括順序結構、循環結構、分支結構的語法規則,教授孩子更多的源碼編程技巧,讓孩子逐步適應源碼編程的方式。
  • 2018年學習編程是學習JAVA好還是學習python好?
    2018年世界程式語言熱度排名python首次超出java,很多同學想學習編程,但是選擇哪門語言方面很糾結,過去幾年java一直排名第一,選擇java無話可說,新的熱度是不是會持續下去,Java還那麼吃香嗎?成為選擇的一個就節點。
  • 掌握這10個python技巧,讓你代碼工作如魚得水!
    但要問程式語言流行指數之王非,那真的非Python莫屬了。據Stack Overflow數據顯示,Python是使用量增長最快的程式語言。福布斯最新發布的一篇報告指出,python的使用量在去年增長了456%。Netfix、IBM以及其它數以百計的公司都在使用python。包括Dropbox也是由python創建的。
  • 開始你的編程之旅吧!從Python入門講起……
    先回答這個問題為什麼想學程式語言? 在進一步閱讀之前,請仔細思考,並把原因寫在紙上。有一天我也問了我的學生同樣的問題。他們給了我這些回答:「我想在著名的軟體公司找一份好工作,所以我需要學習一門程式語言。」
  • Python編程學了有用嗎?
    Python編程學了有用嗎?眾所周知,目前家長對於孩子的教育越來越重視,培養孩子的編程思維也是大家關心的話題,孩子學習Python語言,需要使用精確到標點、分號等特殊字符,可以提高孩子的編程能力和邏輯思維能力。作為成成年人學python編程可以大大提高工作效率。
  • Python高級編程技巧
    聽起來是不是很像Java中的面向切面編程(Aspect-Oriented Programming)概念?兩者都很簡單,並且裝飾器有著更為強大的功能。舉個例子,假定你希望在一個函數的入口和退出點做一些特別的操作(比如一些安全、追蹤以及鎖定等操作)就可以使用裝飾器。
  • 牛逼的Python書,你看過幾本?
    (我不是給作者打廣告,而是良心推薦)2.Python核心編程核心編程可以說一本大寶典大寶庫,把python的方方面面都包含在裡面的,非常不錯,很少有python的書講的這麼全面.書雖然叫核心編程,但是也是適合初學者閱讀,作者非常貼心的把Python分成兩大部分:第一部分: 是一些基本的語法和重要的知識點
  • 初學者入門編程應該學C+ +、Java還是Python?
    跨行業,拿高薪對於大多數的轉行者來說,學習編程的目的就是想找一份高薪的工作,那麼肯定是哪個程式語言的就業前景好,就越值得學習。現實很殘酷如果生活都是問題了,那麼時間是主要的制約因素,所以在選擇的時候速成方面的程式語言就比較容易受到歡迎。在這方面前端語言以及python都是不錯的選擇,只要進入編程思維狀態能很快學到東西。
  • 這些Python代碼技巧,你肯定還不知道
    本文或許能夠讓你學到一些新技巧。想要了解更多,點這裡:https://docs.python.org/3/library/functions.html#diremoji$ pip install howdoi無論你有什麼問題都可以問它,它會盡力回答。
  • scratch/python/c++,小孩學編程學哪個好?
    市面上的少兒編程培訓機構基本都是scratch編程教育。如果從零開始學習scratch,可以關注本號,本號將發布公益性教程。編程貓是我國的一款優秀軟體,它模仿了scratch,並進行了大規模改進,但基本邏輯都是一樣的。編程貓的公司點貓科技獲得了多輪融資,並積極進行教材化操作,應該是很有前途的軟體。
  • 哪些人適合學習python?來看看你有沒有成功入選
    那就是編程,而在程式語言世界裡,python是所有程式語言中和自然語言或者說偽代碼最像的,許多AI產品都是由python這個強大的資料庫來開發。按照目前來看,掌握了Python的人,未來的職業道路是不會差的,當然工資待遇也不會差。
  • 無所不能的python編程是怎麼快速畫圖的呢?5分鐘學會!
    Python支持命令式程序設計、面向對象程序設計、函數式編程、面向切面編程、泛型編程多種編程範式。與Scheme、Ruby、Perl、Tcl等動態語言一樣,Python具備垃圾回收功能,能夠自動管理存儲器使用。它經常被當作腳本語言用於處理系統管理任務和網絡程序編寫,然而它也非常適合完成各種高級任務。Python虛擬機本身幾乎可以在所有的作業系統中運行。