自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Python 基礎(chǔ)中較難理解的 15 個知識

開發(fā) 前端
生成器是一種特殊的迭代器,它使用 yield 關(guān)鍵字來定義。生成器函數(shù)會暫停執(zhí)行并返回一個值,然后在下一次訪問時繼續(xù)執(zhí)行。這樣可以節(jié)省內(nèi)存,并使代碼更簡潔。

1. 面向?qū)ο缶幊蹋∣bject-Oriented Programming, OOP)

面向?qū)ο缶幊淌且环N程序設(shè)計(jì)思想,它將代碼組織成可重用的對象,并通過定義類、創(chuàng)建對象和調(diào)用方法來實(shí)現(xiàn)。

類與對象

類是一個模板,描述了對象的屬性和操作。對象是類的實(shí)例,可以訪問類的屬性和方法。

示例:

class Dog:
    def __init__(self, name):
        self.name = name
    def bark(self):
        print(f"{self.name} is barking!")
my_dog = Dog("Buddy")
my_dog.bark()  # 輸出結(jié)果: Buddy is barking!

解釋:

__init__ 方法是類的構(gòu)造函數(shù),用于初始化對象的屬性。

bark 方法是類的一個方法,用于執(zhí)行特定的操作。

繼承

繼承允許創(chuàng)建一個新類,從現(xiàn)有的類中繼承屬性和方法。子類可以重寫或擴(kuò)展父類的功能。

示例:

class Animal:
    def eat(self):
        print("The animal is eating.")
class Cat(Animal):
    def meow(self):
        print("Meow!")
my_cat = Cat()
my_cat.eat()  # 輸出結(jié)果: The animal is eating.
my_cat.meow()  # 輸出結(jié)果: Meow!

解釋:

Cat 類繼承了 Animal 類,因此 Cat 類的實(shí)例可以調(diào)用 eat 方法。

meow 方法是 Cat 類特有的方法。

多態(tài)

多態(tài)允許不同類的對象對相同的方法做出不同的響應(yīng)。這使得代碼更靈活、可擴(kuò)展和可維護(hù)。

示例:

class Shape:
    def draw(self):
        raise NotImplementedError()
class Circle(Shape):
    def draw(self):
        print("Drawing a circle.")
class Rectangle(Shape):
    def draw(self):
        print("Drawing a rectangle.")
def draw_shape(shape):
    shape.draw()
circle = Circle()
rectangle = Rectangle()
draw_shape(circle)  # 輸出結(jié)果: Drawing a circle.
draw_shape(rectangle)  # 輸出結(jié)果: Drawing a rectangle.

解釋:

Shape 類定義了一個 draw 方法,但沒有具體實(shí)現(xiàn),子類必須實(shí)現(xiàn)這個方法。

Circle 和 Rectangle 類分別實(shí)現(xiàn)了 draw 方法。

draw_shape 函數(shù)接受一個 Shape 對象并調(diào)用其 draw 方法。

2. 迭代器與生成器

迭代器和生成器是 Python 中處理可迭代對象的重要概念,它們可以逐個地處理序列中的元素。

迭代器

迭代器是一個實(shí)現(xiàn)了 __iter__() 和 __next__() 方法的對象。它通過 __next__() 方法返回序列中的下一個元素,并在沒有更多元素時引發(fā) StopIteration 異常。

示例:

numbers = [1, 2, 3]
iter_numbers = iter(numbers)
print(next(iter_numbers))  # 輸出結(jié)果: 1
print(next(iter_numbers))  # 輸出結(jié)果: 2
print(next(iter_numbers))  # 輸出結(jié)果: 3

解釋:

iter 函數(shù)將列表轉(zhuǎn)換為迭代器。

next 函數(shù)獲取迭代器的下一個元素。

生成器

生成器是一種特殊的迭代器,它使用 yield 關(guān)鍵字來定義。生成器函數(shù)會暫停執(zhí)行并返回一個值,然后在下一次訪問時繼續(xù)執(zhí)行。這樣可以節(jié)省內(nèi)存,并使代碼更簡潔。

示例:

def even_numbers(n):
    for i in range(n):
        if i % 2 == 0:
            yield i
