Python学习:高级特性1
在Python的奇妙世界里,高级特性就像是那些隐藏在角落里的神秘力量,等待着勇敢的程序员去发掘。装饰器、生成器和迭代器,这些听起来就像是古老魔法书中的咒语,但它们其实是Python中强大的编程工具。让我们一起揭开这些高级特性的神秘面纱,看看它们如何让我们的代码变得更加强大和灵活。
1. 装饰器
装饰器在Python中是一种神奇的存在,它可以让你在不修改原有函数代码的情况下,给函数添加新的功能。这就像是给函数穿上了一件神奇的外衣,让它拥有了超能力。
基本装饰器:
装饰器本质上是一个函数,它接受一个函数作为参数并返回一个新的函数。
def my_decorator(func):
def wrapper():
print("Something is happening before the function is called.")
func()
print("Something is happening after the function is called.")
return wrapper
@my_decorator
def say_hello():
print("Hello!")
say_hello()
在这个例子中,my_decorator
是一个装饰器,它打印一条消息,然后调用原始函数,再打印另一条消息。say_hello
函数被my_decorator
装饰,所以当我们调用say_hello()
时,实际上是在调用wrapper()
函数。
带参数的装饰器:
有时候,你可能想要创建一个可以接受参数的装饰器。
def my_decorator_with_args(arg):
def decorator(func):
def wrapper():
print(f"Something is happening before the function is called with arg {arg}.")
func()
print("Something is happening after the function is called.")
return wrapper
return decorator
@my_decorator_with_args("test")
def say_hello():
print("Hello!")
say_hello()
在这个例子中,my_decorator_with_args
是一个接受参数的装饰器,它返回一个装饰器,这个装饰器返回一个函数。
实例:创建一个计时装饰器
import time
def timer(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"{func.__name__} took {end_time - start_time} seconds to run.")
return result
return wrapper
@timer
def waste_some_time(seconds):
time.sleep(seconds)
waste_some_time(2)
在这个例子中,timer
装饰器测量并打印函数执行所需的时间。
2. 生成器
生成器是一种特殊的迭代器,它允许你惰性地生成值,这意味着你不需要一次性计算所有的值,而是可以一次生成一个值。这就像是有一个魔法盒子,每次你请求时,它就会变出一个值。
创建生成器:
你可以使用yield
关键字来创建一个生成器。
def count_up_to(max):
n = 1
while n <= max:
yield n
n += 1
# 使用生成器
for number in count_up_to(5):
print(number)
在这个例子中,count_up_to
是一个生成器,它一次生成一个数字,直到达到最大值。
生成器表达式:
就像列表推导式一样,你也可以使用生成器表达式来创建生成器。
gen = (x * x for x in range(3))
for value in gen:
print(value)
实例:创建一个斐波那契数列生成器
def fibonacci(max):
a, b = 0, 1
while a <= max:
yield a
a, b = b, a + b
# 使用生成器
for number in fibonacci(10):
print(number)
在这个例子中,fibonacci
是一个生成器,它生成斐波那契数列,直到达到最大值。
3. 迭代器
迭代器是一个可以记住遍历的位置的对象。迭代器从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。迭代器有两个基本的方法:__iter__()
和__next__()
。
创建迭代器:
你可以定义一个类,实现__iter__()
和__next__()
方法,来创建一个迭代器。
class CountUp:
def __init__(self, max):
self.max = max
self.num = 1
def __iter__(self):
return self
def __next__(self):
if self.num > self.max:
raise StopIteration
else:
num = self.num
self.num += 1
return num
# 使用迭代器
count_up = CountUp(5)
for number in count_up:
print(number)
在这个例子中,CountUp
是一个迭代器,它一次生成一个数字,直到达到最大值。
实例:创建一个反向迭代器
class Reverse:
def __init__(self, data):
self.data = data
self.index = len(data)
def __iter__(self):
return self
def __next__(self):
if self.index == 0:
raise StopIteration
else:
index = self.index
self.index -= 1
return self.data[index - 1]
# 使用迭代器
reversed_list = Reverse([1, 2, 3, 4, 5])
for item in reversed_list:
print(item)
在这个例子中,Reverse
是一个迭代器,它反向迭代一个列表。
小结
装饰器、生成器和迭代器是Python中的强大工具,它们让我们的代码变得更加灵活和强大。装饰器可以在不修改原有函数的情况下添加新功能,生成器让我们能够惰性地生成值,而迭代器则让我们能够记住遍历的位置。
现在,你已经掌握了Python中这些高级特性的基础。但是,这只是冰山一角。在编程的世界里,还有更多高级的概念等着你去探索。编程就像是一场冒险,而你已经迈出了第一步。祝你在编程的世界里旅途愉快!
标签:__,十一,迭代,python,self,生成器,特性,time,def From: https://blog.csdn.net/weixin_39346529/article/details/142966098