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

一、可迭代对象(Iterable)

可迭代对象是指可以被for循环遍历的对象,或者具有__iter__()方法的对象。可迭代对象允许你获取其迭代器。常见的可迭代对象包括列表(list)、元组(tuple)、字典(dict)和集合(set)。

from collections.abc import Iterable, Iterator, Generator


i = 100
s = "hello"
l = [1, 2, 3]
t = (1, 2, 3)
d = {"name": "qiku"}
set0 = {1, 2, 3}
print(isinstance(i, Iterable), 
	  isinstance(s, Iterable), 
	  isinstance(l, Iterable), 
	  isinstance(t, Iterable), 
	  isinstance(d, Iterable),
      isinstance(set0, Iterable))
# False True True True True True

二、迭代器(Iterator)

迭代器是一个具有__iter__()__next__()方法的对象。通过__iter__()方法,迭代器返回其自身的引用。__next__()方法用于获取迭代器的下一个元素。当没有更多元素时,__next__()方法将引发StopIteration异常。

自定义迭代器类MyDatas类实现了__iter____next__方法,使其成为一个迭代器。

from collections.abc import Iterable, Iterator,

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 IndexError
        else:
            current = self.datas[self.current_index]
            self.current_index += 1
            return current


md = MyDatas(5)

print(isinstance(md, Iterable), isinstance(md, Iterator))
        #True True

三、生成器(Generator)

生成器是一种特殊的迭代器,它使用yield语句来产生一系列值。生成器在函数中使用yield表达式时创建,每次调用next()时执行到yield表达式,返回一个值,并在下一次调用时从该点继续执行。

生成器的优点:

  • 可迭代大型数据集:即使数据集太大不适合一次性加载到内存中

Python中列表和生成器表达式的内存大小

__sizeof__() 方法返回一个对象所占用的内存量,以字节为单位。

列表的内存占用不仅包括存储列表对象本身的内存,还包括存储列表中每个元素的内存。

生成器对象通常占用较少的内存,因为它们是按需生成值的。

l0 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
print(l0.__sizeof__())  # 200
print(l0[15])  # 16
#
t0 = (i for i in range(1, 1000000000))
print(t0.__sizeof__())  # 184
print(isinstance(t0, Iterable), isinstance(t0, Iterator), isinstance(t0, Generator))   
    #True True True
print(next(t0), next(t0))  #1 2

my_datas函数是一个生成器,使用yield语句产生值。

from collections.abc import Iterable, Iterator, Generator

def my_datas():
	yield 1
	yield 2
	yield 3
	yield 10
	yield 20
	yield 30
	return 100

r = my_datas()

print(type(r))#<class 'generator'>


while True:
	try:
		print(next(r))
	except StopIteration as e:
		print("取完了", e)  # 1  2  3  10  20  30  取完了 100
        break
        



		

四、装饰器(Decorator)

装饰器是一种设计模式,用于修改或增强函数、方法或类的行为,而不需要改变其本身的代码

使用@cost_time语法将cost_time装饰器应用于my_sort1my_sort2函数,以测量它们执行所需的时间。

def cost_time(f):
	def calc():
		start = time.time()
		f()
		print(f"函数{f.__name__}开销:{time.time() - start}")

	return calc


cost_time(lambda: print("醒醒啦"))()

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


@cost_time
def my_sort1():
	datas.sort(reverse=True)
	# print(datas)


@cost_time
def my_sort2():
	datas3 = sorted(datas2, reverse=True)
	# print(datas3)


# my_sort1 = cost_time(my_sort1)
my_sort1()

# my_sort2 = cost_time(my_sort2)
my_sort2()

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值