一些讓Python代碼簡潔的實用技巧總結(jié)
前言
眾所周知,編寫Python代碼在開始時十分容易,但隨著你在工具包中添加更多的庫,你的腳本可能會有不必要的代碼行,變得冗長而混亂??赡芏唐趦?nèi)能夠應(yīng)付工作,但長期來看,麻煩不小。
在這篇文章中,我將與你分享7個技巧,使你在使用Python進(jìn)行數(shù)據(jù)科學(xué)時更加簡潔。這涵蓋了我們?nèi)粘K龅氖虑?,例如修改Pandas數(shù)據(jù)框中的值,連接字符串,讀取文件等操作!
1. 使用Lambda來修改Pandas數(shù)據(jù)框中的值
假設(shè)我們有以下df數(shù)據(jù)框:
data = [[1,2,3], [4,5,6], [7,8,9]] df = pd.DataFrame(data, columns=[0,1,2]) IN[1]: print (df) OUT[1]: 0 1 2 0 1 2 3 1 4 5 6 2 7 8 9
現(xiàn)在由于某種原因,你需要在第0列的數(shù)字上添加01的值。一個常見的方法是定義一個函數(shù)來完成這個任務(wù),然后用 apply 函數(shù)來修改一列的值。
def add_numbers(x): return f'{x}01' df[0] = df[0].apply(add_numbers) IN[1]: print (df) OUT[1]: 0 1 2 0 101 2 3 1 401 5 6 2 701 8 9
這并不復(fù)雜,但是在數(shù)據(jù)框中對每一個改變創(chuàng)建一個函數(shù)是不切實際的。這時lambda就派上了用場。
lambda函數(shù)類似于普通的Python函數(shù),但它可以不使用名稱來定義,這使得它成為一個漂亮的單行代碼。之前使用的代碼可以用以下方式來減少。
df[0] = df[0].apply(lambda x:f'{x}01')
當(dāng)你不知道是否可以訪問一個系列的屬性來修改數(shù)據(jù)時,Lambda變得非常有用。
例如,列0包含字母,我們想把它們大寫。
# 如果你知道.str的存在,你可以這樣做 df[0] = df[0].str.title() # 如果你不知道.str,你仍然可以用lambda大寫 df[0] = df[0].apply(lambda x: x.title())
2. 使用f-string來連接字符串
字符串連接是Python中非常常見的操作,它可以用不同的方法來完成。最常見的方法是使用+運算符;然而,這個運算符的一個問題是我們不能在字符串之間添加任何分隔符。
當(dāng)然,如果你想把 "Hello "和 "World "連接起來,一個典型的變通方法是添加一個空白分隔符(" ")。
print("Hello" + " " + "World")
這就完成了工作,但為了寫出更可讀的代碼,我們可以用一個f-string來代替它。
IN[2]: print(f'{Hello} {World}') OUT[2]: "Hello World"
在一個基本的例子中,這似乎是不必要的,但是當(dāng)涉及到連接多個值時(正如你將在提示#3中看到的),f-string將使你免于書寫多次+ " " +。我不知道過去有多少次不得不寫+運算符,但現(xiàn)在不會了!
其他連接字符串的方法是使用join()方法或format()函數(shù),然而f-string在字符串連接方面做得更好。
3. 用Zip()函數(shù)對多個列表進(jìn)行迭代
你是否曾經(jīng)想在 Python 中循環(huán)遍歷一個以上的列表?當(dāng)你有兩個列表時,你可以用 enumerate 來實現(xiàn)。
teams = ['Barcelona', 'Bayern Munich', 'Chelsea'] leagues = ['La Liga', 'Bundesliga', 'Premiere League'] for i, team in enumerate(teams): league = leagues[i] print(f'{team} plays in {league}')
然而,當(dāng)你有兩個或更多的列表時,這變得不切實際。一個更好的方法是使用zip()函數(shù)。zip()函數(shù)接收迭代數(shù)據(jù),將它們聚集在一個元組中,并返回之。
讓我們再增加一個列表,看看zip()的威力!
teams = ['Barcelona', 'Bayern Munich', 'Chelsea'] leagues = ['La Liga', 'Bundesliga', 'Premiere League'] countries = ['Spain', 'Germany', 'UK'] for team, league, country in zip(teams, leagues, countries): print(f'{team} plays in {league}. Country: {country}')
上述代碼的輸出結(jié)果為:
Barcelona plays in La Liga. Country: Spain
Bayern Munich plays in Bundesliga. Country: Germany
Chelsea plays in Premiere League. Country: UK
此處你注意到我們在這個例子中使用了f-string嗎?代碼變得更有可讀性,不是嗎?
4. 使用列表理解法
清洗和處理數(shù)據(jù)的一個常見步驟是修改現(xiàn)有的列表。比如,我們有以下需要大寫的列表:
words = ['california', 'florida', 'texas']
將words列表的每個元素大寫的典型方法是創(chuàng)建一個新的大寫列表,執(zhí)行一次 for 循環(huán),使用.title(),然后將每個修改的值附加到新的列表中。
capitalized = [] for word in words: capitalized.append(word.title())
然而,Pythonic的方法是使用列表理解來做到這一點。列表理解有一種優(yōu)雅的方法來制作列表。
你可以用一行代碼重寫上面的for循環(huán):
capitalized = [word.title() for word in words]
由此我們可以跳過第一個例子中的一些步驟,結(jié)果是一樣的。
5. 對文件對象使用with語句
當(dāng)在一個項目上工作時,我們經(jīng)常會對文件進(jìn)行讀寫操作。最常見的方法是使用open()函數(shù)打開一個文件,它會創(chuàng)建一個我們可以操作的文件對象,然后作為一個習(xí)慣的做法,我們應(yīng)該使用close()關(guān)閉該文件對象。
f = open('dataset.txt', 'w') f.write('new_data') f.close()
這很容易記住,但有時寫了幾個小時的代碼,我們可能會忘記用f.close()關(guān)閉f文件。這時,with語句就派上了用場。with語句將自動關(guān)閉文件對象f,形式如下:
with open('dataset.txt', 'w') as f: f.write('new_data')
有了這個,我們可以保持代碼的簡短。
你不需要用它來讀取CSV文件,因為你可以用pandas的 pd.read_csv()輕松地讀取,但在讀取其他類型的文件時,這仍然很有用。例如,從pickle文件中讀取數(shù)據(jù)時經(jīng)常使用它。
import pickle # 從pickle文件中讀取數(shù)據(jù)集 with open(‘test', ‘rb') as input: data = pickle.load(input)
6. 停止使用方括號來獲取字典項, 利用.get()代替
比如,有以下一個字典:
person = {'name': 'John', 'age': 20}
我們可以通過person[name]和person[age]分別獲得姓名和年齡。但是,由于某種原因,我們想獲得一個不存在的鍵,如 "工資",運行person[salary]會引發(fā)一個`KeyError'。
這時,get()方法就有用了。如果鍵在字典中,get()方法返回指定鍵的值,但是如果沒有找到鍵,Python 將返回None。得益于此,你的代碼不會中斷。
person = {'name': 'John', 'age': 20} print('Name: ', person.get('name')) print('Age: ', person.get('age')) print('Salary: ', person.get('salary'))
輸出結(jié)果如下:
Name: John
Age: 20
Salary: None
7. 多重賦值
你是否曾想減少用于創(chuàng)建多個變量、列表或字典的代碼行數(shù)?那么,你可以用多重賦值輕松做到這一點。
# 原始操作 a = 1 b = 2 c = 3 # 替代操作 a, b, c = 1, 2, 3 # 代替在不同行中創(chuàng)建多個列表 data_1 = [] data_2 = [] data_3 = [] data_4 = [] # 可以在一行中創(chuàng)建它們的多重賦值 data_1, data_2, data_3, data_4 = [], [], [], [] # 或者使用列表理解法 data_1, data_2, data_3, data_4 = [[] for i in range(4)]
原文鏈接:
https://towardsdatascience.com/7-tips-to-level-up-your-python-code-for-data-science-4a64dbccd86d
總結(jié)
到此這篇關(guān)于讓Python代碼簡潔的實用技巧的文章就介紹到這了,更多相關(guān)Python代碼簡潔技巧內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python使用urllib模塊對URL網(wǎng)址中的中文編碼與解碼實例詳解
這篇文章主要介紹了Python使用urllib模塊對URL網(wǎng)址中的中文編碼與解碼(Python使用urllib模塊對URL編碼與解碼)實例詳解,需要的朋友可以參考下2020-02-02基于python,Matplotlib繪制函數(shù)的等高線與三維圖像
這篇文章主要介紹了基于python,Matplotlib繪制函數(shù)的等高線與三維圖像,函數(shù)的等高線及其三維圖像的可視化方法,下面一起來學(xué)習(xí)具體內(nèi)容吧,需要的小伙伴可以參考一下2022-01-01利用Python實現(xiàn)Shp格式向GeoJSON的轉(zhuǎn)換方法
JSON(JavaScript Object Nonation)是利用鍵值對+嵌套來表示數(shù)據(jù)的一種格式,以其輕量、易解析的優(yōu)點,這篇文章主要介紹了利用Python實現(xiàn)Shp格式向GeoJSON的轉(zhuǎn)換,需要的朋友可以參考下2019-07-07Pytorch四維Tensor轉(zhuǎn)圖片并保存方式(維度順序調(diào)整)
這篇文章主要介紹了Pytorch四維Tensor轉(zhuǎn)圖片并保存方式(維度順序調(diào)整),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12Numpy創(chuàng)建數(shù)組和隨機(jī)數(shù)組的方法小結(jié)
這篇文章主要為大家詳細(xì)介紹了Numpy創(chuàng)建數(shù)組和隨機(jī)數(shù)組的方法小結(jié),文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Python有一定幫助,具有一定的參考價值,需要的可以參考一下2023-11-11python 實現(xiàn)提取log文件中的關(guān)鍵句子,并進(jìn)行統(tǒng)計分析
今天小編就為大家分享一篇python 實現(xiàn)提取log文件中的關(guān)鍵句子,并進(jìn)行統(tǒng)計分析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12pytorch建立mobilenetV3-ssd網(wǎng)絡(luò)并進(jìn)行訓(xùn)練與預(yù)測方式
這篇文章主要介紹了pytorch建立mobilenetV3-ssd網(wǎng)絡(luò)并進(jìn)行訓(xùn)練與預(yù)測方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02Python configparser模塊配置文件解析與應(yīng)用探究
在Python中,configparser模塊是用于處理配置文件的重要工具,本文將全面探討configparser模塊的使用方法,包括讀取、修改、寫入配置文件,以及如何在實際項目中應(yīng)用該模塊,結(jié)合豐富的示例代碼,將深入剖析該模塊的功能和靈活性2024-01-01