for num in even_numbers(10):
    print(num)  # 輸出結(jié)果: 0, 2, 4, 6, 8

解釋:

even_numbers 是一個生成器函數(shù),使用 yield 關(guān)鍵字返回偶數(shù)。

for 循環(huán)遍歷生成器,每次調(diào)用 yield 時生成一個值。

3. 異常處理

異常處理是一種捕獲和處理程序中出現(xiàn)的錯誤的機(jī)制。Python 提供了 try-except-finally 語句來處理異常。

示例:

try:
    result = 10 / 0
except ZeroDivisionError:
    print("除零錯誤!")
finally:
    print("清理代碼。")

解釋:

try 塊中的代碼可能會引發(fā) ZeroDivisionError 異常。

except 塊捕獲并處理 ZeroDivisionError 異常。

finally 塊中的代碼無論是否發(fā)生異常都會執(zhí)行。

4. 并發(fā)與多線程

并發(fā)和多線程是指同時執(zhí)行多個任務(wù)的能力。

并發(fā)

并發(fā)是指程序設(shè)計(jì)的一種方式,使得多個任務(wù)在同一時間段內(nèi)交替執(zhí)行。Python 中的 threading 模塊可以用于實(shí)現(xiàn)并發(fā)。

示例:

import threading
def print_numbers():
    for i in range(1, 6):
        print(i)
def print_letters():
    for letter in ['a', 'b', 'c', 'd', 'e']:
        print(letter)
t1 = threading.Thread(target=print_numbers)
t2 = threading.Thread(target=print_letters)
t1.start()
t2.start()
t1.join()
t2.join()

解釋:

print_numbers 和 print_letters 是兩個函數(shù),分別打印數(shù)字和字母。

threading.Thread 創(chuàng)建兩個線程 t1 和 t2,分別執(zhí)行這兩個函數(shù)。

start 方法啟動線程。

join 方法等待線程執(zhí)行完畢。

多線程

多線程是指在一個進(jìn)程中運(yùn)行多個線程的能力。Python 使用全局解釋器鎖(GIL)來確保同一時間只有一個線程執(zhí)行 Python 字節(jié)碼。因此,在 CPU 密集型任務(wù)中,多線程可能無法實(shí)現(xiàn)真正的并行。

5. 文件操作和異常處理

文件操作是一種常見的編程任務(wù),而異常處理則用于在文件操作中處理潛在的錯誤。

示例:

try:
    with open("example.txt", "r") as file:
        contents = file.read()
except FileNotFoundError:
    print("文件未找到!")
except PermissionError:
    print("權(quán)限被拒絕!")
else:
    print(contents)
finally:
    print("清理代碼。")

解釋:

with 語句確保文件在操作完成后自動關(guān)閉。

try 塊中的代碼嘗試打開并讀取文件。

except 塊捕獲并處理 FileNotFoundError 和 PermissionError 異常。

else 塊在沒有異常時執(zhí)行。

finally 塊中的代碼無論是否發(fā)生異常都會執(zhí)行。

6. 迭代與推導(dǎo)式

迭代是指遍歷序列中的元素的過程。Python 提供了多種迭代方式,如 for 循環(huán)、列表推導(dǎo)式、生成器表達(dá)式等。

示例:

fruits = ["apple", "banana", "cherry"]
# 使用 for 循環(huán)迭代
for fruit in fruits:
    print(fruit)
# 使用列表推導(dǎo)式創(chuàng)建新列表
upper_fruits = [fruit.upper() for fruit in fruits]
print("大寫的水果列表:", upper_fruits)  # 輸出結(jié)果: ['APPLE', 'BANANA', 'CHERRY']
# 使用生成器表達(dá)式計(jì)算總長度
total_length = sum(len(fruit) for fruit in fruits)
print("總長度:", total_length)  # 輸出結(jié)果: 18

解釋:

for 循環(huán)遍歷列表中的每個元素。

列表推導(dǎo)式 [fruit.upper() for fruit in fruits] 創(chuàng)建一個新列表,其中每個元素都是原列表中對應(yīng)元素的大寫形式。

生成器表達(dá)式 sum(len(fruit) for fruit in fruits) 計(jì)算列表中所有元素的總長度。

