一、生成器
生成器(Generator)是一种用于创建迭代器的简单而强大的工具。生成器函数就是普通函数,只不过使用了yield语句而不是return语句返回结果。生成器函数被调用时不会立即执行函数体,而是返回一个迭代器。每次调用迭代器的next()方法时,生成器函数会从上次执行的地方继续执行,直到遇到一个yield语句,然后把yield后面的表达式的值作为返回值返回,并暂停执行。下次再调用next()方法时,会从yield语句暂停的位置继续执行。
生成器的优点是可以大大节约内存,因为它生成一个值之后就会释放掉这个值所占据的内存,而不是像列表那样将所有值都存在内存中。
示例一:
def simple_generator():
yield 1
yield 2
yield 3
g = simple_generator()
print(next(g)) # 1
print(next(g)) # 2
print(next(g)) # 3
print(next(g)) # StopIteration
示例二:
def fibonacci():
a, b = 0, 1
while True:
yield b
a, b = b, a + b
f = fibonacci()
for i in range(10):
print(next(f)) # 1, 1, 2, 3, 5, 8, 13, 21, 34, 55
二、迭代器
迭代器(Iterator)是一种对象,它可以迭代遍历容器中的元素,且只能往前不会后退。实现一个迭代器可以使用__iter__()和__next__()方法。iter()返回迭代器对象本身,next()返回具体的元素。
示例一:
class MyIterator:
def __init__(self, start, end):
self.num = start
self.end = end
def __iter__(self):
return self
def __next__(self):
if self.num <= self.end:
result = self.num
self.num += 1
return result
else:
raise StopIteration
m = MyIterator(0, 5)
for i in m:
print(i) # 0, 1, 2, 3, 4
示例二:
a = [1, 2, 3]
it = iter(a)
print(next(it)) # 1
print(next(it)) # 2
print(next(it)) # 3
三、闭包
闭包(Closure)是一种函数,它可以访问定义在外部函数作用域内的变量。闭包可以保留变量的值,不管外部变量如何改变,内部函数也可以使用它们。
闭包的关键就在于外部变量的值在内部函数定义时已经保存下来,并一直可以被访问。
示例一:
def outer_func(x):
def inner_func(y):
return x+y
return inner_func
add_5 = outer_func(5)
print(add_5(3)) # 8
add_10 = outer_func(10)
print(add_10(3)) # 13
示例二:
def func():
arr = []
for i in range(3):
def inner_func():
return i
arr.append(inner_func)
return arr
funcs = func()
print(funcs[0]()) # 2
print(funcs[1]()) # 2
print(funcs[2]()) # 2
四、装饰器
装饰器(Decorator)是一种可以在运行时修改函数或类的行为的语法。在Python中,装饰器可以用于修改或包装一个函数或类的功能,而不需要修改它的源代码。
使用装饰器时,需要定义一个装饰器函数,该函数接受一个函数作为参数,并返回一个新函数。
示例一:
def my_decorator(func):
def wrapper():
print("Before the function is called.")
func()
print("After the function is called.")
return wrapper
def say_hello():
print("Hello!")
say_hello = my_decorator(say_hello)
say_hello()
示例二:
def my_decorator(func):
def wrapper(*args, **kwargs):
print("Before the function is called.")
func(*args, **kwargs)
print("After the function is called.")
return wrapper
@my_decorator
def say_hello(name):
print(f"Hello, {name}!")
say_hello("Tom")
以上就是关于Python中生成器、迭代器、闭包、装饰器四个重要概念的详细介绍与应用示例。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解python中的生成器、迭代器、闭包、装饰器 - Python技术站