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()
相关推荐
AIAdvocate11 分钟前
Pandas_数据结构详解
数据结构·python·pandas
小言从不摸鱼13 分钟前
【AI大模型】ChatGPT模型原理介绍(下)
人工智能·python·深度学习·机器学习·自然语言处理·chatgpt
C-SDN花园GGbond42 分钟前
【探索数据结构与算法】插入排序:原理、实现与分析(图文详解)
c语言·开发语言·数据结构·排序算法
迷迭所归处2 小时前
C++ —— 关于vector
开发语言·c++·算法
架构文摘JGWZ2 小时前
Java 23 的12 个新特性!!
java·开发语言·学习
FreakStudio2 小时前
全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类
python·嵌入式·面向对象·电子diy
leon6252 小时前
优化算法(一)—遗传算法(Genetic Algorithm)附MATLAB程序
开发语言·算法·matlab
锦亦之22333 小时前
QT+OSG+OSG-earth如何在窗口显示一个地球
开发语言·qt
我是苏苏3 小时前
Web开发:ABP框架2——入门级别的增删改查Demo
java·开发语言
姜太公钓鲸2333 小时前
c++ static(详解)
开发语言·c++