十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶(hù) + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專(zhuān)業(yè)推廣+無(wú)憂(yōu)售后,網(wǎng)站問(wèn)題一站解決
Python3你還未get到的隱藏技能是什么,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
創(chuàng)新互聯(lián)是專(zhuān)業(yè)的江陰網(wǎng)站建設(shè)公司,江陰接單;提供成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行江陰網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
Python3你還未get到的隱藏技能
在 Python 3 推出后,人們開(kāi)始逐步將基于Python 2 的代碼遷移至 Python 3 。但在遷移過(guò)程中,很多代碼都未能使用到 Python 3 提供的新功能。這里介紹了相關(guān)功能,包括字符串格式化處理、文件路徑處理、類(lèi)型提示、內(nèi)置 LRU 緩存等等,幫助大家更好地利用 Python 3 書(shū)寫(xiě)代碼。
由于 Python 2 即將退出歷史的舞臺(tái),許多人都開(kāi)始將 Python 2 的代碼轉(zhuǎn)換為 Python 3 ,但在這一修改過(guò)程中,人們似乎只是多加了幾個(gè)括號(hào),大多數(shù)人并沒(méi)有注意到 Python 3 中激動(dòng)人心的新功能。這里將介紹 Python 3 中一些有趣的功能,希望這些功能能夠幫助大家更加輕松的解決一些問(wèn)題。
【注】:文中的代碼示例基于 Python 3.7 編寫(xiě),為方便使用,在每個(gè)功能后面都列出了該功能所需的最低 Python 版本。
f-strings (3.6+)
對(duì)任何一種編程語(yǔ)言來(lái)說(shuō),字符串處理是一項(xiàng)很重要的內(nèi)容,字符串處理往往是很多程序的基礎(chǔ)部分。由于人工處理字符串非常繁瑣,我們更希望用一種結(jié)構(gòu)化的方法來(lái)處理它們。在 Python 中,我們一般使用 format 來(lái)進(jìn)行結(jié)構(gòu)化字符串處理,如下所示:
user = "Jane Doe"action = "buy"log_message = 'User {} has logged in and did an action {}.'.format( user, action)print(log_message)# User Jane Doe has logged in and did an action bu
除了 format 之外, Python 3 還提供了一個(gè)更加靈活的方法來(lái)處理字符串,那就是 f-string 。如下所示,我們用 f-string 來(lái)和實(shí)現(xiàn)上面代碼相同的功能:
user = "Jane Doe"action = "buy"log_message = f'User {user} has logged in and did an action {action}.'print(log_message)# User Jane Doe has logged in and did an action buy.
Pathlib (3.4+)
如果需要處理文件路徑,我們可以使用 Python 3 中的 pathlib 庫(kù),使對(duì)文件路徑的操作更加便捷。如果你對(duì) pathlib 存在疑惑,可以參考這篇文章。下面提供了一個(gè)代碼示例:
from pathlib import Path root = Path('post_sub_folder') print(root) # post_sub_folder path = root / 'happy_user' # Make the path absolute print(path.resolve()) # /home/weenkus/Workspace/Projects/DataWhatNow-Codes/how_your_python3_should_look_like/post_sub_folder/happy_user
類(lèi)型提示 (3.5+)
靜態(tài)類(lèi)型與動(dòng)態(tài)類(lèi)型是軟件工程中的一個(gè)熱門(mén)話題,Python 3 提供了支持 type hinting(類(lèi)型提示)的方法,下面提供了一個(gè)示例:
def sentence_has_animal(sentence: str) -> bool: return "animal" in sentencesentence_has_animal ("Donald had a farm without animals")# True
枚舉 (3.4+)
Python 3 中的 Enum 類(lèi)支持枚舉功能,可以使我們的程序變得更加簡(jiǎn)潔。 Enum 是一種便捷的變量列表的打包方式,使用該方法能夠避免多個(gè)變量在代碼各處分布,使代碼顯得雜亂無(wú)章。
from enum import Enum, auto class Monster(Enum): ZOMBIE = auto() WARRIOR = auto() BEAR = auto() print(Monster.ZOMBIE) # Monster.ZOMBIE
枚舉是一個(gè)符號(hào)集合,每個(gè)符號(hào)都和唯一的變量對(duì)應(yīng)。通過(guò)使用枚舉,我們可以通過(guò)符號(hào)標(biāo)識(shí)來(lái)比較各個(gè)成員,我們還可以對(duì)枚舉本身進(jìn)行迭代。
https://docs.python.org/3/library/enum.html for monster in Monster: print(monster) # Monster.ZOMBIE # Monster.WARRIOR # Monster.BEAR
內(nèi)置的 LRU 緩存 (3.2+)
在現(xiàn)如今使用的硬件和軟件中,緩存無(wú)所不在。Python 3 通過(guò) lru_cache 來(lái)使用 LRU (Least Recently Used) 緩存。
下面的代碼定義了一個(gè)斐波拉契函數(shù),由于該函數(shù)的運(yùn)算需要多次遞歸,每次遞歸都會(huì)執(zhí)行相同的工作,因此使用緩存能夠加速它的計(jì)算。
import time def fib(number: int) -> int: if number == 0: return 0 if number == 1: return 1 return fib(number-1) + fib(number-2) start = time.time() fib(40) print(f'Duration: {time.time() - start}s') # Duration: 30.684099674224854s
我們可以使用 lru_cache 來(lái)優(yōu)化該運(yùn)算。這種優(yōu)化極技術(shù)稱(chēng)為 memoization ,它能夠把執(zhí)行時(shí)間從幾秒縮減到幾納秒。
from functools import lru_cache @lru_cache(maxsize=512) def fib_memoization(number: int) -> int: if number == 0: return 0 if number == 1: return 1 return fib_memoization(number-1) + fib_memoization(number-2) start = time.time() fib_memoization(40) print(f'Duration: {time.time() - start}s') # Duration: 6.866455078125e-05s
擴(kuò)展的可迭代解析功能(3.0+)
這里不做詳細(xì)解釋?zhuān)苯淤N出示例代碼,具體解決可以參考這篇文檔。
head, *body, tail = range(5) print(head, body, tail) # 0 [1, 2, 3] 4 py, filename, *cmds = "python3.7 script.py -n 5 -l 15".split() print(py) print(filename) print(cmds) # python3.7 # script.py # ['-n', '5', '-l', '15'] first, _, third, *_ = range(10) print(first, third) # 0
數(shù)據(jù)類(lèi)(3.7+)
Python 3 引入了數(shù)據(jù)類(lèi) (data class)。其裝飾器會(huì)自動(dòng)生成特征方法,例如 __init__() 和 __repr()__,這能夠幫助減少樣本代碼的數(shù)量。在官方文檔中,它們被稱(chēng)作 “具有默認(rèn)值的可變命名元組” 。
class Armor: def __init__(self, armor: float, description: str, level: int = 1): self.armor = armor self.level = level self.description = description def power(self) -> float: return self.armor * self.level armor = Armor(5.2, "Common armor.", 2) armor.power() # 10.4 print(armor) # <__main__.Armor object at 0x7fc4800e2cf8>
接來(lái)下我們使用數(shù)據(jù)類(lèi)來(lái)實(shí)現(xiàn)上面的代碼:
from dataclasses import dataclass @dataclass class Armor: armor: float description: str level: int = 1 def power(self) -> float: return self.armor * self.level armor = Armor(5.2, "Common armor.", 2) armor.power() # 10.4 print(armor) # Armor(armor=5.2, description='Common armor.', level=2
隱式命名空間包(3.3+)
構(gòu)建Python代碼有很多方法,其中一種就是在包(packages)中進(jìn)行構(gòu)建(即包含一個(gè) init.py 文件的文件夾)。以下示例由 Python 的官方文檔提供:
sound/ Top-level package __init__.py Initialize the sound package formats/ Subpackage for file format conversions __init__.py wavread.py wavwrite.py aiffread.py aiffwrite.py auread.py auwrite.py ... effects/ Subpackage for sound effects __init__.py echo.py surround.py reverse.py ... filters/ Subpackage for filters __init__.py equalizer.py vocoder.py karaoke.py ...
在 Python 2 中,上面的每個(gè)文件夾都必須有一個(gè) init.py 文件,該文件用于將其所在文件夾轉(zhuǎn)化為 Python 包。然而在 Python 3 中,通過(guò)使用隱式命名空間包(Implicit Namespace Package:https://www.python.org/dev/peps/pep-0420/),這些文件就不再需要了。
sound/ Top-level package __init__.py Initialize the sound package formats/ Subpackage for file format conversions wavread.py wavwrite.py aiffread.py aiffwrite.py auread.py auwrite.py ... effects/ Subpackage for sound effects echo.py surround.py reverse.py ... filters/ Subpackage for filters equalizer.py vocoder.py karaoke.py ...
注:官方文檔PEP 420 Specification 指出,對(duì)于一些常規(guī)的包,init.py 仍然是需要的 ,如果將該文件刪除,就會(huì)把該 Python 包變成一個(gè)本地的命名空間包,這將會(huì)產(chǎn)生一些額外的限制,具體可以參考這篇文檔。
總結(jié)
關(guān)于Python3你還未get到的隱藏技能是什么問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。