24個(gè)好用到爆的 Python 實(shí)用技巧

前言

Python 是世界上最受歡迎啥刻、最受歡迎的編程語言之一,是有很多原因咪笑。

  • 很容易學(xué)
  • 有超級(jí)多的功能
  • 它有大量的模塊和庫

作為一名數(shù)據(jù)工作者可帽,我們每天都在使用 Python處理大多數(shù)工作。在此過程中窗怒,我們會(huì)不斷學(xué)到了一些有用的技巧和竅門映跟。

在這里,我嘗試以 A - Z 開頭的格式分享這些技巧中的一些兜粘,并且在本文中簡單介紹這些方法申窘,如果你對(duì)其中一個(gè)或多個(gè)感興趣,你可以通過文末參考資料查看官方文檔孔轴。希望對(duì)你能有所幫助剃法。

all or any

Python 語言如此流行的眾多原因之一,是因?yàn)樗哂泻芎玫目勺x性和表現(xiàn)力路鹰。

人們經(jīng)常開玩笑說 Python 是可執(zhí)行的偽代碼贷洲。當(dāng)你可以像這樣寫代碼時(shí),就很難反駁晋柱。

x = [True, True, False]
if any(x):
    print("至少有一個(gè)True")
if all(x):
    print("全是True")
if any(x) and not all(x):
    print("至少一個(gè)True和一個(gè)False")

bashplotlib

你有沒有想過在控制臺(tái)中繪制圖形嗎优构?

Bashplotlib 是一個(gè) Python 庫,他能夠幫助我們?cè)诿钚?粗曠的環(huán)境)中繪制數(shù)據(jù)雁竞。

# 模塊安裝
pip install bashplotlib
# 繪制實(shí)例
import numpy as np
from bashplotlib.histpgram import plot_hist
arr = np.ramdom.normal(size=1000, loc=0, scale=1)
plot_hist(arr, bincount=50)

collections

Python 有一些很棒的默認(rèn)數(shù)據(jù)類型钦椭,但有時(shí)它們的行為并不完全符合你的期望。

幸運(yùn)的是碑诉,Python 標(biāo)準(zhǔn)庫提供了 collections 模塊彪腔。這個(gè)方便的附加組件為你提供了更多的數(shù)據(jù)類型。

from collections import OrderedDict, Counter
# 記住鍵的添加順序进栽!
x = OrderedDict(a=1, b=2, c=3)
# 統(tǒng)計(jì)每個(gè)字符出現(xiàn)的頻率
y = Counter("Hello World!")

dir

有沒有想過如何查看 Python 對(duì)象內(nèi)部并查看它具有哪些屬性德挣? 在命令行中輸入:

dir() 
dir("Hello World") 
dir(dir)

當(dāng)以交互方式運(yùn)行 Python 以及動(dòng)態(tài)探索你正在使用的對(duì)象和模塊時(shí),這可能是一個(gè)非常有用的功能快毛。在這里閱讀更多functions相關(guān)內(nèi)容格嗅。

emoji

emoji 是日本在無線通信中所使用的視覺情感符號(hào),繪指圖畫唠帝,文字指的則是字符屯掖,可用來代表多種表情,如笑臉表示笑襟衰、蛋糕表示食物等懂扼。在中國大陸,emoji通常叫做“小黃臉”,或者直稱emoji阀湿。

# 安裝模塊
pip install emoji
# 做個(gè)嘗試
from emoji import emojize
print(emojize(":thumbs_up:"))

??

from __future__ import

Python 流行的結(jié)果之一赶熟,總是有新版本正在開發(fā)中。新版本意味著新功能 —— 除非你的版本已過時(shí)陷嘴。

不過不要擔(dān)心映砖。使用該__future__模塊可以幫助你用Python的未來版本導(dǎo)入功能。從字面上看灾挨,這就像時(shí)間旅行邑退、魔法或其他東西。

from __future__ import print_function
print("Hello World!")

geogy

