附代码 什么是Python的迭代器和生成器?( 四 )


squared_gen = (x*x for x in range(2,5))  print(squared_gen)

附代码 什么是Python的迭代器和生成器?

文章插图
 
但它们仍然很懒 , 因此你需要使用next()方法 。但你现在知道使用for循环可以更好地返回值:
for i in squared_gen:      print(i) 
附代码 什么是Python的迭代器和生成器?

文章插图
 
当你编写简单的代码时 , 生成器表达式非常有用 , 因为它们易读、易理解 。但随着代码变得更复杂 , 它们的功能会迅速变弱 。在这种情况下 , 你发现自己会重新使用生成器函数 , 生成器函数在编写更复杂的函数方面提供了更大的灵活性 。
为什么你应该使用迭代器?一个重要的问题:为什么要先考虑用迭代器?
我在文章开头提到了这一点:之所以使用迭代器 , 是因为它们为我们节省了大量内存 。这是因为迭代器在生成时不会计算项 , 而只会在调用它们时计算 。
如果我创建一个包含1000万个项的列表 , 并创建一个包含相同数量项的生成器 , 则它们内存大小上的差异将令人震惊:
import sys  # list comprehension  mylist = [i for i in range(10000000)]  print('Size of list in memory',sys.getsizeof(mylist))  # generator expression  mygen = (i for i in range(10000000))  print('Size of generator in memory',sys.getsizeof(mygen)
附代码 什么是Python的迭代器和生成器?

文章插图
 
对于相同的数量的项 , 列表和生成器在内存大小上存在巨大差异 。这就是迭代器的美 。
不仅如此 , 你可以使用迭代器逐行读取文件中的文本 , 而不是一次性读取所有内容 。这会再次为你节省大量内存 , 尤其是在文件很大的情况下 。
在这里 , 让我们使用生成器来迭代读取文件 。为此 , 我们可以创建一个简单的生成器表达式来懒惰地打开文件 , 一次读取一行:
file = "Greetings.txt"  # generator expression  lines = (line for line in open(file))  print(lines)  # print lines  print(next(lines))  print(next(lines))  print(next(lines)) 
附代码 什么是Python的迭代器和生成器?

文章插图
 
这很棒 , 但对于数据科学家或分析师而言 , 他们最终都要在Pandas的 dataframe中处理大型数据集 。当你不得不处理庞大的数据集时 , 也许这个数据集有几千行数据点甚至更多 。如果Pandas可以解决这一难题 , 那么数据科学家的生活将变得更加轻松 。
好吧 , 你很幸运 , 因为Pandas的read_csv()(
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html)有处理该问题的chunksize参数 。它使你可以按指定大小的块来加载数据 , 而不是将整个数据加载到内存中 。处理完一个数据块后 , 可以对dataframe对象执行next()方法来加载下一个数据块 。就这么简单!
我将读取Black Friday数据集(
https://datahack.analyticsvidhya.com/contest/black-friday/?utm_source=blog&utm_medium=
python-iterators-and-generators) , 该数据集包含550,068行数据 , 读取时设置每块的大小为10 , 这样做只是为了演示该函数的用法:
import pandas as pd    # pandas dataframe  df = pd.read_csv('./Black Friday.csv', chunksize=10)    # print first chunk of data  next(df)
附代码 什么是Python的迭代器和生成器?

文章插图
 
# print second chunk of data  next(df)  
附代码 什么是Python的迭代器和生成器?

文章插图
 
很有用 , 不是吗?
结语我确信你现在已经习惯于使用迭代器 , 而且一定在考虑把所有函数转换为生成器!你开始喜欢Python编程的强大之处 。


推荐阅读