开发者

Python开发之迭代器&生成器的实战案例分享

开发者 https://www.devze.com 2023-04-20 09:19 出处:网络 作者: 不背锅运维
目录迭代器&生成器实战案例迭代器&生成器 在 python 中,迭代器和生成器都是用来遍历数据集合的工具,可以按需逐个生成或返回数据,从而避免一次性加载整个数据集合所带来的性能问题和内存消耗问题。
目录
  • 迭代器&生成器
  • 实战案例

迭代器&生成器

在 python 中,迭代器和生成器都是用来遍历数据集合的工具,可以按需逐个生成或返回数据,从而避免一次性加载整个数据集合所带来的性能问题和内存消耗问题。

具体来说,迭代器是一个包含 iter() 和 next() 方法的对象,它通过 next() 方法依次返回数据集合中的每个元素,直到没有元素时引发 StopIteration 异常。迭代器可以自定义,也可以使用 Python 内置的可迭代对象,如列表、元组、字典、集合等,以及内置的迭代器函数,如 zip()、map()、filter() 等。

而生成器是javascript一种特殊的迭代器,它使用 yield 关键字来定义,可以在需要时生成数据,从而实现按需生成、惰性计算的效果。生成器可以大大简化代码,提高性能和可读性,也可以通过生成器表达式快速创建简单的生成器。

下面分享几个贴近实际运维开发工作中的场景案例。

实战案例

1.假设需要从一个非常大的数据集合中查找满足特定条件的元素,并且只需要找到第一个符合条件的元素即编程客栈可停止查找。如果直接遍历整个数据集合,可能会导致性能问题。这时可以使用迭代器和生成器来解决这个问题。

deffind_first_match(data,condition):
foritemindata:
ifcondition(item):
returnitem
raiseValueEhttp://www.devze.comrror('Nomatchingitemfound')

large_data=[iforiinrange(10000000)]#构造一个大数据集合
match=find_first_match(large_data,lambdax:x>1000)#查找第一个大于1000的元素
print(match)

2.假设要实现一个函数,它接受一个字符串列表,然后返回这些字符串中所有字符的出现次数。可以使用迭代器和生成器来避免遍历整个列表,并减少内存使用量。

defchar_count(words):
counts={}
forwordinwords:
forcharinword:
counts[char]=counts.get(char,0)+1
returncounts

defchar_count_lazy(words):
defchar_gen(words):
forwordinwords:
forcharinword:
yieldchar
counts={}
forcharinchar_gen(words):
counts[char]=counts.jsget(char,0)+1
returncounts

3.需要遍历一个多级嵌套的 jsON 对象,查找其中某个特定的值。假设 JSON 对象很大,因此不能一次性加载到内存中。这时可以使用生成器来逐级遍历 JSON 对象。

deffind_value(json_obj,target_key):
ifisinstance(json_obj,dict):
forkey,valueinjson_obj.items():
ifkey==target_key:
yijavascripteldvalue
else:
yieldfromfind_value(value,target_key)
elifisinstance(json_obj,list):
foriteminjson_obj:
yieldfromfind_value(item,target_key)

json_data={
"name":"tantianran",
"age":30,
"cars":[
{"model":"BMW","year":2000},
{"model":"Tesla","year":2020}
],
"location":{
"address":"123MainSt",
"city":"NewYork",
"state":"NY"
}
}

forvalueinfind_value(json_data,"year"):
print(value)

4.如果需要读取一个非常大的文件,并对其中的每一行进行处理,但是由于文件太大,无法一次性将整个文件读入内存中。这时可以使用生成器来实现逐行读取文件并逐行处理的操作。

defprocess_lines(file_name):
withopen(file_name)asf:
forlineinf:
#对每一行进行处理,这里只是简单地打印出来
print(line.strip())

large_file='data.txt'
process_lines(large_file)

5.假设有一个大型日志文件,其中包含了数千万行日志记录。需要对这个日志文件进行分析,找出所有包含特定关键字的日志记录,并进行统计。如果直接读取整个日志文件到内存中,可能会导致内存不足的问题。这时可以使用迭代器和生成器来解决这个问题。

deflog_file_reader(log_file_path):
withopen(log_file_path)asf:
forlineinf:
yieldline.strip()

deflog_analyzer(log_file_path,keyword):
log_reader=log_file_reader(log_file_path)
count=0
forlineinlog_reader:
ifkeywordinline:
count+=1
returncount

log_file_path='logs.txt'
keyword='error'
error_count=log_analyzer(log_file_path,keyword)
print(f'Thenum开发者_JS开发beroferrorlogsis:{error_count}')

到此这篇关于Python开发之迭代器&生成器的实战案例分享的文章就介绍到这了,更多相关Python迭代器 生成器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

0

精彩评论

暂无评论...
验证码 换一张
取 消