7. 裝飾器(Decorators)

裝飾器是一種特殊類型的函數(shù),可以修改其他函數(shù)的行為或功能,而無需改變其源代碼。

示例:

def my_decorator(func):
    def wrapper():
        print("在函數(shù)之前執(zhí)行的代碼")
        func()
        print("在函數(shù)之后執(zhí)行的代碼")
    return wrapper
@my_decorator
def say_hello():
    print("Hello!")
say_hello()
# 輸出結(jié)果:
# 在函數(shù)之前執(zhí)行的代碼
# Hello!
# 在函數(shù)之后執(zhí)行的代碼

解釋:

my_decorator 是一個裝飾器函數(shù),它接受一個函數(shù)作為參數(shù),并返回一個新的函數(shù) wrapper。

@my_decorator 語法糖表示 say_hello 函數(shù)被 my_decorator 裝飾。

當(dāng)調(diào)用 say_hello 時,實(shí)際上是調(diào)用了 wrapper 函數(shù)。

8. 上下文管理器(Context Managers)

上下文管理器用于設(shè)置和清理資源,通常用于文件操作和數(shù)據(jù)庫連接等場景。

示例:

class MyContextManager:
    def __enter__(self):
        print("進(jìn)入上下文")
        return self
    def __exit__(self, exc_type, exc_val, exc_tb):
        print("退出上下文")
with MyContextManager() as manager:
    print("在上下文中執(zhí)行的代碼")
# 輸出結(jié)果:
# 進(jìn)入上下文
# 在上下文中執(zhí)行的代碼
# 退出上下文

解釋:

MyContextManager 類實(shí)現(xiàn)了 __enter__ 和 __exit__ 方法。

with 語句確保在進(jìn)入和退出上下文時分別調(diào)用 __enter__ 和 __exit__ 方法。

9. 閉包(Closures)

閉包是指一個函數(shù)對象,它記錄了其包含的自由變量的環(huán)境。

示例:

def outer_function(msg):
    def inner_function():
        print(msg)
    return inner_function
hi_func = outer_function("Hi")
bye_func = outer_function("Bye")
hi_func()  # 輸出結(jié)果: Hi
bye_func()  # 輸出結(jié)果: Bye

解釋:

outer_function 是一個外部函數(shù),它定義了一個內(nèi)部函數(shù) inner_function。

inner_function 訪問了外部函數(shù)的參數(shù) msg。

outer_function 返回 inner_function,從而形成了閉包。

10. 屬性訪問(Property)

屬性訪問允許你控制對類屬性的訪問,通常用于實(shí)現(xiàn)數(shù)據(jù)驗(yàn)證和封裝。

示例:

class Person:
    def __init__(self, name, age):
        self._name = name
        self._age = age
    @property
    def age(self):
        return self._age
    @age.setter
    def age(self, value):
        if value < 0:
            raise ValueError("年齡不能為負(fù)數(shù)")
        self._age = value
person = Person("Alice", 30)
print(person.age)  # 輸出結(jié)果: 30
person.age = 35
print(person.age)  # 輸出結(jié)果: 35
# person.age = -1  # 拋出 ValueError: 年齡不能為負(fù)數(shù)

解釋:

@property 裝飾器將 age 方法轉(zhuǎn)換為只讀屬性。

@age.setter 裝飾器允許設(shè)置 age 屬性,并進(jìn)行數(shù)據(jù)驗(yàn)證。

11. 類方法和靜態(tài)方法(Class Methods and Static Methods)

類方法和靜態(tài)方法是類中的特殊方法,用于處理類級別的操作。

示例:

class MyClass:
    count = 0
    def __init__(self, name):
        self.name = name
        MyClass.count += 1
    @classmethod
    def get_count(cls):
        return cls.count
    @staticmethod
    def info():
        print("這是一個靜態(tài)方法")
obj1 = MyClass("Obj1")
obj2 = MyClass("Obj2")
print(MyClass.get_count())  # 輸出結(jié)果: 2
MyClass.info()  # 輸出結(jié)果: 這是一個靜態(tài)方法

解釋:

