91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python3你還未get到的隱藏技能是什么

發布時間:2021-10-25 18:39:28 來源:億速云 閱讀:134 作者:柒染 欄目:編程語言

Python3你還未get到的隱藏技能是什么,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

Python3你還未get到的隱藏技能

在 Python 3 推出后,人們開始逐步將基于Python 2 的代碼遷移至 Python 3 。但在遷移過程中,很多代碼都未能使用到 Python 3 提供的新功能。這里介紹了相關功能,包括字符串格式化處理、文件路徑處理、類型提示、內置 LRU 緩存等等,幫助大家更好地利用 Python 3 書寫代碼。

由于 Python 2 即將退出歷史的舞臺,許多人都開始將 Python 2 的代碼轉換為 Python 3 ,但在這一修改過程中,人們似乎只是多加了幾個括號,大多數人并沒有注意到 Python 3 中激動人心的新功能。這里將介紹 Python 3 中一些有趣的功能,希望這些功能能夠幫助大家更加輕松的解決一些問題。

【注】:文中的代碼示例基于 Python 3.7 編寫,為方便使用,在每個功能后面都列出了該功能所需的最低 Python 版本。

f-strings (3.6+)

對任何一種編程語言來說,字符串處理是一項很重要的內容,字符串處理往往是很多程序的基礎部分。由于人工處理字符串非常繁瑣,我們更希望用一種結構化的方法來處理它們。在 Python 中,我們一般使用 format 來進行結構化字符串處理,如下所示:

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 還提供了一個更加靈活的方法來處理字符串,那就是 f-string 。如下所示,我們用 f-string 來和實現上面代碼相同的功能:

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 庫,使對文件路徑的操作更加便捷。如果你對 pathlib 存在疑惑,可以參考這篇文章。下面提供了一個代碼示例:

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

類型提示 (3.5+)

靜態類型與動態類型是軟件工程中的一個熱門話題,Python 3 提供了支持 type hinting(類型提示)的方法,下面提供了一個示例:

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 類支持枚舉功能,可以使我們的程序變得更加簡潔。 Enum 是一種便捷的變量列表的打包方式,使用該方法能夠避免多個變量在代碼各處分布,使代碼顯得雜亂無章。

from enum import Enum, auto
class Monster(Enum):
 ZOMBIE = auto()
 WARRIOR = auto()
 BEAR = auto()
print(Monster.ZOMBIE)
# Monster.ZOMBIE

枚舉是一個符號集合,每個符號都和唯一的變量對應。通過使用枚舉,我們可以通過符號標識來比較各個成員,我們還可以對枚舉本身進行迭代。

https://docs.python.org/3/library/enum.html
for monster in Monster:
 print(monster)
 
# Monster.ZOMBIE
# Monster.WARRIOR
# Monster.BEAR

內置的 LRU 緩存 (3.2+)

在現如今使用的硬件和軟件中,緩存無所不在。Python 3 通過 lru_cache 來使用 LRU (Least Recently Used) 緩存。

下面的代碼定義了一個斐波拉契函數,由于該函數的運算需要多次遞歸,每次遞歸都會執行相同的工作,因此使用緩存能夠加速它的計算。

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 來優化該運算。這種優化極技術稱為 memoization ,它能夠把執行時間從幾秒縮減到幾納秒。

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

擴展的可迭代解析功能(3.0+)

這里不做詳細解釋,直接貼出示例代碼,具體解決可以參考這篇文檔。

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

數據類(3.7+)

Python 3 引入了數據類 (data class)。其裝飾器會自動生成特征方法,例如 __init__() 和 __repr()__,這能夠幫助減少樣本代碼的數量。在官方文檔中,它們被稱作 “具有默認值的可變命名元組” 。

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>

接來下我們使用數據類來實現上面的代碼:

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+)

構建Python代碼有很多方法,其中一種就是在包(packages)中進行構建(即包含一個 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 中,上面的每個文件夾都必須有一個 init.py 文件,該文件用于將其所在文件夾轉化為 Python 包。然而在 Python 3 中,通過使用隱式命名空間包(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 指出,對于一些常規的包,init.py 仍然是需要的 ,如果將該文件刪除,就會把該 Python 包變成一個本地的命名空間包,這將會產生一些額外的限制,具體可以參考這篇文檔。

總結

關于Python3你還未get到的隱藏技能是什么問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

黄陵县| 芮城县| 香港| 禹州市| 司法| 大厂| 奉节县| 大余县| 休宁县| 博湖县| 思茅市| 新巴尔虎右旗| 聊城市| 突泉县| 化州市| 苏尼特左旗| 昌黎县| 明溪县| 石阡县| 怀柔区| 大竹县| 葵青区| 巴里| 将乐县| 萍乡市| 罗定市| 玉林市| 宣汉县| 莱西市| 瑞昌市| 安福县| 临安市| 阿尔山市| 得荣县| 沭阳县| 泸水县| 吉水县| 阿荣旗| 罗山县| 通辽市| 都昌县|