成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

早知如此!來看看 Python 函數的七個秘密

開發
Python 函數的七個重要知識點:類型提示以增加代碼可讀性;*args和**kwargs、Lambda函數和高階函數提供代碼靈活性;裝飾器讓我們無需修改原函數即可改變其行為;生成器函數實現惰性評估;最后,魔術方法在Python類中定義了特殊行為。這些知識點是每個Python開發者的必備工具。

Python 函數的七個重要知識點:類型提示以增加代碼可讀性;*args和**kwargs、Lambda函數和高階函數提供代碼靈活性;裝飾器讓我們無需修改原函數即可改變其行為;生成器函數實現惰性評估;最后,魔術方法在Python類中定義了特殊行為。這些知識點是每個Python開發者的必備工具。

(1)類型提示

下面的代碼在工作中隨處可見!

def magic(a, b):
    return a + b

我們可以輕易地編寫如上的函數,因為 Python 是動態類型的——也就是說,變量數據類型是在運行時確定的。

def magic(a: int, b: int) -> int:
    return a + b

不過,也可以編寫如上與先前完全相同,但帶有類型提示的函數:

  • a應為整數
  • b也應為整數
  • 函數的返回值應該是一個整數

當代碼庫變的更大時,類型提示在保持代碼盡可能地具有可讀性方面變得越來越重要。想想看,有 10,000 個函數,你需要推斷它們所接受的數據類型以及它們的返回類型,那就太“好玩”了。

def test1(ls: list[int], x: float) -> list[float]:
    pass

ls是整數列表,x應該是浮點數,函數應返回浮點數列表。

def test2(a: str, b: bool, c: dict[str, str]) -> dict[str, int]:
    pass

a應為字符串,b應為布爾值,c應為字典,其中鍵為字符串,值為字符串。返回值應為一個字典,其鍵為字符串,但值為整數。

請注意:類型提示只是提示,并不強制執行。如果我們沒有遵循類型提示給出的類型,Python 仍會允許這個操作。

(2)*args 和 **kwargs

在真實的開發中,會有大量的*args 和**kwargs參數:

  • args* 允許函數接受無限數量的位置參數。
  • kwargs 允許函數接受無限數量的關鍵字參數。

所有的位置參數都會被捕獲為元組參數,所有的關鍵字參數都會被捕獲為字典參數。

magic(1, 2, 'apple', a=4, b=5, c=[1, 2, 3])
  • 1、2 和 'apple'是位置參數。
  • a=4、b=5 和 c=[1,2,3]是關鍵字參數。
def magic(*args, **kwargs):
    print('args =', args)
    print('kwargs =', kwargs)


magic(1, 2, 'apple', a=4, b=5, c=[1, 2, 3])

# args = (1, 2, 'apple')
# kwargs = {'a':4, 'b':5, 'c':[1, 2, 3]}
  • 所有位置參數都被捕獲為元組參數。
  • 所有關鍵字參數都被捕獲為字典參數。

(3)Lambda 函數

Lambda 函數是一種小型匿名函數。例如:

def add(x, y):
    return x + y

可以將它重寫為 lambda 函數:

add = lambda x, y: x + y

函數的輸入在":"之前,返回值在":"之后:

# 另一個例子

def add10(x):
    return x + 10


# 等同于
add10 = lambda x: x + 10

Lambda 函數可以是匿名的,并且在需要將一個函數作為另一個函數的參數時,Lambda 函數可能非常有用:

def apply(func, x):
    return func(x)


x = apply(lambda x: x + 10, 7)
print(x)  # 17

(4)高階函數

高階函數可以接受另一個函數作為參數,或者返回另一個函數,或者同時滿足這兩個條件。比如以下的 apply 函數:

def apply(func, x):
    return func(x)


x = apply(lambda x: x + 10, 7)
print(x)  # 17

在上述示例中,apply函數就是一個高階函數,因為它接受了另一個函數即func作為參數。

能熟練運用高階函數,會讓你的代碼更為靈活強大。

(5)裝飾器

裝飾器是能夠接受并返回函數的特殊高階函數,它的目標是在不改變原函數源代碼的情況下改變函數的行為。

注意:裝飾器函數既接受函數又返回函數。

# 這是 decorator 函數
def add_exclamation(func):
    def wrapper(name):
        return func(name) + '!'

    return wrapper


# 這是被裝飾的函數
def hello(name):
    return 'hello ' + name


# 實際的裝飾動作在此進行
hello = add_exclamation(hello)

# 現在,我們的函數的行為略有變化
print(hello('tom'))  # hello tom!

我們可以用@add_exclamation替代hello=add_exclamation(hello),因為實際上它們做的事情是完全一樣的。

def add_exclamation(func):
    def wrapper(name):
        return func(name) + '!'

    return wrapper


