熱線電話:13121318867

登錄
首頁精彩閱讀26個示例教你A-Z個非常有用的python小技巧
26個示例教你A-Z個非常有用的python小技巧
2020-03-25
收藏


26個示例教你A-Z個非常有用的<a href='/map/python/' style='color:#000;font-size:inherit;'>python</a>小技巧

作者 | CDA數據分析師

前言

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

  • 簡單易學,語法簡潔,可以快速入門
  • 超級通用,無論是在開發、運維、數據科學、科研等應用場景下,都完美可行
  • 它具有廣泛的模塊和庫,數量眾多且更新快速,一個新出現的算法模型,幾個月內就會有對應的、完善的python包出現

在CDA數據科學研究院,我幾乎每天都在使用Python來實現數據科學相關工作。 在此過程中,我獲得了一些有用的技巧和提示。在這里,我將以A-Z共26條小技巧來分享了其中的一些內容,在拼湊A-Z字母開頭的過程中,就出現了一些可能大家沒接觸過的知識,總有對你有幫助的。

這些“小技巧”大部分是我在日常工作中曾經使用或偶然發現的東西。其中有一些是在Python標準庫.docs中發現的。還有,分享幾個非常有用的的論壇和網站,首先是awesome-python . com,對,沒錯,創辦者就是那么喜歡python,用awesome-python來命名, 這里有這數百種有趣的Python工具和模塊的精選列表,都是非常實用的。

all or any

Python之所以成為如此流行的語言,其眾多的原因之一是因為它具有絕佳的可讀性和表現力。

人們經常開玩笑說Python是可執行的偽代碼。不會用python的人都可以讀出他的意思,但是,當您可以編寫這樣的代碼時,您絕對會樂在其中:

x = [True, True, False]
if any(x):     # 如果列表x中任意元素為真
    print("At least one True")
if all(x):     # 如果列表x中所有元素為真
    print("Not one False")
if any(x) and not all(x):      # 列表x中任意元素為真且并非全部元素為真
    print("At least one True and one False")

bashplotlib

看到這個包的名字??赡苣隳懿碌搅?,您想在控制臺中繪制圖形嗎?

$ pip install bashplotlib

使用bashplotlib包,您可以在控制臺中使用圖形,當然,其精美度肯定沒有圖形工具中那么好,但是也是挺好玩的,例如:

$ hist --file data/exp.txt


26個示例教你A-Z個非常有用的<a href='/map/python/' style='color:#000;font-size:inherit;'>python</a>小技巧

collections

Python具有一些非常好的默認數據類型,但是有時它們無法完全按照所希望的方式來運行。幸運的是,Python標準庫提供了collections模塊。 這個方便的加載項為您提供了更多的數據類型。

from collections import OrderedDict, Counter

# 記住按鍵的添加順序!
x = OrderedDict(a=1, b=2, c=3)
x
# 計算每個字符的頻率
y = Counter("Hello World!")
y

結果演示:

OrderedDict([('a', 1), ('c', 3), ('b', 2)])

Counter({' ': 1,
         '!': 1,
         'H': 1,
         'W': 1,
         'd': 1,
         'e': 1,
         'l': 3,
         'o': 2,
         'r': 1})

dir

有沒有想過如何在Python對象內部查找并查看其具有的屬性? 當然有,在命令行中:

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

在交互式運行Python以及動態瀏覽正在使用的對象和模塊時,對于某些python使用者來說,這應該是一個非常有用的功能。

emoji

是的,沒錯,表情包的那個emoji。

$ pip install emoji

不要假裝你不會嘗試,給你的python加多點樂趣把!

from emoji import emojize
print(emojize(":thumbs_up:"))
26個示例教你A-Z個非常有用的<a href='/map/python/' style='color:#000;font-size:inherit;'>python</a>小技巧


from future import

Python受歡迎的一個后果是,總是有新版本正在開發中, 新版本意味著新功能。目前python3.8正式版已發布,python3.9發布周期已經開始,到2020年,python2將徹底退出市場。

但是不要害怕。 future模塊允許您從將來的Python版本導入功能。 從字面上看,就像時間旅行,魔術一樣。

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

geopy

對于程序員來說,地理環境可能是一個充滿挑戰的領域。 但是geopy模塊使它變得異常簡單。

$ pip install geopy

它通過一系列不同地理編碼服務的API來工作。它使您可以獲取地點的完整街道地址,緯度,經度甚至海拔高度。還有一個有用的距離包。 可以以您喜歡的度量單位計算兩個位置之間的距離。

