5200人阅读 评论(2)

相关知识点

Python 进阶_迭代器 & 列表解析

生成器

EXAMPLE

In [94]: def fab(max):
...:     n, a, b = 0, 0, 1
...:     while n < max:
...:         yield b
...:         a, b = b, a + b
...:         n = n + 1
...:

In [95]: f = fab(5)

In [96]: f.next()
Out[96]: 1

In [97]: f.next()
Out[97]: 1

In [98]: f.next()
Out[98]: 2

In [99]: f.next()
Out[99]: 3

In [100]: f.next()
Out[100]: 5

In [101]: f.next()
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-101-c3e65e5362fb> in <module>()
----> 1 f.next()

StopIteration:

生成器和迭代器的区别

NOTE：而迭代器是不具有上述的特性的，不适合去处理一些巨大的类序列对象，所以建议优先考虑使用生成器来处理迭代的场景。

生成器的优势

EXAMPLE 2：读取一个大文件

def read_file(fpath):
BLOCK_SIZE = 1024
with open(fpath, 'rb') as f:
while True:
if block:
yield block
else:
return

加强的生成器特性

EXAMPLE 3:

In [5]: def counter(start_at=0):
...:     count = start_at
...:     while True:
...:         val = (yield count)
...:         if val is not None:
...:             count = val
...:         else:
...:             count += 1
...:

In [6]: count = counter(5)

In [7]: type(count)
Out[7]: generator

In [8]: count.next()
Out[8]: 5

In [9]: count.next()
Out[9]: 6

In [10]: count.send(9)           # 返回一个新的值给生成器中的 yield count
Out[10]: 9

In [11]: count.next()
Out[11]: 10

In [12]: count.close()          # 关闭一个生成器

In [13]: count.next()
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-13-3963aa0a181a> in <module>()
----> 1 count.next()

StopIteration:

生成器表达式

• 列表解析
[expr for iter_var in iterable if cond_expr]

• 生成器表达式
(expr for iter_var in iterable if cond_expr)

生成器表达式样例

EXAMPLE 4 : 一个比较通常的方法，通过循环将更长的行赋值给变量 longest

f = open('FILENAME', 'r')
longest = 0
while True:
if not linelen:
break
if linelen > longest:
longest = linelen
f.close()

return longest

f = open('FILENAME', 'r')
longest = 0
f.close()
for line in allLines:
linelen = len(line.strip())
if not linelen:
break
if linelen > longest:
longest = linelen

return longest

f = open('FILENAME', 'r')
longest = 0
allLines = [x.strip() for x in f.readlines()]
f.close()
for line in allLines:
linelen = len(line)
if not linelen:
break
if linelen > longest:
longest = linelen

return longest

f = open('FILENAME', 'r')
allLinesLen = [line(x.strip()) for x in f]
f.close()
return max(allLinesLen)   # 返回列表中最大的数值

f = open('FILENAME', 'r')
allLinesLen = (line(x.strip()) for x in f)   # 这里的 x 相当于 yield x
f.close()
return max(allLinesLen)

f = open('FILENAME', 'r')
longest = max(line(x.strip()) for x in f)
f.close()
return longest

return max(line(x.strip()) for x in open('FILENAME'))

小结

个人资料
等级：
访问量： 111万+
积分： 1万+
排名： 1263
博客专栏
 Redhat 系统架构师之路 文章：5篇 阅读：29909 Openstack组件部署—Mitaka 文章：11篇 阅读：120621 Python 入门 文章：13篇 阅读：100822 Python 进阶 文章：10篇 阅读：16200 用 Flask 来写个轻博客 文章：37篇 阅读：205381 Openstack 实现技术分解 文章：7篇 阅读：18537 VMware 虚拟化应用、磁盘编程 文章：15篇 阅读：14601
最新评论
公众号
Python笔试面试公众号