地理劳澄,對(duì)大多數(shù)程序員來說是一個(gè)具有挑戰(zhàn)性的領(lǐng)域地技。在獲取地理信息或者繪制地圖時(shí),也會(huì)遇到不少問題秒拔。這個(gè)geopy 模塊讓地理相關(guān)內(nèi)容變得非常容易莫矗。

pip install geopy

它通過抽象一系列不同地理編碼服務(wù)的 API 來工作。通過它砂缩,你能夠獲得一個(gè)地方的完整街道地址肾胯、緯度竟稳、經(jīng)度甚至海拔高度。

還有一個(gè)有用的距離類妈候。它以你偏好的測(cè)量單位計(jì)算兩個(gè)位置之間的距離第美。

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

howdoi

當(dāng)你使用terminal終端編程時(shí)烈掠,通過在遇到問題后會(huì)在StackOverflow上搜索答案抑淫,完后會(huì)回到終端繼續(xù)編程幻件,此時(shí)有時(shí)會(huì)不記得你之前查到的解決方案,此時(shí)需要重新查看StackOverflow好乐,但又不想離開終端单绑,那么此時(shí)你需要用到這個(gè)有用的命令行工具howdoi

pip install howdoi

無論你有什么問題曹宴,都可以問它,它會(huì)盡力回復(fù)歉提。

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

但請(qǐng)注意——它會(huì)從 StackOverflow 的最佳答案中抓取代碼笛坦。它可能并不總是提供最有用的信息......

howdoi exit vim

inspect

Python 的inspect模塊非常適合了解幕后發(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)然礁芦,除了這些微不足道的用途,inspect 模塊可以證明對(duì)理解你的代碼在做什么很有用。你還可以使用它來編寫自文檔化代碼柿扣。

Jedi

Jedi 庫是一個(gè)自動(dòng)完成和代碼分析庫肖方。它使編寫代碼更快、更高效未状。

除非你正在開發(fā)自己的 IDE俯画,否則你可能對(duì)使用Jedi 作為編輯器插件比較感興趣。幸運(yùn)的是司草,這已經(jīng)有可用的負(fù)載艰垂!

**kwargs

在學(xué)習(xí)任何語言時(shí),都會(huì)有許多里程碑埋虹。使用 Python 并理解神秘的**kwargs語法可能算作一個(gè)重要的里程碑猜憎。

字典對(duì)象前面的雙星號(hào)**kwargs允許你將該字典的內(nèi)容作為命名參數(shù)傳遞給函數(shù)。

字典的鍵是參數(shù)名稱搔课,值是傳遞給函數(shù)的值胰柑。你甚至不需要調(diào)用它kwargs

dictionary = {"a": 1, "b": 2}
def someFunction(a, b):
    print(a + b)
    return
# 這些做同樣的事情:
someFunction(**dictionary)
someFunction(a=1, b=2)

當(dāng)你想編寫可以處理未預(yù)先定義的命名參數(shù)的函數(shù)時(shí)辣辫,這很有用旦事。

列表(list)推導(dǎo)式

關(guān)于 Python 編程,我最喜歡的事情之一是它的列表推導(dǎo)式急灭。

這些表達(dá)式可以很容易地編寫非常順暢的代碼姐浮,幾乎與自然語言一樣。

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é)合使用時(shí)卖鲤。

x = [1, 2, 3] 
y = map(lambda x : x + 1, x)
# 打印出 [2,3,4]
print(list(y))

在上面的示例中,map()將一個(gè)簡單的 lambda 函數(shù)應(yīng)用于x. 它返回一個(gè)映射對(duì)象畴嘶,該對(duì)象可以轉(zhuǎn)換為一些可迭代對(duì)象蛋逾,例如列表或元組。

newspaper3k

如果你還沒有看過它窗悯,那么準(zhǔn)備好被Python newspaper module 模塊震撼到区匣。它使你可以從一系列領(lǐng)先的國際出版物中檢索新聞文章和相關(guān)的元數(shù)據(jù)。你可以檢索圖像蒋院、文本和作者姓名亏钩。它甚至有一些內(nèi)置的 NLP 功能