1、由名字來查位置和經緯度

## 1、由名字來查位置和經緯度
from geopy.geocoders import Baidu, Bing, GoogleV3, DataBC, Nominatim
#geolocator = Nominatim(user_agent="specify_your_app_name_here")
geolocator = Baidu('EiQTTRKzlV3dKN1zcZ3c7iVhIl126xvC')
#geolocator = Bing('Ajg52RB8D2BIXygYwUTcJytDGsgqURLj5lfBptOH4jmTGHHFUvt0cMqdhdhdYfr-')
#geolocator = GoogleV3('AIzaSyAVwjaaOBKbssuyQsvyqQAQDwfuzO1PKCA')

location = geolocator.geocode("廣州市CDA數據分析師")
print(location.address)
print((location.latitude, location.longitude))

輸出結果:

城市
(23.135336306695006, 113.27143134445974)

2、用坐標來查地點

## 2、用坐標來查地點
from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="specify_your_app_name_here")
location = geolocator.reverse("52.509669, 13.376294")
print(location.address)
print((location.latitude, location.longitude))
print(location.raw)

輸出結果:

Backwerk, Potsdamer Platz, Tiergarten, Mitte, Berlin, 10785, Deutschland

(52.50958575, 13.3762845319028)

{'display_name': 'Backwerk, Potsdamer Platz, Tiergarten, Mitte, Berlin, 10785, Deutschland', 
 'osm_id': 464904422, 
 'osm_type': 'way',
 'licence': 'Data © OpenStreetMap contributors, ODbL 1.0. https://osm.org/copyright', 
 'lat': '52.50958575',
 'boundingbox': ['52.5095298', '52.5096533', '13.3762456', '13.3763382'], 
 'place_id': 176241040, 
 'address': {'state': 'Berlin', 'postcode': '10785', 'country': 'Deutschland', 'country_code': 'de','bakery': 'Backwerk', 'city_district': 'Mitte', 'footway': 'Potsdamer Platz', 'suburb': 'Tiergarten'}, 'lon': '13.3762845319028'}

3、計算兩坐標距離

## 3、計算距離
>>> from geopy import distance
>>> newport_ri = (41.49008, -71.312796)
>>> cleveland_oh = (41.499498, -81.695391)
>>> print(distance.distance(newport_ri, cleveland_oh).miles)
538.39044536

>>> wellington = (-41.32, 174.81)
>>> salamanca = (40.96, -5.50)
>>> print(distance.distance(wellington, salamanca, ellipsoid='GRS-80').km)
19959.6792674

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模塊非常適合了解函數的一些基本信息。 您甚至可以自行調用其方法!

下面的代碼示例使用inspect.getsource( )來打印自己的源代碼。 它還使用inspect.getmodule( )來打印定義它的模塊。最后一行打印出自己的行號。

import inspect

print(inspect.getsource(inspect.getsource))   # 查看非內置函數的函數定義代碼
print(inspect.getmodule(inspect.getmodule))   # 查看函數所屬模塊和安裝路徑
print(inspect.currentframe().f_lineno)        # 打印這一行所在的行號,如本段代碼中此函數在第5行,則返回5

當然,除了這些瑣碎的用途外,檢查模塊對于證明您的代碼在做什么很有用。 您也可以使用它來編寫自文檔代碼。

Jedi

Jedi庫是一個自動完成和代碼分析庫。 它使編寫代碼更快,更高效。除非您自己開發IDE,否則您可能會對使用Jedi作為編輯器插件感興趣。 幸運的是,您可能已經在使用Jedi。目前 IPython項目使用Jedi作為其代碼自動完成功能。

kwargs

該方法不是一個函數或者一個包,而是一種可以使用在函數上的一種小技巧,如示例中自定義的someFunction函數中,有兩個參數,且參數未在函數體內未被定義上固定的值。除了正常的參數使用方式,還能使用字典的形式來傳遞函數的參數,字典對象前面的雙星號可以使python知道該字典的內容作為參數值傳遞給函數。

字典的鍵是參數名稱,值是傳遞給函數的值。字典的名字不限,不一定要用kwargs,當您要編寫可以處理事先未定義的命名參數的函數時,此功能很有用。

dictionary = {"a": 1, "b": 2}

def someFunction(a, b):
    print(a + b)
    return

# 下面執行的效果是一樣的
someFunction(**dictionary)     # 這兩個星號*是必須加上的,以字典的形式傳遞參數
someFunction(a=1, b=2)

