互聯(lián)網(wǎng)網(wǎng)站建設(shè)制作/長(zhǎng)沙百度推廣開戶
1. hasattr ()、getattr ()、setattr () 函數(shù)是如何使用的?
- 要點(diǎn)
這三個(gè)函數(shù)用于對(duì)對(duì)象的屬性進(jìn)行檢查、獲取和設(shè)置操作,是 Python 中進(jìn)行對(duì)象屬性動(dòng)態(tài)操作的重要工具。
-
hasattr()
:用于檢查對(duì)象是否具有指定屬性或方法。 -
getattr()
:用于獲取對(duì)象的屬性或方法,還可設(shè)置默認(rèn)值。 -
setattr()
:用于設(shè)置對(duì)象的屬性值,若屬性不存在則創(chuàng)建。
python
class Book:def __init__(self, title):self.title = title# 創(chuàng)建 Book 類的實(shí)例
my_book = Book("Python Programming")# hasattr() 示例
print(hasattr(my_book, "title")) # 輸出 True,因?yàn)?my_book 有 title 屬性
print(hasattr(my_book, "author")) # 輸出 False,my_book 沒(méi)有 author 屬性# getattr() 示例
print(getattr(my_book, "title")) # 輸出 "Python Programming"
print(getattr(my_book, "author", "Unknown")) # 輸出 "Unknown",因?yàn)?author 屬性不存在,返回默認(rèn)值# setattr() 示例
setattr(my_book, "author", "John Doe")
print(my_book.author) # 輸出 "John Doe",成功設(shè)置 author 屬性
- 示例
這些函數(shù)在動(dòng)態(tài)編程中非常有用,例如在編寫插件系統(tǒng)時(shí),可以根據(jù)配置文件動(dòng)態(tài)檢查和設(shè)置對(duì)象的屬性。
python
# 模擬插件系統(tǒng)
class Plugin:def __init__(self):self.enabled = Falseplugin = Plugin()
config = {"enabled": True}for key, value in config.items():if hasattr(plugin, key):setattr(plugin, key, value)print(plugin.enabled) # 輸出 True,根據(jù)配置動(dòng)態(tài)設(shè)置了屬性
2. 寫出階乘函數(shù)reduce(lambda x,y : x*y,range(1,n+1))的結(jié)果。
- 要點(diǎn)
使用 reduce
函數(shù)結(jié)合 lambda
表達(dá)式可以簡(jiǎn)潔地實(shí)現(xiàn)階乘計(jì)算。reduce
函數(shù)會(huì)對(duì)序列中的元素進(jìn)行累積操作,lambda
表達(dá)式定義了累積的規(guī)則。
python
from functools import reducen = 6
factorial = reduce(lambda x, y: x * y, range(1, n + 1))
print(factorial) # 輸出 720,即 6 的階乘
- 示例
可以添加邊界條件處理,當(dāng) n
為 0 或負(fù)數(shù)時(shí)返回相應(yīng)結(jié)果。
python
from functools import reducedef factorial(n):if n < 0:return Noneif n == 0:return 1return reduce(lambda x, y: x * y, range(1, n + 1))print(factorial(-1)) # 輸出 None
print(factorial(0)) # 輸出 1
print(factorial(5)) # 輸出 120
2. 什么是 lambda 函數(shù)? 有什么好處?
- 要點(diǎn)
lambda
函數(shù)是一種匿名函數(shù),語(yǔ)法簡(jiǎn)潔,通常用于編寫簡(jiǎn)單的、一次性使用的函數(shù)。其好處包括代碼簡(jiǎn)潔、適合臨時(shí)使用和提高代碼可讀性。
python
# 普通函數(shù)定義
def add_numbers(a, b):return a + b# lambda 函數(shù)定義
add = lambda a, b: a + bprint(add(2, 3)) # 輸出 5
- 示例
lambda
函數(shù)常用于高階函數(shù),如 map
、filter
等。
python
numbers = [1, 2, 3, 4, 5]
# 使用 lambda 函數(shù)結(jié)合 map 計(jì)算每個(gè)數(shù)的平方
squared_numbers = list(map(lambda x: x ** 2, numbers))
print(squared_numbers) # 輸出 [1, 4, 9, 16, 25]# 使用 lambda 函數(shù)結(jié)合 filter 篩選出偶數(shù)
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers) # 輸出 [2, 4]
3. 遞歸函數(shù)停止的條件是什么?
- 要點(diǎn)
遞歸函數(shù)是在函數(shù)內(nèi)部調(diào)用自身的函數(shù),必須有停止條件,否則會(huì)導(dǎo)致無(wú)限遞歸和棧溢出錯(cuò)誤。停止條件也稱為遞歸的基準(zhǔn)情況,是遞歸函數(shù)不再調(diào)用自身的情況。
python
def sum_numbers(n):if n == 0: # 停止條件return 0return n + sum_numbers(n - 1)print(sum_numbers(5)) # 輸出 15,計(jì)算 1 到 5 的和
- 示例
遞歸函數(shù)可以用于解決許多問(wèn)題,如斐波那契數(shù)列的計(jì)算。
python
def fibonacci(n):if n <= 1: # 停止條件return nreturn fibonacci(n - 1) + fibonacci(n - 2)print(fibonacci(6)) # 輸出 8,計(jì)算第 6 個(gè)斐波那契數(shù)
4. 如何理解設(shè)計(jì)模式,簡(jiǎn)要說(shuō)明
- 要點(diǎn)
設(shè)計(jì)模式是軟件開發(fā)中針對(duì)反復(fù)出現(xiàn)的問(wèn)題總結(jié)出的通用解決方案,有助于提高軟件的可維護(hù)性、可擴(kuò)展性和可復(fù)用性。常見的設(shè)計(jì)模式包括單例模式、工廠模式、觀察者模式和裝飾器模式等。
????? 1. 單例模式:確保一個(gè)類只有一個(gè)實(shí)例,并提供全局訪問(wèn)點(diǎn)。
python
class SingletonLogger:_instance = Nonedef __new__(cls):if not cls._instance:cls._instance = super().__new__(cls)return cls._instancelogger1 = SingletonLogger()
logger2 = SingletonLogger()
print(logger1 is logger2) # 輸出 True,說(shuō)明是同一個(gè)實(shí)例
??????? 2. 工廠模式:定義創(chuàng)建對(duì)象的接口,讓子類決定實(shí)例化哪個(gè)類。
python
class Dog:def speak(self):return "Woof!"class Cat:def speak(self):return "Meow!"class AnimalFactory:def create_animal(self, animal_type):if animal_type == "dog":return Dog()elif animal_type == "cat":return Cat()factory = AnimalFactory()
dog = factory.create_animal("dog")
print(dog.speak()) # 輸出 "Woof!"
- 示例
設(shè)計(jì)模式在不同的應(yīng)用場(chǎng)景中可以組合使用,以滿足更復(fù)雜的需求。例如,在一個(gè)大型的游戲開發(fā)中,可以結(jié)合工廠模式創(chuàng)建游戲角色,使用單例模式管理游戲的全局狀態(tài)。
5. 請(qǐng)手寫一個(gè)單例
- 要點(diǎn)
單例模式確保一個(gè)類只有一個(gè)實(shí)例,并提供全局訪問(wèn)點(diǎn)??梢酝ㄟ^(guò)多種方式實(shí)現(xiàn),如類屬性、裝飾器等。
?????? 1. 使用類屬性實(shí)現(xiàn)單例
python
class DatabaseConnection:_instance = Nonedef __new__(cls):if not cls._instance:cls._instance = super().__new__(cls)return cls._instanceconn1 = DatabaseConnection()
conn2 = DatabaseConnection()
print(conn1 is conn2) # 輸出 True,說(shuō)明是同一個(gè)實(shí)例
????????? 2. 使用裝飾器實(shí)現(xiàn)單例
python
def singleton(cls):instances = {}def get_instance():if cls not in instances:instances[cls] = cls()return instances[cls]return get_instance@singleton
class Config:passconfig1 = Config()
config2 = Config()
print(config1 is config2) # 輸出 True,說(shuō)明是同一個(gè)實(shí)例
- 示例
在多線程環(huán)境下,單例模式需要考慮線程安全問(wèn)題??梢允褂面i機(jī)制來(lái)確保在多線程環(huán)境下也能正確實(shí)現(xiàn)單例。
python
import threadingclass ThreadSafeSingleton:_instance = None_lock = threading.Lock()def __new__(cls):with cls._lock:if not cls._instance:cls._instance = super().__new__(cls)return cls._instance
6. 單例模式的應(yīng)用場(chǎng)景有那些?
- 要點(diǎn)
單例模式適用于需要確保資源唯一性和一致性的場(chǎng)景,如資源管理、配置管理、日志記錄和 GUI 編程等。
????? 1. 資源管理:數(shù)據(jù)庫(kù)連接池通常使用單例模式,確保系統(tǒng)中只有一個(gè)連接池實(shí)例,避免資源浪費(fèi)和沖突。
python
import sqlite3class DatabaseConnectionPool:_instance = Nonedef __new__(cls):if not cls._instance:cls._instance = super().__new__(cls)cls._instance.conn = sqlite3.connect('example.db')return cls._instancepool1 = DatabaseConnectionPool()
pool2 = DatabaseConnectionPool()
print(pool1.conn is pool2.conn) # 輸出 True,說(shuō)明是同一個(gè)連接
???????? 2. 配置管理:應(yīng)用程序的配置信息通常使用單例模式管理,確保所有模塊使用相同的配置。
python
class AppConfig:_instance = Nonedef __new__(cls):if not cls._instance:cls._instance = super().__new__(cls)cls._instance.config = {'debug': True, 'port': 8080}return cls._instanceconfig1 = AppConfig()
config2 = AppConfig()
print(config1.config is config2.config) # 輸出 True,說(shuō)明是同一個(gè)配置實(shí)例
- 示例
在分布式系統(tǒng)中,單例模式的實(shí)現(xiàn)會(huì)更加復(fù)雜,可能需要借助分布式鎖或共享存儲(chǔ)來(lái)確保全局唯一性。
7. 什么是閉包?
- 要點(diǎn)
閉包是指有權(quán)訪問(wèn)另一個(gè)函數(shù)作用域中變量的函數(shù)。即使該函數(shù)已經(jīng)執(zhí)行完畢,其作用域內(nèi)的變量也不會(huì)被銷毀,而是會(huì)被閉包所引用。
python
def outer_function(x):def inner_function(y):return x + yreturn inner_functionclosure = outer_function(10)
print(closure(5)) # 輸出 15,閉包訪問(wèn)了 outer_function 中的變量 x
- 示例
閉包可以用于實(shí)現(xiàn)數(shù)據(jù)的封裝和隱藏,以及創(chuàng)建可定制的函數(shù)。
python
def multiplier(factor):def multiply(number):return number * factorreturn multiplydouble = multiplier(2)
triple = multiplier(3)print(double(5)) # 輸出 10
print(triple(5)) # 輸出 15
8. 函數(shù)裝飾器有什么作用?
- 要點(diǎn)
函數(shù)裝飾器可以在不修改原函數(shù)代碼的情況下,為函數(shù)添加額外的功能,實(shí)現(xiàn)代碼復(fù)用和功能擴(kuò)展,提高代碼的可讀性和可維護(hù)性。
python
def timer_decorator(func):import timedef wrapper(*args, **kwargs):start_time = time.time()result = func(*args, **kwargs)end_time = time.time()print(f"Function {func.__name__} took {end_time - start_time} seconds to execute.")return resultreturn wrapper@timer_decorator
def slow_function():import timetime.sleep(2)slow_function() # 輸出函數(shù)執(zhí)行時(shí)間
- 示例
裝飾器可以嵌套使用,為函數(shù)添加多個(gè)功能。
python
def uppercase_decorator(func):def wrapper(*args, **kwargs):result = func(*args, **kwargs)return result.upper()return wrapperdef exclamation_decorator(func):def wrapper(*args, **kwargs):result = func(*args, **kwargs)return result + "!"return wrapper@uppercase_decorator
@exclamation_decorator
def greet(name):return f"Hello, {name}"print(greet("Alice")) # 輸出 "HELLO, ALICE!"
9. 生成器,迭代器的區(qū)別?
- 要點(diǎn)
迭代器是實(shí)現(xiàn)了 __iter__()
和 __next__()
方法的對(duì)象,用于遍歷序列;生成器是一種特殊的迭代器,可以通過(guò)生成器函數(shù)(使用 yield
關(guān)鍵字)或生成器表達(dá)式創(chuàng)建,具有惰性求值的特點(diǎn),更節(jié)省內(nèi)存。生成器表達(dá)式在處理大數(shù)據(jù)集時(shí),內(nèi)存使用效率更高,因?yàn)樗嵌栊郧笾档摹?/span>
????? 1. 迭代器
python
my_list = [1, 2, 3]
my_iterator = iter(my_list)
print(next(my_iterator)) # 輸出 1
print(next(my_iterator)) # 輸出 2
print(next(my_iterator)) # 輸出 3
try:print(next(my_iterator))
except StopIteration:print("No more elements")
???????? 2. 生成器
python
def my_generator():yield 1yield 2yield 3gen = my_generator()
print(next(gen)) # 輸出 1
print(next(gen)) # 輸出 2
print(next(gen)) # 輸出 3
try:print(next(gen))
except StopIteration:print("No more elements")
- 示例
生成器表達(dá)式是一種更簡(jiǎn)潔的生成器創(chuàng)建方式,類似于列表推導(dǎo)式。
python
# 生成器表達(dá)式
gen_expr = (x ** 2 for x in range(5))
for num in gen_expr:print(num) # 依次輸出 0, 1, 4, 9, 16# 列表推導(dǎo)式
list_comp = [x ** 2 for x in range(5)]
print(list_comp) # 輸出 [0, 1, 4, 9, 16]
友情提示:本文已經(jīng)整理成文檔,可以到如下鏈接免積分下載閱讀
https://download.csdn.net/download/ylfhpy/90398541