一份python實用”技巧“清單(按字母順序)

銀河1號發表於2019-04-08

Python是世界上最受歡迎,最流行的程式語言之一。這有很多原因:

  • 它很容易學習
  • 它是超級多用途的
  • 它有大量的模組和庫

作為資料科學家的我,每天使用Python是我內在工作的一部分。在這個過程中,我學會了一些有用的技巧和心得。

在這裡,我嘗試以A~Z順序共享其中一些。

大多數這些“技巧”是我在日常工作中使用或偶然發現的事情。一些是我在瀏覽Python標準庫文件時發現的。另外一些是通過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複製程式碼

您可以在控制檯中顯示圖表。

collections

Python有一些很棒的預設資料型別,但有時候它們的行為並不像你想要的那樣。

幸運的是,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!")複製程式碼

DIR

曾經想知道如何檢視Python物件並檢視它具有哪些屬性?你當然有。

從命令列:

>>> dir()
>>> dir("Hello World")
>>> dir(dir)複製程式碼

當以互動方式執行Python以及動態瀏覽您正在使用的物件和模組時,這可能是一個非常有用的功能。

在這裡閱讀更多。

emoji 表情符號

是的,真的

$ pip install emoji
from emoji import emojize
print(emojize(":thumbs_up:"))複製程式碼

from __future__ import

Python受歡迎的一個後果是一直有新的版本在開發中。新版本意味著新功能 - 除非您的版本已過時。

但是,不要害怕。該__future__模組,讓您可以用Python匯入未來版本的功能。它實際上就像時間旅行,魔術或其他東西。

from __future__ import print_function
print("Hello World!")複製程式碼

為什麼不去匯入花括號

geopy

對於程式設計師來說,地理位置可能是一個具有挑戰性的領域(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)複製程式碼

howdoi

遇到編碼問題而忘記了之前看到過的解決方案?需要檢查StackOverflow,但不想離開終端?

然後你需要這個有用的命令列工具

$ pip install howdoi複製程式碼

問你有什麼問題,它會盡力回答。

$ howdoi vertical align css 
$ howdoi for java in java 
$ howdoi undo commits in git複製程式碼

請注意 - 它從StackOverflow的頂級答案中刪除程式碼。它可能並不總能提供最有用的資訊......

$ howdoi退出vim複製程式碼

inspect 檢查

Python的檢查模組非常適合理解幕後發生的事情。你甚至可以自己呼叫它的方法!

下面的程式碼示例inspect.getsource()用於列印自己的原始碼。它還inspect.getmodule()用於列印定義它的模組。

最後一行程式碼列印出自己的行號。

import inspect
print(inspect.getsource(inspect.getsource))
print(inspect.getmodule(inspect.getmodule))
print(inspect.currentframe().f_lineno)複製程式碼

當然,除了這些微不足道的用途之外,檢查模組對於理解程式碼的作用非常有用。您也可以使用它來編寫自我記錄程式碼。

Jedi

Jedi庫是一個程式碼輔助和程式碼分析的庫。它使編寫程式碼更快,更高效。

除非您正在開發自己的IDE,否則您可能最感興趣的是將Jedi用作編輯器外掛。幸運的是,已經可用了!

但是,您可能已經在使用Jedi了。IPython專案利用Jedi實現其程式碼自動完成功能。

** kwargs

學習任何語言時,沿途都有許多里程碑。使用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)複製程式碼

當您想要編寫可以處理未事先定義的命名引數的函式時,這非常有用。

List comprehensions

我最喜歡用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)
# prints out [2,3,4]
print(list(y))複製程式碼

在上面的示例中,map()將簡單的lambda函式應用於每個元素x。它返回一個map物件,可以將其轉換為某個可迭代物件,例如list或tuple。

newspaper3k

如果你還沒有看過它,那麼請準備好讓你的思緒被Python的報紙模組所震撼

它允許您從一系列領先的國際出版物中檢索新聞文章和相關的後設資料。您可以檢索影像,文字和作者姓名。