List comprehensions

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]
print(evens)
print(odds)

Certifies = ['CDA數據分析師', 'CFA特許金融分析師', 'CPA注冊會計師']

def research(Certify):
    print("祝賀你通過"+Certify)
for Certify in Certifies:
    research(Certify)

輸出結果:

[2, 4, 6]
[1, 3, 5, 7]
祝賀你通過CDA數據分析師
祝賀你通過CFA特許金融分析師
祝賀你通過CPA注冊會計師

map

Python通過許多內置功能支持函數式編程。 最有用的功能之一是map()函數-尤其是與lambda函數結合使用。在下面的示例中,map()將簡單的lambda函數應用于x中的每個元素。 它返回一個映射對象,可以將其轉換為一些可迭代的對象,例如列表或元組。

tlist = [1,2,3,4,5]
y = map(lambda x : x ** 2 , tlist)
ylist = list(y)
print(ylist)     # print out:[1, 4, 9, 16, 25]

# map(lambda x : x ** 2 , tlist)   等價于
def Square(x):
    return x**2
result = []
for i in range(len(tlist)):
    result.append(Square(tlist[i]))
# print out:[1, 4, 9, 16, 25]

可以看到,使用了map()函數+lambda函數的方式,一行簡潔的代碼就是實現幾行的代碼的功能。

newspaper3k

如果您還沒有看過,請準備讓Python的newspaper模塊震驚。它使您可以從一系列領先的國際出版物中檢索新聞文章和相關的元數據。 您可以檢索圖像,文本和作者名稱。它甚至還具有一些內置的NLP功能。

因此,如果您打算為下一個項目使用BeautifulSoup或其他DIY網站抓取庫,不妨試一下更省力的方式,相信我,你會愛上它的

$ pip install news3k

以下以新浪為例,簡單做個例子:

import newspaper
sina_paper = newspaper.build('http://www.sina.com.cn/', language='zh')
print(len(sina_paper.category_urls()))          # 搜索到的網站數量
for category in sina_paper.category_urls():     # 逐一打印搜索到的網站
    print(category)

out:
153
http://anli.jiaju.sina.com.cn
http://photo.auto.sina.com.cn
http://www.sina.com.cn/
......


article = sina_paper.articles[125]    # 選取其中一篇
article.download()
article.parse()
print(article.title)

out:多項新政聚焦穩投資 資金加速涌入基建

print(article.text)
out:
原標題:多項新政聚焦穩投資 資金加速涌入基建 來源:經濟參考報

專項債、資本金政策雙管齊下 補短板全面提速

時至年底,穩投資補短板開始全面提速,尤其是在破解資金來源困局方面,近期多項重磅新政落地:2020年新增專項債額度已提前下達1萬億元,固定資產投資項目資本金管理新規也已正式下發。專家分析,專項債疊加項目資本金,雙管齊下助力基礎設施項目融資,無疑對穩投資具有重要的促進作用。受益于專項債和項目資本金等新政策措施的支持,今年年底基建投資有望企穩回升。具體而言,有一定經營性收入或收費機制的交通、環保和市政等基礎設施投資或將迎來較快增長。
......

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     # True

something < nothing     # False

something + nothing     # TypeError: unsupported operand type(s) for +: 'Thing' and 'Thing'

pprint

Python的默認print功能可以完成其規定的所有打印的工作。 但是,打印出任何較大的多層的嵌套對象,print打印的結果會直接無格式的直接堆出來,可讀性較差。

而pprint模塊不一樣,它能夠打印出標準格式的結果,即使打印多層嵌套的復雜結構時,也會通過縮進打印出來,有很好的可讀性。這是任何使用非數據結構的Python使用人員的必備工具。

import requests
import pprint

url = 'https://randomuser.me/api/?results=1'
users = requests.get(url).json()
print(users)             # print正常打印
pprint.pprint(users)     # pprint標準格式打印

print打印結果的部分內容,不太友好,可讀性非常差:

