程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

好用到爆的python實戰技巧

編輯:Python

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

  • 很容易學
  • 有超級多的功能
  • 它有大量的模塊和庫

作為一名數據工作者,我們每天都在使用 Python處理大多數工作。在此過程中,我們會不斷學到了一些有用的技巧和竅門。

在這裡,我嘗試以 A - Z 開頭的格式分享這些技巧中的一些,並且在本文中簡單介紹這些方法,如果你對其中一個或多個感興趣,你可以通過文末參考資料查看官方文檔。希望對你能有所幫助。

all or any

Python 語言如此流行的眾多原因之一,是因為它具有很好的可讀性和表現力。

人們經常開玩笑說 Python 是可執行的偽代碼。當你可以像這樣寫代碼時,就很難反駁。

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

bashplotlib

你有沒有想過在控制台中繪制圖形嗎?

Bashplotlib 是一個 Python 庫,他能夠幫助我們在命令行(粗曠的環境)中繪制數據。

# 模塊安裝
pip install bashplotlib
# 繪制實例
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 有一些很棒的默認數據類型,但有時它們的行為並不完全符合你的期望。

幸運的是,Python 標准庫提供了 collections 模塊[1]。這個方便的附加組件為你提供了更多的數據類型。

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 以及動態探索你正在使用的對象和模塊時,這可能是一個非常有用的功能。在這裡閱讀更多functions[2]相關內容。

emoji

emoji[3] 是日本在無線通信中所使用的視覺情感符號,繪指圖畫,文字指的則是字符,可用來代表多種表情,如笑臉表示笑、蛋糕表示食物等。在中國大陸,emoji通常叫做“小黃臉”,或者直稱emoji。

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

from future import

Python 流行的結果之一,總是有新版本正在開發中。新版本意味著新功能 —— 除非你的版本已過時。

不過不要擔心。使用該__future__模塊[4]可以幫助你用Python的未來版本導入功能。從字面上看,這就像時間旅行、魔法或其他東西。

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

地理,對大多數程序員來說是一個具有挑戰性的領域。在獲取地理信息或者繪制地圖時,也會遇到不少問題。這個geopy 模塊[5]讓地理相關內容變得非常容易。

pip install geopy

它通過抽象一系列不同地理編碼服務的 API 來工作。通過它,你能夠獲得一個地方的完整街道地址、緯度、經度甚至海拔高度。

還有一個有用的距離類。它以你偏好的測量單位計算兩個位置之間的距離。

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

當你使用terminal終端編程時,通過在遇到問題後會在StackOverflow上搜索答案,完後會回到終端繼續編程,此時有時會不記得你之前查到的解決方案,此時需要重新查看StackOverflow,但又不想離開終端,那麼此時你需要用到這個有用的命令行工具howdoi[6]。

pip install howdoi

無論你有什麼問題,都可以問它,它會盡力回復。

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

但請注意——它會從 StackOverflow 的最佳答案中抓取代碼。它可能並不總是提供最有用的信息…

howdoi exit vim

inspect

Python 的inspect模塊[7]非常適合了解幕後發生的事情。你甚至可以調用它自己的方法!

下面的代碼示例inspect.getsource() 用於打印自己的源代碼。 inspect.getmodule() 還用於打印定義它的模塊。

最後一行代碼打印出它自己的行號。

import inspect
print(inspect.getsource(inspect.getsource))
print(inspect.getmodule(inspect.getmodule))
print(inspect.currentframe().f_lineno)

當然,除了這些微不足道的用途,inspect 模塊可以證明對理解你的代碼在做什麼很有用。你還可以使用它來編寫自文檔化代碼。

Jedi

Jedi 庫是一個自動完成和代碼分析庫。它使編寫代碼更快、更高效。

除非你正在開發自己的 IDE,否則你可能對使用Jedi [8]作為編輯器插件比較感興趣。幸運的是,這已經有可用的負載!

**kwargs

在學習任何語言時,都會有許多裡程碑。使用 Python 並理解神秘的**kwargs語法可能算作一個重要的裡程碑。

字典對象前面的雙星號**kwargs[9]允許你將該字典的內容作為命名參數傳遞給函數。

字典的鍵是參數名稱,值是傳遞給函數的值。你甚至不需要調用它kwargs!

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

當你想編寫可以處理未預先定義的命名參數的函數時,這很有用。

列表(list)推導式

關於 Python 編程,我最喜歡的事情之一是它的列表推導式[10]。

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

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 函數[11]結合使用時。

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

在上面的示例中,map()將一個簡單的 lambda 函數應用於x. 它返回一個映射對象,該對象可以轉換為一些可迭代對象,例如列表或元組。

newspaper3k

如果你還沒有看過它,那麼准備好被Python newspaper module [12]模塊震撼到。它使你可以從一系列領先的國際出版物中檢索新聞文章和相關的元數據。你可以檢索圖像、文本和作者姓名。它甚至有一些內置的 NLP 功能[13]。

因此,如果你正在考慮在下一個項目中使用 BeautifulSoup 或其他一些 DIY 網頁抓取庫,使用本模塊可以為你自己節省不少時間和精力。

pip install newspaper3k

Operator overloading

Python 提供對運算符重載的[14]支持,這是讓你聽起來像一個合法的計算機科學家的術語之一。

這實際上是一個簡單的概念。有沒有想過為什麼 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函數完成了它的工作。但是如果嘗試使用print函數打印出任何大的嵌套對象,其結果相當難看。這個標准庫的漂亮打印模塊pprint[15]可以以易於閱讀的格式打印出復雜的結構化對象。

