squared_gen = (x*x for x in range(2,5)) print(squared_gen)
文章插图
但它们仍然很懒 , 因此你需要使用next()方法 。但你现在知道使用for循环可以更好地返回值:
for i in squared_gen: print(i)
文章插图
当你编写简单的代码时 , 生成器表达式非常有用 , 因为它们易读、易理解 。但随着代码变得更复杂 , 它们的功能会迅速变弱 。在这种情况下 , 你发现自己会重新使用生成器函数 , 生成器函数在编写更复杂的函数方面提供了更大的灵活性 。
为什么你应该使用迭代器?一个重要的问题:为什么要先考虑用迭代器?
我在文章开头提到了这一点:之所以使用迭代器 , 是因为它们为我们节省了大量内存 。这是因为迭代器在生成时不会计算项 , 而只会在调用它们时计算 。
如果我创建一个包含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)
文章插图
对于相同的数量的项 , 列表和生成器在内存大小上存在巨大差异 。这就是迭代器的美 。
不仅如此 , 你可以使用迭代器逐行读取文件中的文本 , 而不是一次性读取所有内容 。这会再次为你节省大量内存 , 尤其是在文件很大的情况下 。
在这里 , 让我们使用生成器来迭代读取文件 。为此 , 我们可以创建一个简单的生成器表达式来懒惰地打开文件 , 一次读取一行:
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))
文章插图
这很棒 , 但对于数据科学家或分析师而言 , 他们最终都要在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)
文章插图
# print second chunk of data next(df)
文章插图
很有用 , 不是吗?
结语我确信你现在已经习惯于使用迭代器 , 而且一定在考虑把所有函数转换为生成器!你开始喜欢Python编程的强大之处 。
推荐阅读
- 单株古树茶是什么,8种普洱古树纯料茶
- 2021双十一活动什么时候开始?
- 三大平原中面积最大的是什么?
- 世界十大最昂贵名画是什么?
- 纯元皇后为什么叫菀菀?
- 什么星座最疼摩羯座?
- 《大王饶命》的吕小鱼结局是什么?
- 淘宝上架用什么软件 淘宝自动上下架最好的软件
- 道家养生与中医养生,养生是什么
- 春季爬山的好处 要注意些什么