9種你不知道的Python 3功能
由于Python EOL,一些開發(fā)人員已開始將其Python版本從2轉(zhuǎn)換為3。 最著名的更改之一是Python 3中的print() 函數(shù)替換了Python 2中的print函數(shù)。但是,如果在print關(guān)鍵字之后添加空格,則括號會在Python 2中起作用,因為解釋器會將其視為表達式 。
以下是一些罕見特征的說明,這些特征只能在Python 3中找到,目的是快速解決Python問題。
所有示例均使用Python 3.8.0進行編碼。
1. 枚舉
Python 3允許您以簡單的方式在Enum類中編寫枚舉。 枚舉由類語法組成,可簡化讀取和寫入的過程,但沒有任何結(jié)構(gòu)-代碼不易產(chǎn)生。
- from enum import Enum, auto
- class Fruit(Enum): APPLE = auto() ORANGE = auto() GUAVA = auto()print(Fruit.APPLE)
- # Fruit.APPLE
當(dāng)確切值微不足道時,您可以使用自動值來代替。
枚舉是與特定的固定值關(guān)聯(lián)的符號項(成員)的集合。 在枚舉中,可以通過命名以及單獨迭代枚舉來區(qū)分符號名稱。
- for fruit in Fruit:
- print(fruit)
- -> Fruit.APPLE
- -> Fruit.ORANGE
- -> Fruit.GUAVA
最低要求Python版本:3.4
2. 類型提示
相對于動態(tài)而言,靜態(tài)打字是計算機語言中的熱門話題,每個人對此都有自己的見解。 我將允許查看者考慮何時編寫類型。 但是,我覺得您必須了解Python 3支持類型提示。
- def fruits_word(line: str) -> bool:
- return "fruit" in line
- test = fruits_word("I love to eat fresh fruits")
- print(test)# True
最低要求Python版本:3.5
3. Pathlib
F字符串令人難以置信,但是諸如文件路徑之類的字符串都有其自己的庫,這些庫使操作它們變得更加容易。 Pathlib模塊簡化了各種復(fù)雜的情況,并且還優(yōu)化了一些簡單的情況。 作為使用文件路徑的便捷抽象,Python 3提供了pathlib。
- from pathlib import Path
- root = Path('blog_new_folder')
- print(root)
- # blog_new_folder
- path = root / 'new_program'
- print(path.resolve())
- # /home/vivekcoder/Workspace/My_Programming/Medium-Articles/python3_uncommon_features/blog_new_folder/new_program
我覺得這篇文章會啟發(fā)您在需要處理Python文件時使用Python Pathlib模塊。
最低要求Python版本:3.4
4. F-Strings
在沒有字符串的情況下,很難以任何編程語言執(zhí)行任何操作,并且您希望使用結(jié)構(gòu)化的方法來使用字符串來保持高效。 大多數(shù)使用Python的人都喜歡使用format方法。
- import datetime
- name = "Leijie"
- activity = "writing Toutiao article"
- time = datetime.date(2020, 8, 15)
- message = 'My name is {}, I completed an activity {} on {}.'.format(name, activity, time)
- print(message)
- # My name is Leijie, I completed an activity writing Toutiao article on 2020-08-15.
除了格式外,Python 3還提供了一種通過f字符串插值字符串的通用方法。 上面的帶有f字符串的代碼如下所示:
- import datetime
- name = "Leijie"
- activity = "writing Toutiao article"
- time = datetime.date(2020, 8, 15)
- message = f'My name is {name}, I completed an activity {activity} on {time:%A, %B %d, %Y}.'
- print(message)# My name is Leijie, I completed an activity writing Toutiao article
- on Saturday, August 15, 2020.
與利用字符串連接或格式化字符串相比,F(xiàn)-Strings創(chuàng)建的代碼甚至更易于理解和使用。
F字符串允許使用最少的語法將表達式集成到字符串文字中。 應(yīng)當(dāng)注意,f-Strings實際上是運行時表達式,而不是固定值。
最低要求Python版本:3.6
5. 內(nèi)置LRU緩存
如果最新的呼叫是傳入呼叫的最佳預(yù)測器,則LRU(最近最少使用)的緩存性能會很好。 (例如,最常見的新聞服務(wù)器帖子每天都會變化)。 緩存的大小限制意味著,如果沒有像Web服務(wù)器這樣的長時間運行的循環(huán),緩存就不會擴展。
定義用戶功能時,它必須是可調(diào)用的。 這使得在Python 3中可以將lru_cache裝飾器直接應(yīng)用于用戶函數(shù)。
下面是一個斐波那契函數(shù)的示例,我們知道該函數(shù)將從緩存中受益,因為通過遞歸,它可以多次執(zhí)行相同的工作。
- import time
- def fibon(number: int) -> int:
- if number == 0: return 0
- if number == 1: return 1
- return fibon(number-1) + fibon(number-2)
- start = time.time()fibon(20)
- print(f'Duration: {time.time() - start}s')
- -> Duration: 0.007005214691162109s
在這里,我們可以利用lru-cache對其進行配置。 (這種優(yōu)化方法稱為備忘錄)。 裝飾器涵蓋了一個具有備忘錄的可調(diào)用函數(shù),該函數(shù)可存儲最近調(diào)用的最大大小。
- 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(20)
- print(f'Duration: {time.time() - start}s')
- -> Duration: 4.341516078231e-09s
最低要求Python版本:3.2
6. 擴展的可重復(fù)拆包
我將允許代碼在下面回應(yīng)。 一個示例描述了功能,該功能優(yōu)于1000個單詞:
- x, *y, z = range(4)
- print(x, y, z)
- # 0 [1, 2] 3
- python_version, file_name, topic, *output = "python3.0 hello.py betterprogramming 1 2 3 4".split()
- print(python_version)
- print(file_name)
- print(topic)
- print(output)
- # python3.0
- # hello.py# betterprogramming# ['1', '2', '3', '4']
- a, b, c, *d = range(7)
- print(b, d)
- # 1 [3, 4, 5, 6]
最低要求Python版本:3.0
有關(guān)擴展的可迭代解壓縮的更多信息,請參見此處的官方Python 3文檔。
7. 數(shù)字文字中的下劃線
Python 3.6提供了一種令人興奮的方法,可以通過強調(diào)數(shù)字來幫助閱讀數(shù)字文字。 它可以用于描述例如數(shù)千個,十六進制和二進制數(shù)。
- price = 50_000
- print(f'Price: {price}')
- # Price: 50000
- hexa_val = 0xABCD_EFD9
- print(f'Decimal equivalent: {hexa_val}')
- # Decimal equivalent: 2882400217
- bin_ary = 0b_0010_0110
- print(f'Decimal: {bin_ary}')
- # Decimal: 38
最低要求Python版本:3.6
8. 賦值表達式-“海象”運算符
在Python的最新版本中,引入了walrus運算符,該運算符可對表達式進行變量分配。 如果您打算稍后在代碼中引用外觀,則可能會有所幫助,并且可以節(jié)省一行或兩行代碼。
- birds = [‘owl’, ‘hen’, ‘duck’, ‘parrot’]
- for bird in birds: if (len_bird := len(bird)) > 4:
- print(f’A bird “{bird}” consists of “{len_bird}”, letters’)# A bird “parrot” consists of “6”, letters
最低要求Python版本:3.8
9. 數(shù)據(jù)類
Python 3提供的數(shù)據(jù)類幾乎沒有什么限制,并且由于裝飾器會自動生成諸如__init __()和__repr __()之類的獨特方法,因此可用于減少樣板代碼。 官方提案將其列為“具有默認(rèn)值的可變命名元組”。
- class Item_list:
- def __init__(self, name: str, perunit_cost: float, quantity_available: int = 0):
- self.name = name
- self.perunit_cost = perunit_cost
- self.quantity_available = quantity_available
- def total_cost(self) -> float:
- return self.perunit_cost * self.quantity_available
- book = Item_list("better programming.", 50, 2)
- x = book.total_cost()print(x)# 100
- print(book)# <__main__.Item_list object at 0x00000052DB9D2A48>
使用@dataclass裝飾器,您可以編寫相同的實現(xiàn):
- from dataclasses import dataclass
- @dataclassclass Item_list: name: str perunit_cost: float quantity_available: int = 0
- def total_cost(self) -> float:
- return self.perunit_cost * self.quantity_available
- book = Item_list("better programming.", 50, 2)
- x = book.total_cost()print(x)# 100
- print(book)
- # Item_list(name='better programming.', perunit_cost=50, quantity_available=2)
最低要求Python版本:3.7
有關(guān)數(shù)據(jù)類的進一步說明,請參閱Python 3官方文檔。
關(guān)鍵要點
沒有神奇的秘訣,只有細(xì)心,勤勞的工作,以及足夠的耐心和實踐。 每天,您需要學(xué)習(xí)新事物并享受工作,因為這是您成長的唯一途徑。
我相信上述見解可以為您顯示至少一個以前未認(rèn)識到的Python 3附加功能,并鼓勵您開始編寫更簡潔,更直觀的代碼。
謝謝閱讀!
原文:https://medium.com/better-programming/9-python-3-features-you-might-not-use-yet-fade13932a3e