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()
相关推荐
VBA63375 分钟前
VBA技术资料MF243:利用第三方软件复制PDF数据到EXCEL
开发语言
轩辰~7 分钟前
网络协议入门
linux·服务器·开发语言·网络·arm开发·c++·网络协议
小_太_阳16 分钟前
Scala_【1】概述
开发语言·后端·scala·intellij-idea
向宇it17 分钟前
【从零开始入门unity游戏开发之——unity篇02】unity6基础入门——软件下载安装、Unity Hub配置、安装unity编辑器、许可证管理
开发语言·unity·c#·编辑器·游戏引擎
Kai HVZ1 小时前
python爬虫----爬取视频实战
爬虫·python·音视频
古希腊掌管学习的神1 小时前
[LeetCode-Python版]相向双指针——611. 有效三角形的个数
开发语言·python·leetcode
赵钰老师1 小时前
【R语言遥感技术】“R+遥感”的水环境综合评价方法
开发语言·数据分析·r语言
m0_748244831 小时前
StarRocks 排查单副本表
大数据·数据库·python
就爱学编程1 小时前
重生之我在异世界学编程之C语言小项目:通讯录
c语言·开发语言·数据结构·算法
B站计算机毕业设计超人1 小时前
计算机毕业设计PySpark+Hadoop中国城市交通分析与预测 Python交通预测 Python交通可视化 客流量预测 交通大数据 机器学习 深度学习
大数据·人工智能·爬虫·python·机器学习·课程设计·数据可视化