這算是任何使用非平凡數據結構的 Python 開發人員的必備品。

import requests
import pprint
url = 'https://randomuser.me/api/?results=1'
users = requests.get(url).json()
pprint.pprint(users)

Queue

Python 標准庫的 Queue 模塊實現支持多線程。這個模塊讓你實現隊列數據結構。這些是允許你根據特定規則添加和檢索條目的數據結構。

“先進先出”(FIFO)隊列讓你可以按添加順序檢索對象。“後進先出”(LIFO) 隊列讓你可以首先訪問最近添加的對象。

最後,優先隊列讓你可以根據對象的排序順序檢索對象。

這是一個如何在 Python 中使用隊列Queue[16]進行多線程編程的示例。

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()
# 打印 <some description here>
print(someInstance)

sh

Python 是一種很棒的腳本語言。有時使用標准的 os 和 subprocess 庫可能有點頭疼。

該SH庫[17]讓你可以像調用普通函數一樣調用任何程序——對於自動化工作流和任務非常有用。

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[18] 開始,你可以選擇在定義函數時提供類型提示。

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)

盡管不是強制性的,但類型注釋可以使你的代碼更易於理解。

它們還允許你使用類型檢查工具,在運行前捕獲那些雜散的 TypeError。如果你正在處理大型、復雜的項目,這是很有用的!

uuid

通過Python 標准庫的 uuid 模塊[19]生成通用唯一 ID(或“UUID”)的一種快速簡便的方法。

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

這將創建一個隨機的 128 位數字,該數字幾乎肯定是唯一的。事實上,可以生成超過 2¹²² 種可能的 UUID。這超過了五個十進制 (或 5,000,000,000,000,000,000,000,000,000,000,000,000)。

在給定的集合中發現重復的概率極低。即使有一萬億個 UUID,重復存在的可能性也遠低於十億分之一。

Virtual environments

你可能同時在多個 Python 項目上工作。不幸的是,有時兩個項目將依賴於相同依賴項的不同版本。你在你的系統上安裝了什麼?

幸運的是,Python支持對 虛擬環境[20] 的讓你可以兩全其美。從命令行:

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

現在,你可以在同一台機器上運行 Python 的獨立版本和安裝。

wikipedia

維基百科有一個很棒的 API,它允許用戶以編程方式訪問無與倫比的完全免費的知識和信息。在wikipedia模塊[21]使訪問該API非常方便。

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

和真實站點一樣,該模塊提供了多語言支持、頁面消歧、隨機頁面檢索,甚至還有一個donate()方法。

xkcd

幽默是 Python 語言的一個關鍵特征,它是以英國喜劇小品劇Python飛行馬戲團[22]命名的。Python 的許多官方文檔都引用了該節目最著名的草圖。不過,Python 的幽默並不僅限於文檔。試試運行下面的行:

import antigravity

YAML

YAML[23]指的是 “ 非標記語言” 。它是一種數據格式化語言,是 JSON 的超集。

與 JSON 不同,它可以存儲更復雜的對象並引用它自己的元素。你還可以編寫注釋,使其特別適合編寫配置文件。該PyYAML模塊[24]可讓你使用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()。

寫在最後

Python 是一種非常多樣化且發展良好的語言,因此肯定會有許多我沒有考慮的功能。如果你想了解更多的python模塊,可以參考awesome-python[25]。

參考資料
[1]collections 模塊: https://docs.python.org/3/library/collections.html

[2]functions: https://docs.python.org/3/library/functions.html#dir

[3]emoji: https://pypi.org/project/emoji/

[4]__future__模塊: https://docs.python.org/2/library/future.html

[5]geopy 模塊: https://geopy.readthedocs.io/en/latest/

[6]howdoi: https://github.com/gleitz/howdoi

[7]inspect模塊: https://docs.python.org/3/library/inspect.html

[8]Jedi : https://jedi.readthedocs.io/en/latest/docs/usage.html

[9]**kwargs: https://docs.python.org/3/tutorial/controlflow.html#keyword-arguments

[10]列表推導式: https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions

[11]lambda 函數: https://docs.python.org/3/tutorial/controlflow.html#lambda-expressions

[12]Python newspaper module : https://pypi.org/project/newspaper3k/

[13]內置的 NLP 功能: https://newspaper.readthedocs.io/en/latest/user_guide/quickstart.html#performing-nlp-on-an-article

[14]運算符重載的: https://docs.python.org/3/reference/datamodel.html#special-method-names

[15]pprint: https://docs.python.org/3/library/pprint.html

[16]Queue: https://www.tutorialspoint.com/python3/python_multithreading.htm

[17]SH庫: http://amoffat.github.io/sh/

[18]Python 3.5: https://docs.python.org/3/library/typing.html

[19]uuid 模塊: https://docs.python.org/3/library/uuid.html

[20]虛擬環境: https://docs.python.org/3/tutorial/venv.html

[21]wikipedia模塊: https://wikipedia.readthedocs.io/en/latest/quickstart.html

[22]Python飛行馬戲團: https://en.wikipedia.org/wiki/Monty_Python’s_Flying_Circus

[23]YAML: http://yaml.org/

[24]PyYAML模塊: https://pyyaml.org/wiki/PyYAMLDocumentation

[25]awesome-python: https://awesome-python.com/

版權聲明
原文作者:數據STUDIO(知乎ID)
原文鏈接:https://zhuanlan.zhihu.com/p/43


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved