天天看點

你與資料科學家隻差這26條python技巧

Python是目前世界上最流行的程式設計語言之一。因為:

1.它容易學習

2.它用途超廣

3.它有非常多的開源支援(大量的子產品和庫)

作者 Peter Gleeson 是一名資料科學家,日常工作幾乎離不python。一路走來,他積累了不少有用的技巧和tips,現在就将這些技巧分享給大家。這些技巧将根據其首字母按A-Z的順序進行展示。

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")      

BASHPLOTIB

你想要在控制台繪圖嘛?

$ pip install bashplotlib      

現在,你的控制台中就可以有圖了

COLLECTIONS

Python有一些很棒的預設資料類型,但是有時候他們并不會像你所希望的那樣發揮作用。

幸運的是,Python 标準庫提供了collection子產品。它讓你可以使用更為多樣資料類型。

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 charactery = Counter("Hello World!")      

DIR

面對一個Python對象,你是否曾想過可以直接看到其屬性?你也許可以試試以下的代碼:

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

這是運作Python的時候一個非常有用的功能,用于動态探索你所使用的對象和子產品。更多詳情,可以檢視這裡:https://docs.python.org/3/library/functions.html#dir

EMOGI

對的,你沒看錯!

你與資料科學家隻差這26條python技巧
$ pip install emoji      

用python來建立表情包,你也可以。

from emoji import emojizeprint(emojize(":thumbs_up:"))      

?

FROM_GUTURE_IMPORT

Python非常受歡迎,這也就導緻了它的版本更新非常快,新的版本往往會有很多新特性。你不更新,就無法使用。

然而,不要害怕。__future__ 子產品可以讓你導入未來版本的功能。有點像時空穿梭有木有!

from __future__ import print_functionprint("Hello World!")      

GEOPY

對于程式猿來說地理可能是一個非常有挑戰性的領域。但是,geopy子產品則讓它變得非常簡單。

$ pip install geopy      

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

這裡面同時還包含一個有用的“距離”類别。它能使用你標明的度量去計算了兩個地點之間的距離。

from geopy import GoogleV3place = "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的inspect子產品用于收集Python對象的資訊,可以擷取類或函數的參數的資訊,源碼,解析堆棧等等

下方的代碼樣例使用了 inspect.getsource() 來列印它自身的源碼。同樣還使用了 inspect.getmodule()來列印定義了inspect.getmodule()的子產品。最後一行代碼則是列印了本行代碼所在的行号。在本例中,就是 4 。

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

inspect子產品可以有效地讓你知道你的代碼是如何工作的,你也可以利用它來完成一些個人的源碼。

JEDI

Jedi庫是一個代碼自動補齊和靜态分析的庫。它可以使你更快更高效地書寫代碼。

除非你在開發自己的編輯器,否則你可能會非常喜歡将Jedi作為自己的編輯插件。

你可能已經正在使用Jedi而隻是沒發現。IPython項目就是利用Jedi來實作其自動補全功能。

**KWARGS

無論你學習那種語言,在這條學習之路上總有那麼一些裡程碑。在Python的程式設計學習中,了解神秘的**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

List comprehensions(清單推導式)

清單推導式可以說是我最喜歡的Python技巧之一。這種表達式可以讓你寫出像自然語言一樣易于了解并且還很簡潔的代碼。

你可以通過這個連結了解更多關于清單推導式的用法。位址:https://www.learnpython.org/en/List_Comprehensions

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()對x中的每一個元素都應用了一個簡單的lambda函數。它會傳回一個map對象,這個對象可以被轉化成可疊代對象,如清單或者元組。

NEWSPAPER3K

newspaper3k,如果你還沒有見過它,那麼你可能會被這個Python newspaper子產品所驚豔到。

它可以讓你檢索到一系列國際領先出版物中的新聞和相關的中繼資料。你可以檢索圖檔、文本和作者名。它甚至有一些内置的自然語言處理功能。是以,如果你正在考慮使用BeautifulSoup 或其他自制的爬蟲庫來應用于你的下一個項目。那麼,省省時間和精力吧,你其實隻需要$ 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.__valuesomething = Thing(100)nothing = Thing(0)# Truesomething > nothing# Falsesomething < nothing# Errorsomething + nothing      

PPRINT

Python的預設print函數可以滿足日常的輸出任務,但如果要列印更大的、嵌套式的對象,那麼使用預設的print函數列印出來的内容會很醜陋。

這個時候我們就需要pprint了,它可以讓複雜的結構型對象以可讀性更強的格式顯示。這對于經常要面對非普通資料結構的Python開發者來說是必不可少的工具。

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