{'results': [{'picture': {'medium': 'https://randomuser.me/api/portraits/med/men/22.jpg', 'large': 'https://randomuser.me/api/portraits/men/22.jpg', 'thumbnail': 'https://randomuser.me/api/portraits/thumb/men/22.jpg'}, 'email': 'andy.frazier@example.com', 'login': {'salt': 'lfIp3jL3', 'sha1': 'a9d428929b17a07ec04110c2383bcfab2d7e37a9', 'username': 'happypanda484', 'sha256': '4f63a0c687b9f6147dd7110838489dfa4cc692927b9952dda5d7c088b70febf9', 'md5': '2b676af5708fbf390cebebba10dfb2ef', 'uuid': '0415c30e-3184-4e29-a96b-68a30b4f4e2f', 'password': 'mike'}......

pprint標準格式打印的部分內容,可讀性強:

{'info': {'page': 1,
          'results': 1,
          'seed': '9139afcfa8db8189',
          'version': '1.3'},
 'results': [{'cell': '081-287-4240',
              'dob': {'age': 47, 'date': '1972-11-24T04:22:50.682Z'},
              'email': 'andy.frazier@example.com',
              'gender': 'male',
              'id': {'name': 'PPS', 'value': '7870181T'},
              'location': {'city': 'Cavan',
                           'coordinates': {'latitude': '24.4086',
                                           'longitude': '-41.6859'},
                           'country': 'Ireland',
                           'postcode': 92828,
                           'state': 'Cavan',
                           'street': {'name': 'Station Road', 'number': 3614},
                           'timezone': {'description': 'Hawaii',
                                        'offset': '-10:00'}}
              ......

Queue

Python支持多線程,標準庫的Queue模塊促進了這一點。該模塊使您可以實現隊列數據結構。這些數據結構使您可以根據特定規則添加和檢索條目?!跋冗M先出”(或FIFO)隊列使您可以按添加順序檢索對象?!昂筮M先出”(LIFO)隊列使您可以首先訪問最近添加的對象。最后,優先級隊列使您可以根據對象的排序順序檢索對象。這里是如何使用隊列的示例用于Python中的多線程編程。

__repr__

在Python中定義類或對象時,提供一種很有用的方式可以將該對象表示為字符串。 例如:

>>> file = open('file.txt', 'r')
>>> print(file)

這使調試代碼容易得多。將其添加到您的類定義中,如下所示:

class someClass:
    def __repr__(self):
        return ""

someInstance = someClass()
print(someInstance)
# prints

sh

Python是一種很棒的腳本語言。有時使用標準os和子流程庫可能會讓人有些頭疼。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)

盡管不是強制性的,但類型注釋可以使您的代碼更易于理解。它們還允許您使用類型檢查工具在運行時捕獲那些雜散的TypeError。 如果您正在從事大型,復雜的項目,則值得擁有!

uuid

通過Python標準庫的uuid模塊,可以快速簡便地生成通用唯一ID(或“ UUID”)。

import uuid

user_id = uuid.uuid4()
print(user_id)

這將會創建一個隨機的128位數字,幾乎可以肯定是唯一的。實際上,可以生成超過2的122次方的UUID。 超過5*10的42次方。在給定集合中找到重復項的可能性非常低。即使擁有一萬億個UUID,重復存在的可能性也遠遠小于十億分之一。

Virtual environments

您有可能同時從事多個Python項目,可能出現有時兩個項目依賴于不同的python版本。您在系統上安裝哪個?幸運的是,Python的對虛擬環境的支持使您擁有兩全其美的體驗。 在命令行中輸入:

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

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

wikipedia

維基百科具有出色的API,允許用戶以編程方式訪問完全免費的知識和信息。wikipedia模塊使訪問此API變得非常方便。

import wikipedia

result = wikipedia.page('freeCodeCamp')
print(result.summary)

for link in result.links:
    print(link)

與實際站點一樣,該模塊提供了對多種語言、頁面歧義消除、隨機頁面檢索的支持,甚至還具有donate()方法。

xkcd

xkcd是蘭道爾·門羅(Randall Munroe)的網名,又是他所創作的漫畫的名稱。作者Randall Munroe給作品的定義是一部"關于浪漫、諷刺、數學和語言的網絡漫畫",被網友譽為深度宅向網絡漫畫。

Python語言也是幽默的,Python的許多官方文檔都引用了英國喜劇速寫節目“Monty Python's Flying Circus”中最著名的草圖。不過,python的幽默感不僅僅限于文檔。你可以試試調用一下下面這個庫:

import antigravity

YAML

YAML代表 YAML不是標記語言。 它是一種數據格式語言,并且是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))
zipped

out:
{'a': 1, 'b': 2, 'c': 3}

內置的zip()函數接受許多可迭代的對象,并返回一個元組列表。 每個元組通過其位置索引將輸入對象的元素分組。您也可以通過在對象上調用*zip()來“解壓縮”對象。

以上的內容部分參考Peter Gleeson的分享,非常感謝,以上的A-Z共26個Python小技巧,希望能對您下一個項目有所幫助。


數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