因此欺旧,如果你正在考慮在下一個(gè)項(xiàng)目中使用 BeautifulSoup 或其他一些 DIY 網(wǎng)頁抓取庫姑丑,使用本模塊可以為你自己節(jié)省不少時(shí)間和精力。

pip install newspaper3k

Operator overloading

Python 提供對(duì)運(yùn)算符重載的支持辞友,這是讓你聽起來像一個(gè)合法的計(jì)算機(jī)科學(xué)家的術(shù)語之一栅哀。

這實(shí)際上是一個(gè)簡單的概念震肮。有沒有想過為什么 Python 允許你使用+運(yùn)算符來添加數(shù)字以及連接字符串?這就是操作符重載的作用留拾。

你可以定義以自己的特定方式使用 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ù)完成了它的工作间驮。但是如果嘗試使用print函數(shù)打印出任何大的嵌套對(duì)象躬厌,其結(jié)果相當(dāng)難看。這個(gè)標(biāo)準(zhǔn)庫的漂亮打印模塊pprint可以以易于閱讀的格式打印出復(fù)雜的結(jié)構(gòu)化對(duì)象竞帽。

這算是任何使用非平凡數(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

Python 標(biāo)準(zhǔn)庫的 Queue 模塊實(shí)現(xiàn)支持多線程。這個(gè)模塊讓你實(shí)現(xiàn)隊(duì)列數(shù)據(jù)結(jié)構(gòu)屹篓。這些是允許你根據(jù)特定規(guī)則添加和檢索條目的數(shù)據(jù)結(jié)構(gòu)疙渣。

“先進(jìn)先出”(FIFO)隊(duì)列讓你可以按添加順序檢索對(duì)象《亚桑“后進(jìn)先出”(LIFO) 隊(duì)列讓你可以首先訪問最近添加的對(duì)象妄荔。

最后,優(yōu)先隊(duì)列讓你可以根據(jù)對(duì)象的排序順序檢索對(duì)象谍肤。

這是一個(gè)如何在 Python 中使用隊(duì)列Queue進(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()
# 打印 <some description here>
print(someInstance)

sh

Python 是一種很棒的腳本語言系任。有時(shí)使用標(biāo)準(zhǔn)的 os 和 subprocess 庫可能有點(diǎn)頭疼恳蹲。

SH庫讓你可以像調(diào)用普通函數(shù)一樣調(diào)用任何程序——對(duì)于自動(dòng)化工作流和任務(wù)非常有用。

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í)間错忱。但是,沒有什么比由簡單的輸入問題引起的運(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)行前捕獲那些雜散的 TypeError。如果你正在處理大型、復(fù)雜的項(xiàng)目障贸,這是很有用的错森!

uuid

通過Python 標(biāo)準(zhǔn)庫的 uuid 模塊生成通用唯一 ID(或“UUID”)的一種快速簡便的方法。

import uuid
user_id = uuid.uuid4()
print(user_id)

這將創(chuàng)建一個(gè)隨機(jī)的 128 位數(shù)字篮洁,該數(shù)字幾乎肯定是唯一的涩维。事實(shí)上,可以生成超過 2122 種可能的 UUID袁波。這超過了五個(gè)十進(jìn)制 (或 5,000,000,000,000,000,000,000,000,000,000,000,000)瓦阐。

在給定的集合中發(fā)現(xiàn)重復(fù)的概率極低。即使有一萬億個(gè) UUID篷牌,重復(fù)存在的可能性也遠(yuǎn)低于十億分之一睡蟋。

Virtual environments

你可能同時(shí)在多個(gè) Python 項(xiàng)目上工作。不幸的是枷颊,有時(shí)兩個(gè)項(xiàng)目將依賴于相同依賴項(xiàng)的不同版本戳杀。你在你的系統(tǒng)上安裝了什么?

幸運(yùn)的是,Python支持對(duì) 虛擬環(huán)境 的讓你可以兩全其美夭苗。從命令行:

python -m venv my-project 
source my-project/bin/activate 
pip install all-the-modules

現(xiàn)在信卡,你可以在同一臺(tái)機(jī)器上運(yùn)行 Python 的獨(dú)立版本和安裝。

wikipedia

維基百科有一個(gè)很棒的 API题造,它允許用戶以編程方式訪問無與倫比的完全免費(fèi)的知識(shí)和信息傍菇。在wikipedia模塊使訪問該API非常方便。

import wikipedia
result = wikipedia.page('freeCodeCamp')
print(result.summary)
for link in result.links:
    print(link)

和真實(shí)站點(diǎn)一樣晌梨,該模塊提供了多語言支持桥嗤、頁面消歧、隨機(jī)頁面檢索仔蝌,甚至還有一個(gè)donate()方法泛领。

xkcd

幽默是 Python 語言的一個(gè)關(guān)鍵特征,它是以英國喜劇小品劇Python飛行馬戲團(tuán)命名的敛惊。Python 的許多官方文檔都引用了該節(jié)目最著名的草圖渊鞋。不過,Python 的幽默并不僅限于文檔瞧挤。試試運(yùn)行下面的行:

import antigravity

YAML

YAML指的是 “ 非標(biāo)記語言” 锡宋。它是一種數(shù)據(jù)格式化語言,是 JSON 的超集特恬。

與 JSON 不同执俩,它可以存儲(chǔ)更復(fù)雜的對(duì)象并引用它自己的元素。你還可以編寫注釋癌刽,使其特別適合編寫配置文件役首。該PyYAML模塊可讓你使用YAML使用Python尝丐。

安裝并然后導(dǎo)入到你的項(xiàng)目中:

pip install pyyaml

import yaml

PyYAML 允許你存儲(chǔ)任何數(shù)據(jù)類型的 Python 對(duì)象,以及任何用戶定義類的實(shí)例衡奥。

zip

壓軸出場(chǎng)的也是很棒的一個(gè)模塊爹袁。你曾經(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)用對(duì)象來“解壓縮”對(duì)象*zip()档址。

寫在最后

Python 是一種非常多樣化且發(fā)展良好的語言盹兢,因此肯定會(huì)有許多我沒有考慮的功能。如果你想了解更多的python模塊辰晕,可以參考awesome-python蛤迎。


原文作者:數(shù)據(jù)STUDIO
原文鏈接:mp.weixin.qq.com/s/U28UvPtFc…

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市含友,隨后出現(xiàn)的幾起案子替裆,更是在濱河造成了極大的恐慌,老刑警劉巖窘问,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辆童,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡惠赫,警方通過查閱死者的電腦和手機(jī)把鉴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來儿咱,“玉大人庭砍,你說我怎么就攤上這事』觳海” “怎么了怠缸?”我有些...
    開封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長钳宪。 經(jīng)常有香客問我揭北,道長,這世上最難降的妖魔是什么吏颖? 我笑而不...
    開封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任搔体,我火速辦了婚禮,結(jié)果婚禮上半醉,老公的妹妹穿的比我還像新娘疚俱。我一直安慰自己,他們只是感情好缩多,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開白布呆奕。 她就那樣靜靜地躺著夯尽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪登馒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天咆槽,我揣著相機(jī)與錄音陈轿,去河邊找鬼。 笑死秦忿,一個(gè)胖子當(dāng)著我的面吹牛麦射,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播灯谣,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼潜秋,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了胎许?” 一聲冷哼從身側(cè)響起峻呛,我...
    開封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎辜窑,沒想到半個(gè)月后钩述,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡穆碎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年牙勘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片所禀。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡方面,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出色徘,到底是詐尸還是另有隱情恭金,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布贺氓,位于F島的核電站蔚叨,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏辙培。R本人自食惡果不足惜蔑水,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扬蕊。 院中可真熱鬧搀别,春花似錦、人聲如沸尾抑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至榜苫,卻和暖如春护戳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背垂睬。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來泰國打工媳荒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人驹饺。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓钳枕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親赏壹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鱼炒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容