QUEUE(隊列)

Python支援多線程,它是通過标準庫中的Queue子產品來實作的。這個子產品可以讓你實作隊列資料結構。這種資料結構可以讓你根據特定的規則添加和檢索條目。

“先進先出”(FIFO)隊列可以讓你按照添加對象的順序來檢索他們。“後進先出”(LIFO)隊列可以讓你首先通路最近添加的對象。最後,優先隊列可以讓你根據他們排序的順序進行檢索。

_REPR_

當你定義一個類的時候,提供一個方法可以傳回用來表示該類對象的可列印字元串會非常有用。例如:

>>> file = open('file.txt', 'r')>>> print(file)<open file 'file.txt', mode 'r' at 0x10d30aaf0>      

這使得debug更加友善,具體的定義方式如下:

class someClass:    def __repr__(self):        return "<some description here>"someInstance = someClass()# prints <some description here>print(someInstance)      

SH

sh庫讓你像調用方法那樣調用系統中的指令。

import shsh.pwd()sh.mkdir('new_folder')sh.touch('new_file.txt')sh.whoami()sh.echo('This is great!')      

TYPE HINT(類型提示)

Python是一種動态類型語言。當你定義變量、函數、類别的時候,你不需要指定資料的類型。這可以大大提升你的開發速度,但也是有代價的。你可能會因為一個簡單的輸入問題而導緻運作出錯。

在Python3.5之後,這就不是問題了,在定義函數的時候你可以自主選擇要不要提供類型提示。

def addTwo(x : Int) -> Int:    return x + 2      

你還可以定義類型的别名:

from typing import ListVector = 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 resultx = [[1.0, 0.0], [0.0, 1.0]]y = [[2.0, 1.0], [0.0, -2.0]]z = addMatrix(x, y)      

雖然不是強制性的,類型注釋可以讓你的代碼了解起來更加簡單。它們也允許你使用類型檢測工具在運作之前捕獲這些零散的類型錯誤。如果你正在從事大型、複雜的項目,那麼類型注釋也許會非常有幫助

UUID

通過Python标準庫中的uuid子產品,可以快速并簡單地生成統一的唯一ID(又稱UUID).

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

UUID是128位的全局唯一辨別符,通常由32位元組的字元串表示。它可以保證時間和空間的唯一性,也稱為GUID,全稱為:UUID —— Universally Unique IDentifier,Python 中叫 UUID。它通過MAC位址、時間戳、命名空間、随機數、僞随機數來保證生成ID的唯一性。

VRITUAL ENVIRONMENTS

這可能是我最喜歡的Python技巧了。你可能經常要處理不止一個Python項目,不幸的是,有時候不同項目會依賴不同的Python版本。這個時候,你應該在系統裡安裝哪個Python版本呢?

幸運的是,Python可以支援建立不同的虛拟環境來滿足不同的版本需求。

python -m venv my-projectsource my-project/bin/activatepip install all-the-modules      

現在你可以在一台機器上安裝和運作各個獨立版本的Python。太棒了!

WIKIPEDIA

Wikipedia有一個很棒的API,它可以讓使用者通過程式設計通路到維基的詞條内容。使用Python中的wikipedia子產品可以讓你以最便捷的方式通路該API。

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

與真實站點一樣,該子產品支援多種語言、頁面消除歧義、随機頁面檢索,甚至還有donate()方法。

YAML

YAML是“YAML不是一種标記語言”的外語縮寫。它是一個資料格式語言,是JSON的父集。和JSON不同的是,它可以存儲更複雜的對象,并且可以引用自身的元素。你還可以寫注釋,這讓YAML特别适合于書寫配置檔案。

PyYAML子產品可以讓你使用Python調用YAML。使用下列語句安裝:

$ pip install pyyaml      

然後導入到項目中:

import yaml      

PyYAML 使你能夠儲存任何資料類型的Python對象,以及任何使用者定義類的執行個體。

ZIP

最後一個技巧也非常酷。你是否曾想要讓兩個清單中的元素逐個映射,組合成字典?那麼你應該使用zip。

keys = ['a', 'b', 'c']vals = [1, 2, 3]zipped = dict(zip(keys, vals))      

内置函數zip()接收若幹可疊代對象,然後傳回一個由多個元組組成的清單。每個元組根據輸入對象的位置索引對其元素進行分組。還可以使用*zip()來“解壓”對象。

python大法好,掌握這些小的技巧,助你在python大神的道路上,披荊斬棘,所向披靡。