不能錯過!你必須知道的3種重要Python技能
學(xué)習(xí)Pandas是很棒的體驗,學(xué)習(xí)Numpy也很有趣。但是,你是否過早地開始使用程序庫了呢?這也許是因為你還沒有意識到pure python的魅力。
如果是這樣的話,那么這篇文章會對你很有幫助。
本文將介紹幾個非常有趣的pure python功能,這些功能是在日常數(shù)據(jù)科學(xué)工作中十分常用的。在整個數(shù)據(jù)準(zhǔn)備階段都都可以大量地使用它們(大量用于數(shù)據(jù)清理),甚至在繪制之前也可以使用它們來聚合數(shù)據(jù)。
希望你也可以將這些技巧運用到項目中。盡管沒有運行時的速度或性能優(yōu)勢,但是與從零開始實施此邏輯相比,這將為你節(jié)省大量時間。因此,言歸正傳,讓我們來看第一點吧!
1、拉姆達函數(shù)(Lambda Functions)
拉姆達函數(shù)非常強大。當(dāng)然,當(dāng)必須以相同的方式清理多個列時,我們不會使用它,但這并不是經(jīng)常遇到的情況。通常情況下,每個屬性在清理后都需要自己的邏輯。
Lambda函數(shù)允許創(chuàng)建“匿名”函數(shù)。這基本上意味著可以快速生成特定函數(shù),而無需使用pythonsdef來正確定義函數(shù)。
盡管如此,請記住Lambda函數(shù)主要被設(shè)計成one-liners,因此它應(yīng)該用于簡單的東西。對于更復(fù)雜的邏輯,則需要使用常規(guī)函數(shù)。
里將展示兩個具體示例,通過這些示例,我們無需為所有項目定義函數(shù),從而可以節(jié)省許少時間。雖然第一個示例可能不會在現(xiàn)實中常用,但值得一提。這就是對數(shù)字求平方。
- #regular function
- def square_number(x):
- res = x ** 2
- return res# lambda function
- square = lambda x: x ** 2# results
- print('square_number(4): {}'.format(square_number(4)))
- print('square lambda: {}'.format(square(4)))>>> square_number(4):16
- >>> square lambda: 16
上面的代碼片段以常規(guī)方式和lambda函數(shù)的方式完成了相同邏輯的實現(xiàn)。雖然結(jié)果是一樣的,但是lambda的單行看起來舒服多了!
第二個例子是關(guān)于檢查數(shù)字是偶數(shù)或非偶數(shù):
- #regular function
- def is_even(x):
- if x % 2 == 0:
- return True
- else:
- return False
- # lambda function
- even = lambda x: x % 2 == 0# results
- print('is_even(4): {}'.format(is_even(4)))
- print('is_even(3): {}'.format(is_even(3)))
- print('even(4): {}'.format(even(4)))
- print('even(3): {}'.format(even(3)))>>> is_even(4): True
- >>> is_even(3): False
- >>> even(4): True
- >>> even(3): False
再一次,同樣的邏輯以兩種方式實現(xiàn)。你來決定你喜歡哪一個吧。
2、列表解析(List Comprehensions)
簡單來說,列表解析使我們可以使用其他符號創(chuàng)建列表??梢詫⑵湟暈槔ㄌ杻?nèi)的單行循環(huán)。
在做特征工程時,使用列表解析很方便。例如,假設(shè)我們在通過分析電子郵件標(biāo)題來進行垃圾郵件檢測,那么我們會想弄明白是否問號會在垃圾郵件中經(jīng)常出現(xiàn)。如果用列表解析來實現(xiàn)的話,這將是一項非常簡單的任務(wù)。
就不再進行更多的理論解釋了。例子才是最重要的。
這里的例子選擇聲明一個常規(guī)函數(shù),該函數(shù)將檢查列表中以某個字符(在這種情況下為“ a”)開頭的項目。實施后,再用列表解析執(zhí)行相同的操作。猜猜哪個會寫起來更快呢?
- lst =['Acer', 'Asus', 'Lenovo', 'HP']# regular function
- def starts_with_a(lst):
- valids = []
- for word in lst:
- if word[0].lower() == 'a':
- valids.append(word)
- return valids
- # list comprehension
- lst_comp = [word for word in lst if word[0].lower() == 'a']# results
- print('starts_with_a: {}'.format(starts_with_a(lst)))
- print('list_comprehension: {}'.format(lst_comp))>>> starts_with_a:['Acer', 'Asus']
- >>> list_comprehension: ['Acer', 'Asus']
如果是第一次看到這樣的方式,語法可能會有點混亂。但是當(dāng)你每天都在寫這樣的函數(shù)時,它們會越來越吸引你,看你能把多少復(fù)雜的東西應(yīng)用進去。
3、Zip函數(shù)
這是在實踐中很少看到的內(nèi)置python方法之一。從數(shù)據(jù)科學(xué)家的角度來看,它使我們能夠同時迭代兩個或多個列表。在處理日期和時間時,這可以派上用場。
例如,有一個屬性表示某個事件的開始時間,而第二個屬性表示該事件的結(jié)束時間時,為了進一步分析,幾乎總是需要計算它們之間的時間差。而到目前為止,zip函數(shù)是最簡單的方法。
例如,來比較一些虛構(gòu)公司和虛構(gòu)地區(qū)的一周銷售日期:
- sales_north= [350, 287, 550, 891, 241, 653, 882]
- sales_south = [551, 254, 901, 776, 105, 502, 976]for s1, s2 in zip(sales_north,sales_south):
- print(s1 — s2)>>> -201
- 33
- -351
- 115
- 136
- 151
- -94
看看這有多么簡單吧??梢詰?yīng)用相同的邏輯同時迭代3個數(shù)組,只需要在括號中添加“ s3”和其他一些列表名稱即可。
結(jié)語
Pure Python真的非常強大。了解其功能后,就不再需要專門的庫來存放所有內(nèi)容了。這將幫助你成為一名更好的程序員。
練習(xí)這些技能、掌握它們,并將其應(yīng)用到日常工作中。無論是僅僅為了娛樂、完成學(xué)業(yè)還是工作,你都不會后悔的。