get_count 是一個類方法,可以通過類或?qū)嵗{(diào)用。

info 是一個靜態(tài)方法,與類的狀態(tài)無關(guān),可以通過類調(diào)用。

12. 描述符(Descriptors)

描述符是一種協(xié)議類,用于管理屬性的訪問。描述符協(xié)議包括 __get__、__set__ 和 __delete__ 方法。

示例:

class Descriptor:
    def __get__(self, instance, owner):
        print("獲取屬性")
        return instance._value
    def __set__(self, instance, value):
        print("設(shè)置屬性")
        instance._value = value
    def __delete__(self, instance):
        print("刪除屬性")
        del instance._value
class MyClass:
    value = Descriptor()
    def __init__(self, value):
        self.value = value
obj = MyClass(10)
print(obj.value)  # 輸出結(jié)果: 獲取屬性\n10
obj.value = 20  # 輸出結(jié)果: 設(shè)置屬性
del obj.value  # 輸出結(jié)果: 刪除屬性

解釋:

Descriptor 類實(shí)現(xiàn)了描述符協(xié)議。

MyClass 類中的 value 屬性是一個描述符。

通過 obj.value 訪問、設(shè)置和刪除屬性時,會調(diào)用描述符的相應(yīng)方法。

13. 元類(Metaclasses)

元類是類的類,用于創(chuàng)建和控制類的行為。

示例:

class Meta(type):
    def __new__(cls, name, bases, dct):
        print(f"Creating class {name}")
        return super().__new__(cls, name, bases, dct)
class MyClass(metaclass=Meta):
    pass
obj = MyClass()

解釋:

Meta 是一個元類,重寫了 __new__ 方法。

MyClass 使用 Meta 作為元類,當(dāng)創(chuàng)建 MyClass 時,會調(diào)用 Meta 的 __new__ 方法。

14. 遞歸(Recursion)

遞歸是一種函數(shù)調(diào)用自身的編程技術(shù),通常用于解決分治問題。

示例:

def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n - 1)
print(factorial(5))  # 輸出結(jié)果: 120

解釋:

factorial 函數(shù)是一個遞歸函數(shù),計(jì)算階乘。

基本情況是 n == 0,返回 1。

遞歸情況是 n > 0,返回 n * factorial(n - 1)。

15. 動態(tài)導(dǎo)入(Dynamic Import)

動態(tài)導(dǎo)入允許在運(yùn)行時根據(jù)需要導(dǎo)入模塊。

示例:

module_name = "math"
module = __import__(module_name)
print(module.sqrt(16))  # 輸出結(jié)果: 4.0

解釋:

__import__ 函數(shù)用于動態(tài)導(dǎo)入模塊。

module 是導(dǎo)入的模塊對象,可以通過 module.sqrt 調(diào)用模塊中的函數(shù)。

總結(jié)

以上是 Python 基礎(chǔ)中較難理解的 15 個知識點(diǎn)的詳細(xì)講解和示例。通過這些示例,你可以更好地理解和應(yīng)用這些概念,提高你的編程技能。

責(zé)任編輯:武曉燕 來源: 測試開發(fā)學(xué)習(xí)交流
相關(guān)推薦

2025-02-05 08:29:45

2022-10-10 23:14:40

JavaScrip對象屬性

2023-07-14 15:10:17

PythonAsyncIO庫

2023-10-07 08:21:35

PyQtPython

2010-12-14 09:30:12

2021-04-19 08:35:44

PythonPython語言Python基礎(chǔ)

2024-05-17 13:08:46

Python代碼

2024-05-16 13:40:23

Python編程

2020-05-25 15:56:59

Python函數(shù)開發(fā)

2024-08-06 16:04:03

2013-10-22 15:48:35

2019-03-29 14:10:35

無監(jiān)督學(xué)習(xí)機(jī)器學(xué)習(xí)人工智能

2011-03-16 11:17:56

IptablesICMP

2020-03-02 00:32:08

Python列表for循環(huán)

2024-05-20 10:00:00

代碼Python編程

2024-10-28 21:11:52

2022-03-30 08:37:32

Python函數(shù)編程自定義函數(shù)

2020-05-20 13:45:52

Linuxtouch命令

2011-03-16 11:12:06

Iptables

2015-03-25 10:36:57

lsLinux
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號