浅拷?: 拷?的是对象的引?,如果原对象改变,相应的拷?对象也会发?改变。
深拷?: 拷?对象中的每个元素,拷?对象和原有对象不在有关系,两个是独?的对象。
浅拷?(copy):拷??对象,不会拷?对象的内部的?对象。
深拷?(deepcopy): copy 模块的 deepcopy ?法,完全拷?了?对象及其?对象。
装饰器(Decorator)是?种结构型设计模式,它可以动态地给?个对象添加额外的职责,同时?不改变其原有的接?和实现。通俗地说,就是通过组合的?式,为对象添加新的?为或特性。
import time
def time_it(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"函数 {func.__name__} 执?时间为:{end_time - start_time} 秒")
return result
return wrapper
@time_it
def my_function():
time.sleep(2)
print("Hello, World!")
my_function()
我们定义了?个装饰器函数time_it,它接受?个函数作为参数,并返回?个新的函数 wrapper。wrapper函数可以记录函数执?前后的时间,并输出执?时间信息。在my_function函数前?加上@time_it装饰器,表示对my_function函数应?time_it装饰器。 当调用my_function函数时,实际上会调?被time_it装饰过的wrapper函数,从?记录函数的执?时间。
装饰器是要把原来的函数装饰成新的函数,并且返回这个函数本身的?阶函数。
Python中的迭代器是一个可以记住遍历的位置的对象,它实现了两个方法:__iter__()
和 __next__()
。__iter__()
方法返回迭代器对象本身,__next__()
方法返回容器中的下一个值。当没有更多的元素时,__next__()
方法会抛出 StopIteration
异常。
迭代器常?于遍历序列、集合、字典等容器类型数据。它的优点是可以惰性计算,只有在需要时才会计算,避免了?次性加载所有数据的开销,同时也可以节省内存空间。
例?:
my_list = [1, 2, 3, 4, 5]
my_iterator = iter(my_list)
while True:
try:
item = next(my_iterator)
print(item)
except StopIteration:
break
# 我们通过 iter() 函数将列表 my_list 转化为?个迭代器对象 my_iterator
在Python中,?成器(Generator)是?种特殊的迭代器,它使??成器函数来?成序列中的元素,?不是在内存中?次性?成所有元素。
??成器函数是使?yield关键字定义的函数,每次调??成器函数时,它会返回?个迭代器对象,调?next()?法时,它会从上次暂停的位置继续执?,直到遇到下?个yield语句,然后返回?个值,并再次暂停。?
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
fib = fibonacci()
for i in range(10):
print(next(fib))
多线程中的多个线程共享同一个进程的内存空间,因此它们可以访问相同的变量和数据结构。这意味着线程之间的数据共享和通信比较容易,但也可能导致竞争条件和线程安全问题。相反,多进程中的每个进程有自己的独立内存空间,进程间的数据共享需要借助于进程间通信(IPC)机制,如管道、队列或共享内存等。创建和管理线程的开销通常小于进程,因为进程间的独立性使得它们需要更多的资源来维护。然而,由于线程之间共享内存,同步和协调线程的操作可能比在进程之间进行通信更复杂。
*args代表位置参数,它会接收任意多个参数并把这些参数作为元组传递给函数。**kwargs代表的关键字参数,允许你使?没有事先定义的参数名。位置参数?定要放在关键字参数的前?。
==是python标准操作符中的?较操作符,?来?较判断两个对象的value(值)是否相等(布尔计算);
is
:用于判断两个变量是否引用自相同的对象,即它们在内存中的地址是否相同。当使用?is
?进行比较时,只有当两个变量指向同一个内存地址时,结果才为?True
。