python可迭代、迭代器、生成器、装饰器

目录

一、可迭代类型和迭代器

二、生成器

三、装饰器


一、可迭代类型和迭代器

Pyhton中的可迭代类型是指那些可以返回一个迭代器的对象。例如:列表、元组、字符串、字典、集合、生成器和文件对象等。

import random
import time
from collections.abc import *


# 可迭代和迭代器
class MyDatas:
    def __init__(self, n):
        self.datas = [i for i in range(1, n + 1)]
        self.current_index = 0

    def __iter__(self):
        return self

    def __next__(self):

        if self.current_index >= len(self.datas):
            raise StopIteration
        else:
            current = self.datas[self.current_index]
            self.current_index += 1
            return current


md = MyDatas(5)
print(isinstance(md, Iterable), isinstance(md, Iterator), isinstance(md, Generator))

print(next(md))
print(next(md))
print(next(md))
print(next(md))
print(next(md))
# 索引越界,抛出异常
try:
    print(next(md))
except StopIteration as e:
    print("迭代结束", e)

这是一个关于可迭代和迭代器的案例,首先是定义了一个class类,类中的初始函数中定义了列表推导式,魔法函数__iter__和__next__则说明了它是一个迭代器,通过对实例化的md进行isinstance判断,我们可以知道它是可迭代类型的。

迭代器的好处是既可以通过索引来拿到想要的数据,也可以通过next()来逐个获取迭代器内的数据。但是如果超出最大索引,程序会报错。

二、生成器

python中常见的生成器可以是生成器函数,也可以是元组推导式。

下方是一个元组推导式类型的生成器:

t0 = (i for i in range(1, 1000000))
print(t0)
print(isinstance(t0, Iterable), isinstance(t0, Iterator))
print(isinstance(t0, Generator))

生成器是可迭代类型,是迭代器,是生成器,它的优点是占用空间小,缺点是不能通过索引取到想要的值,只能逐个获取。

下方是一个函数类型的生成器:

def my_fun():
    yield 2
    yield 5
    yield 10
    return 200


datas = my_fun()
for data in datas:
    print(data)

每当函数执行到yield语句时,它会返回一个迭代器对象,该对象指向下一个yield语句的值,可以通过遍历迭代器来获取其中的值。

三、装饰器

提到装饰器就要提到闭包的三个概念:一是外部函数嵌套内部函数,二是外部函数返回内部函数的函数名,三是内部函数可以访问外部函数的局部变量。

下方是一个计算排序的时间开销的装饰器:

def time_cost(f):
    def calc():
        start = time.time()
        f()
        print(f"函数{f.__name__}的时间消耗为:{time.time() - start}")

    return calc


datas = [random.randint(0, 10000) for i in range(10000)]
datas2 = datas.copy()


@time_cost
def my_sort1():
    datas.sort()
    print(datas)


@time_cost
def my_sort2():
    datas3 = sorted(datas2)
    print(datas3)


# # 这里的my_sort1和my_sort2是返回的内部函数的函数名calc
# my_sort1 = time_cost(my_sort1)
# my_sort2 = time_cost(my_sort2)
# # 执行my_sort1和my_sort2就是执行calc
# my_sort1()
# my_sort2()

# 在函数前面使用@语法就可以省略上面的繁琐步骤,这就是装饰器
my_sort1()
my_sort2()

装饰器就是在不改变原函数内容的情况下给函数增加新的功能,上方代码通过装饰器来计算sort和sorted的时间开销,比较两个排序方式的效率。

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中的迭代器生成器装饰器都是非常重要的编程概念,下面分别介绍一下: 1. 迭代器 Python中的迭代器是一种可以遍历集合中元素的对象,可以使用for循环遍历集合中的元素。迭代器实现了两个方法:__iter__()和__next__()。__iter__()方法返回迭代器对象自身,__next__()方法返回集合中的下一个元素。 下面是一个简单的使用迭代器遍历列表的示例: ``` my_list = [1, 2, 3] my_iterator = iter(my_list) for i in my_iterator: print(i) ``` 2. 生成器 生成器是一种特殊的函数,可以在执行过程中多次返回值,而不是只返回一次。生成器使用yield语句返回值,可以暂停函数的执行,并在需要时继续执行。 下面是一个简单的生成器示例: ``` def my_generator(): yield 1 yield 2 yield 3 for i in my_generator(): print(i) ``` 3. 装饰器 装饰器是一种可以修改函数或类的行为的函数,可以在不修改原始代码的情况下添加额外的功能。装饰器本质上是一个可以接受函数或类作为参数的函数,可以在不修改原始函数或类的情况下修改其行为。 下面是一个简单的装饰器示例: ``` def my_decorator(func): def wrapper(): print("Before the function is called.") func() print("After the function is called.") return wrapper @my_decorator def my_function(): print("Inside the function.") my_function() ``` 在上面的代码中,我们定义了一个装饰器函数my_decorator,它接受一个函数作为参数,并返回一个新的函数wrapper。这个新函数在调用原始函数之前和之后打印一些文本。我们使用@符号将装饰器应用到my_function函数上,这样my_function函数的行为就被修改了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值