亞洲資本網 > 資訊 > 焦點 > 正文
理解 10 個最難的 Python 概念
2023-08-28 18:22:32來源: 啟辰8


Python語法簡單,易于學習,是初學者的理想選擇。 然而,當您深入研究 Python 時,您可能會遇到一些難以理解的具有挑戰(zhàn)性的概念。


(資料圖片)

在本文中,我將解釋 10 個最難的 Python 概念,包括遞歸、生成器、裝飾器、面向對象編程、線程、異常處理、*args 和 **kwargs、函數式編程、推導式和集合。

1. 遞歸

遞歸是一種編程技術,其中函數重復調用自身,直到滿足特定條件。 在 Python 中,遞歸函數是在自己的代碼塊中調用自身的函數。

以下是 Python 中計算數字階乘的遞歸函數的示例:

def factorial(n):    if n == 0:        return 1    else:        return n * factorial(n-1)

在此示例中,函數 Factorial() 接受參數 n 并檢查它是否等于 0。 如果 n 為零,則返回 1,因為 0 的階乘為 1。如果 n 不為零,則使用參數 n-1 調用自身,并將結果與 n 相乘。 這一直持續(xù)到 n 變?yōu)?0 并且函數返回最終結果。



2. 生成器

生成器是產生一系列結果的函數,但不創(chuàng)建列表。 它們比列表更節(jié)省內存。

具體來說,生成器是使用一種稱為生成器函數的特殊函數創(chuàng)建的。 這些函數的定義與常規(guī)函數類似,但它們不返回值,而是使用“yield”關鍵字返回生成器對象。 然后,可以在循環(huán)中使用生成器對象,根據需要一次生成一個值。

def my_generator():    for i in range(10):        yield ifor num in my_generator():    print(num)# Output# 0# 1# 2# 3# 4# 5# 6# 7# 8# 9

在此示例中,my_generator 函數生成從 0 到 9 的數字序列。調用該函數時,它返回一個生成器對象,可用于迭代序列的值。


3. 裝飾器

裝飾器是修改其他函數行為的函數。 裝飾器最常見的用途之一是在不修改原始代碼的情況下向現有函數添加功能。

在 Python 中,裝飾器是將另一個函數作為參數、修改它并返回它的函數。 它們用“@”符號編寫,后跟裝飾器函數的名稱。

def my_decorator(func):    def wrapper():        print("Before the function is called.")        func()        print("After the function is called.")    return wrapper@my_decoratordef say_hello():    print("Hello World!")# Call the decorated functionsay_hello()# Output:# Before the function is called.# Hello World!# After the function is called.

在此示例中,my_decorator 是一個裝飾器函數,它將函數作為其參數并返回一個新的函數包裝器。 包裝函數在調用原始函數之前和之后添加了一些額外的功能。

@my_decorator 語法是將 my_decorator 函數應用于 say_hello 函數的簡寫方式。 當say_hello被調用時,實際上是調用my_decorator返回的包裝函數,而my_decorator又調用了原來的say_hello函數。 這允許我們向 say_hello 函數添加額外的行為,而無需直接修改其代碼。

4. 面向對象編程

Python 是一種面向對象編程(OOP)語言。 OOP 是一種編程范式,強調使用對象和類來組織和構造代碼。

OOP 是通過使用類創(chuàng)建可重用代碼來創(chuàng)建可重用代碼。 對象本質上是類的實例,并且配備有定義其行為的屬性(數據)和方法(函數)。

要在 Python 中創(chuàng)建類,請使用 class 關鍵字,后跟類的名稱和冒號。 在類內部,您可以使用函數定義其屬性和方法。

例如,假設我們要創(chuàng)建一個名為 Person 的類,它具有 name 屬性和打印問候消息的greet 方法。 我們可以這樣定義它:

class Person:    def __init__(self, name):        self.name = name
def greet(self):        print("Hello, my name is", self.name)# Create a new Person object with the name Johnperson = Person("John")print(person.name) # Johnperson.greet() # Hello, my name is John

5. 線程

線程是一種用于同時執(zhí)行多個線程的技術。 它可以顯著提高程序的性能。 這是一個例子:

import threadingdef print_numbers():    for i in range(1, 11):        print(i)def print_letters():    for letter in ["a", "b", "c", "d", "e"]:        print(letter)thread1 = threading.Thread(target=print_numbers)thread2 = threading.Thread(target=print_letters)thread1.start()thread2.start()thread1.join()thread2.join()print("Finished")

在此示例中,我們定義了兩個函數 print_numbers 和 print_letters,它們分別簡單地將一些數字和字母打印到控制臺。 然后,我們創(chuàng)建兩個 Thread 對象,將目標函數作為參數傳遞,并使用 start() 方法啟動它們。 最后,我們使用 join() 方法等待兩個線程完成,然后再將“Finished”打印到控制臺。

6. 異常處理

異常處理是處理程序在執(zhí)行過程中可能出現的運行時錯誤或異常的過程。 Python提供了一種機制來捕獲和處理程序執(zhí)行過程中出現的異常,保證程序即使出現錯誤也能繼續(xù)運行。

try:    numerator = int(input("Enter numerator: "))    denominator = int(input("Enter denominator: "))    result = numerator / denominator    print("Result: ", result)except ZeroDivisionError:    print("Error: Cannot divide by zero!")except ValueError:    print("Error: Invalid input. Please enter an integer.")except Exception as e:    print("An error occurred:", e)