它甚至還有一些內建的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)
# True
something > nothing
# False
something < nothing
# Error
something + nothing複製程式碼

pprint

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)複製程式碼

Queue 佇列

Python支援多執行緒,標準庫的佇列模組為此提供了便利。

此模組允許您實現佇列資料結構。這些是允許您根據特定規則新增和檢索條目的資料結構。

'先進先出'(或FIFO)佇列允許您按照新增的順序檢索物件。“後進先出”(LIFO)佇列允許您首先訪問最近新增的物件。

最後,優先順序佇列允許您根據物件的排序順序檢索物件。

這是一個如何在Python中使用佇列進行多執行緒程式設計的示例

__repr__

在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)複製程式碼

SH

Python是一種很棒的指令碼語言。有時使用標準的作業系統和子程式庫可能會讓人頭疼。

SH庫提供了一個整潔的替代品。

它允許您呼叫任何程式,就像它是一個普通函式一樣 - 對於自動化工作流和任務非常有用,所有這些都來自Python。

import sh
sh.pwd()
sh.mkdir('new_folder')
sh.touch('new_file.txt')
sh.whoami()
sh.echo('This is great!')複製程式碼

Type hints

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。如果您正在開展大型複雜專案,那可能是值得的!

uuid

生成通用唯一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,重複存在的可能性也遠遠低於十億分之一。

兩行程式碼相當不錯。

Virtual environments

這可能是我最喜歡的Python的地方。

您有可能在任何時候都在處理多個Python專案。不幸的是,有時兩個專案將依賴於同一依賴項的不同版本。你在系統上安裝了哪些?

幸運的是,Python 對虛擬環境支援讓您擁有兩全其美的優勢。從命令列:

python -m venv my-project
source my-project/bin/activate
pip install all-the-modules複製程式碼

現在,您可以在同一臺計算機上執行獨立版本和Python安裝。

wikipedia 維基百科

維基百科有一個很棒的API,允許使用者以程式設計方式訪問無與倫比的完全免費的知識和資訊。

維基百科模組,使訪問該API幾乎令人意想不到的方便。

import wikipedia
result = wikipedia.page('freeCodeCamp')
print(result.summary)
for link in result.links:
    print(link)複製程式碼

與真實網站一樣,該模組提供對多種語言的支援,頁面消歧,隨機頁面檢索,甚至還有一種donate()方法。

XKCD

幽默是Python語言的一個關鍵特徵 - 畢竟,它是以英國喜劇素描Monty Python的飛行馬戲團命名。Python的大部分官方文件都引用了該劇最著名的草圖。

但幽默感並不侷限於文件。請按以下方式執行:

import antigravity複製程式碼

永遠不要改變,Python。從不改變。

YAML

YAML代表' YAML Is Not Markup Language '。它是一種資料格式化語言,是JSON的超集。

與JSON不同,它可以儲存更復雜的物件並引用它自己的元素。您還可以編寫註釋,使其特別適合編寫配置檔案。

PyYAML模組可讓您使用YAML使用Python。安裝:

$ pip install pyyaml複製程式碼

然後匯入到您的專案中:

import yaml複製程式碼

PyYAML允許您儲存任何資料型別的Python物件,以及任何使用者定義類的例項。

zip 壓縮

技巧的最後一招,真的很酷。曾經需要從兩個列表中形成字典嗎?

keys = ['a', 'b', 'c']
vals = [1, 2, 3]
zipped = dict(zip(keys, vals))複製程式碼

zip()內建函式需要一系列可迭代的物件,並返回一個元組列表。每個元組按位置索引對輸入物件的元素進行分組。

您也可以通過呼叫*zip()它們來“解壓縮”物件。

謝謝閱讀!

檢視英文原文

檢視更多文章

公眾號:銀河系1號
聯絡郵箱:public@space-explore.com
(未經同意,請勿轉載)


相關文章