defmy_decorator(func):defwrapper():print("Something is happening before the function is called.")
func()print("Something is happening after the function is called.")return wrapper
@my_decoratordefsay_hello():print("Hello!")
say_hello()
Something is happening before the function is called.
Hello!
Something is happening after the function is called.
类装饰器 使用类来实现装饰器。
classDecorator:def__init__(self, func):
self.func = func
def__call__(self):print("Something is happening before the function is called.")
self.func()print("Something is happening after the function is called.")@Decoratordefsay_hello():print("Hello!")
say_hello()
Something is happening before the function is called.
Hello!
Something is happening after the function is called.
生成器函数 创建迭代器,逐个返回值。
defmy_generator():for i inrange(3):yield i
for value in my_generator():print(value)
0
1
2
异步生成器 异步生成值。
import asyncio
import nest_asyncio
nest_asyncio.apply()asyncdefmy_gen():for i inrange(3):yield i
await asyncio.sleep(1)asyncdefmain():asyncfor value in my_gen():print(value)
asyncio.run(main())
0
1
2
元类 控制类的创建行为。
classMeta(type):def__new__(cls, name, bases, dct):print(f'Creating class {name}')returnsuper().__new__(cls, name, bases, dct)classMyClass(metaclass=Meta):pass
Creating class MyClass
数据类 简化类的定义。
from dataclasses import dataclass
@dataclassclassPerson:
name:str
age:int
p = Person(name='Alice', age=30)print(p)
Person(name='Alice', age=30)
NamedTuple 创建不可变的命名元组。
from collections import namedtuple
Point = namedtuple('Point',['x','y'])
p = Point(1,2)print(p)
classMyIterator:def__init__(self, data):
self.data = data
self.index =0def__iter__(self):return self
def__next__(self):if self.index <len(self.data):
result = self.data[self.index]
self.index +=1return result
else:raise StopIteration
my_iter = MyIterator([1,2,3])for value in my_iter:print(value)
1
2
3
上下文管理器 使用 contextlib简化上下文管理。
from contextlib import contextmanager
@contextmanagerdefmy_context():print("Entering")yieldprint("Exiting")with my_context():print("Inside")
Entering
Inside
Exiting
函数缓存 缓存函数结果以提高性能。
from functools import lru_cache
@lru_cache(maxsize=32)deffib(n):if n <2:return n
return fib(n-1)+ fib(n-2)print([fib(n)for n inrange(10)])
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
多线程 使用线程并发执行任务。
import threading
defprint_numbers():for i inrange(5):print(i)
thread = threading.Thread(target=print_numbers)
thread.start()
thread.join()
0
1
2
3
4
多进程 使用进程并发执行任务。
from multiprocessing import Process
defprint_numbers():for i inrange(5):print(i)
process = Process(target=print_numbers)
process.start()
process.join()
0
1
2
3
4
队列 使用队列在线程或进程间传递数据。
from queue import Queue
q = Queue()for i inrange(5):
q.put(i)whilenot q.empty():print(q.get())