在此示例中,try 塊包含可能引發(fā)異常的代碼。 如果引發(fā)異常,它將被相應的 except 塊捕獲。

通過使用異常處理,我們可以處理代碼中的錯誤并防止程序崩潰。 它向用戶提供反饋,并根據發(fā)生的錯誤類型采取適當的操作。



7. *args 和 **kwargs

在 Python 中,*args 和 **kwargs 用于將未指定數量的參數傳遞給函數。 因此,在編寫函數定義時,您不必知道將向函數傳遞多少個參數。

*args 用于將可變數量的非關鍵字參數傳遞給函數。 * 運算符用于將傳遞給函數的參數解包到元組中。 這允許您將任意數量的參數傳遞給函數。

def my_function(*args):    for arg in args:        print(arg)my_function("hello", "world", "!")# Output:# hello# world# !

**kwargs 用于將可變數量的關鍵字參數傳遞給函數。 ** 運算符用于將傳遞給函數的關鍵字參數解壓縮到字典中。 這允許您將任意數量的關鍵字參數傳遞給函數。

def my_function(**kwargs):    for key, value in kwargs.items():        print(key, value)my_function(name="John", age=30, city="New York")# Output:# name John# age 30# city New York

8.函數式編程

函數式編程是一種強調使用函數來解決問題的編程范式。 Python 通過多個內置函數和特性(包括 lambda 函數、map()、filter() 和 reduce())提供對函數式編程的支持。

Lambda 是單行函數。

# A lambda function to square a numbersquare = lambda x: x**2# Using the lambda functionprint(square(5))   # Output: 25

map() 將函數應用于可迭代對象的每個元素,并返回一個包含結果的新可迭代對象。

nums = [1, 2, 3, 4, 5]squared_nums = list(map(lambda x: x**2, nums))print(squared_nums) # Output: [1, 4, 9, 16, 25]

filter() 創(chuàng)建一個函數返回 true 的元素列表。

nums = [1, 2, 3, 4, 5]even_nums = list(filter(lambda x: x % 2 == 0, nums))print(even_nums) # Output: [2, 4]

reduce() 以累積方式將函數應用于可迭代的元素并返回單個值。

from functools import reducenums = [1, 2, 3, 4, 5]product = reduce(lambda x, y: x*y, nums)print(product) # Output: 120


9. 推導式

在 Python 中,推導式是一種簡潔高效的方法,通過對可迭代對象的元素應用轉換或過濾條件來創(chuàng)建新列表、字典或集合。

列表推導式:

# Create a list of squares for the first 10 positive integerssquares = [x**2 for x in range(1, 11)]print(squares)# Output: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

字典:

# Create a dictionary with keys from a list and values as the length of each keyfruits = ["apple", "banana", "kiwi", "mango"]fruit_lengths = {fruit: len(fruit) for fruit in fruits}print(fruit_lengths)# Output: {"apple": 5, "banana": 6, "kiwi": 4, "mango": 5}

Set 推導式:

# Create a set of all even numbers between 1 and 20evens = {x for x in range(1, 21) if x % 2 == 0}print(evens)# Output: {2, 4, 6, 8, 10, 12, 14, 16, 18, 20}

生成器推導式:

# Create a generator that yields the square of each number from 1 to 10squares_gen = (x**2 for x in range(1, 11))for square in squares_gen:    print(square)# Output:# 1# 4# 9# 16# 25# 36# 49# 64# 81# 100



10. 集合

在 Python 中,集合模塊提供了內置類型的替代方案,這些替代方案更高效并提供附加功能,例如計數器、默認字典和命名元組。

集合模塊中的 Counter 類用于計算列表中元素的出現次數。

from collections import Counterlst = ["apple", "banana", "cherry", "apple", "cherry", "cherry"]count = Counter(lst)print(count)# Output: Counter({"cherry": 3, "apple": 2, "banana": 1})print(count["cherry"])# Output: 3

Defaultdict 類是內置 dict 類的子類,它為缺失的鍵提供默認值。

from collections import defaultdictd = defaultdict(int)d["a"] = 1d["b"] = 2print(d["a"])# Output: 1print(d["c"])# Output: 0 (default value for missing keys is 0 because of int argument)

nametuple 類用于創(chuàng)建命名元組,它與常規(guī)元組類似,但字段被命名,從而更容易訪問它們。

from collections import namedtuplePerson = namedtuple("Person", ["name", "age", "gender"])p1 = Person(name="Alice", age=30, gender="Female")p2 = Person(name="Bob", age=25, gender="Male")print(p1.name)# Output: Aliceprint(p2.age)# Output: 25

感謝您的閱讀,我希望本文能夠幫助您更好地理解最具挑戰(zhàn)性的 Python 概念!

關鍵詞:

專題新聞
  • 10812名殘疾兒童獲得搶救性康復救助
  • 手機拍攝視頻技巧與拍攝方法教程 手機拍攝視頻技巧與拍攝方法
  • 菲利克斯·卡通戈(關于菲利克斯·卡通戈簡述)
  • 普門科技:2023年半年度凈利潤約1.35億元 同比增加35.19%
  • 9月8日火炬?zhèn)鬟f之日《榮耀亞運》首發(fā)上市
  • 華為相機錯誤無法啟動相機 華為手機相機無法啟動
最近更新

京ICP備2021034106號-51

Copyright © 2011-2020  亞洲資本網   All Rights Reserved. 聯系網站:55 16 53 8 @qq.com