@add_exclamation
def hello(name):
    return 'hello ' + name


print(hello('tom'))  # hello tom!

裝飾器可以用于日志記錄、計時、處理異常、驗證身份、REST API等任務,是一個非常有用的工具!

(6)生成器函數

你是否曾遇到過這樣的類似于<generator object x at 0x1029b4a90>的信息?當我們使用生成器函數時,就會出現這種情況。

當我們使用yield時,函數就變成了生成器函數。yield和return關鍵字類似,都是從函數中輸出一個值,但與return不同的是,yield并不會停止整個函數。

# 常規函數
def test():
    return [1, 2, 3]


x = test()
print(x)  # [1, 2, 3]
# 生成器函數,但我們仍然稱之為標準函數
def test():
    yield 1
    yield 2
    yield 3


x = test()
print(x)  # <generator object x at 0x1029b4a90>
# 生成器函數,但我們使用循環調用它
def test():
    yield 1
    yield 2
    yield 3


for i in test():
    print(i, end=' ')

# 1 2 3

生成器執行了惰性評估——也就是說,它只在絕對必要的情況下起作用(例如,當我們使用循環時)。這使代碼在某些方面更為高效。

(7)特殊的魔法(Dunder)方法

這些在企業 Python 代碼中也隨處可見,特別是在涉及到面向對象編程時。魔術方法以兩個下劃線字符開始和結束,例如__init__,__str__,__getitem__,__add__等等。它們在 Python 類中定義了特殊行為。

class Dog:
    # 定義如何為 dog 分配屬性
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # 定義當我們對 dog 執行 str() 時會返回什么
    def __str__(self):
        return 'Dog!'

    # 定義當我們執行 dog + something 時會返回什么
    def __add__(self, something):
        return 'Dog ' + str(something)

    # 定義當我們執行 dog[something] 時會返回什么
    def __getitem__(self, something):
        return 123

了解更多的魔術方法可以讓你的類更靈活,滿足更多場景的需求。

總結

本文概述了 Python 函數的七個重要知識點:類型提示以增加代碼可讀性;*args和**kwargs、Lambda函數和高階函數提供代碼靈活性;裝飾器讓我們無需修改原函數即可改變其行為;生成器函數實現惰性評估;最后,魔術方法在Python類中定義了特殊行為。這些知識點是每個Python開發者的必備工具。

希望這篇文章對你有所幫助,讓你能更好地理解 python 函數。

責任編輯:華軒 來源: 哈希編程
相關推薦

2017-07-28 14:43:49

大數據數據可視化秘密

2023-09-13 11:04:41

人工智能技術蘇格拉底

2018-10-16 15:12:48

2018-10-18 11:03:06

2021-09-22 12:45:47

Python數據分析

2025-04-24 08:31:57

2023-05-29 07:27:25

2023-03-23 15:18:03

JavaScrip代碼實踐

2022-05-23 11:13:02

Python工具

2024-08-30 14:29:03

2024-11-06 16:45:39

Python游戲開發代碼

2018-01-30 17:54:37

數據庫MySQLSQL Server

2024-11-08 16:24:39

2023-10-08 09:52:55

2022-04-25 14:27:05

Pandas函數數據

2015-06-11 13:34:54

編程編程階段

2021-11-17 15:28:06

LinuxLinux命令

2022-06-15 10:24:13

Pytho裝飾器代碼

2022-09-21 11:47:15

CIO虛假敏捷

2024-11-06 14:26:40

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品国产a | 天天天操天天天干 | 电影午夜精品一区二区三区 | 日韩欧美三级电影 | 美女在线视频一区二区三区 | 国产成人精品久久久 | 国产精品色 | 亚洲综合视频 | 成人免费视频网站 | 久久久久国产 | 亚洲激情视频在线 | 午夜激情在线视频 | 91色在线视频 | 一级美国黄色片 | 国产精品视频在线观看 | 国产日屁 | 国产婷婷精品av在线 | 天天综合网天天综合色 | 日韩不卡一区二区三区 | 亚洲一区久久 | 日韩精品一区二区三区四区 | 成人欧美一区二区三区黑人孕妇 | 91久久精品国产 | 日日噜噜噜夜夜爽爽狠狠视频97 | 91在线一区 | 盗摄精品av一区二区三区 | 日本黄色免费片 | 一区二区三区四区免费观看 | 国产成人精品久久久 | 在线日韩| 色www精品视频在线观看 | 在线观看av网站永久 | 久草高清视频 | 青青久在线视频 | 国产精品成人一区二区 | 99精品国自产在线观看 | 国产亚洲精品久久久久动 | 国产精品免费一区二区三区四区 | www.久| 在线精品一区二区三区 | 精品成人免费视频 |