列表生成式、生成器、三元表达式、
可直接作用于for循环的对象:称为可迭代对象Iterable
1.集合数据类型:list、turple、set、dict、str,不是迭代器,可使用iter()函数变为迭代器
2.生成器:生成器和带yield的生成器函数,都是迭代器,生成器不但可以做用于for循环还可以呗next调用
迭代器:可以被next()调用不断返回下一个值的对象,迭代器表示的是一个数据流
总结
凡是可作用于for循环的对象都是Iterable类型;
凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
Python的for循环本质上就是通过不断调用next()函数实现的
列表生成式
1)range函数
list2=list(range(1,10))
2)两种格式,这里是中括号:
[表达式1 if 条件 else 表达式2 + for循环]
[表达式 + for循环 + if过滤条件]
还可以配合if语句使用:
for循环前面的if是表达式,需要用else,for循环后面if是过滤条件,不能用else
可以嵌套多层for循环,
[x*x for x in range(0,10)]
例子:
1.列出当前目录下所有文件和目录名
[ d for d in os.listdir('.')]
2.展开字典
[ k+'='+v for k,v in dict1.items()]
生成器
生成器保存的是算法,相比list可以节约存储空间,生成器也是可迭代对象,可迭代对象都可以用for循环来取值
生成器的创建方法:
方式一:使用()
(x*x for x in range(0,10))
结果:
<generator object <genexpr> at 0x7f0b072e6140>
生成器使用时,需如下执行:
g = (x*x for x in range(0,10))
for n in g:
print n
方式二:函数定义中包含yield关键字,那么这个函数就不是一个普通函数而是一个生成器
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
return 'done'
注意通过for循环取生成器的值,是获取不到return的返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中
while True:
try:
x = next(g)
print('g:', x)
except StopIteration as e:
print('Generator return value:', e.value)
break
生成式和生成器的区别:
前者直接返回了表达式的结果列表, 而后者是一个对象,该对象包含了对表达式结果的计算引用, 通过循环可以直接输出。
而生成器并不是立即把结果写入内存, 而是保存的一种计算方式, 通过不断的获取, 可以获取到相应的位置的值,所以占用的内存仅仅是对计算对象的保存。
当表达式的结果数量较少的时候, 使用列表生成式还好, 一旦数量级过大, 那么列表生成式就会占用很大的内存。
杨辉三角例子
def triangles():
N=[1] #初始化为[1],杨辉三角的每一行为一个list
while True:
yield N #yield 实现记录功能,没有下一个next将跳出循环,
S=N[:] #将list N赋给S,通过S计算每一行
S.append(0) #将list添加0,作为最后一个元素,长度增加1
N=[S[i-1]+S[i] for i in range(len(S))] #通过S来计算得出N
本文来自博客园,作者:qxll,转载请注明原文链接:https://www.cnblogs.com/qxll/p/14893649.html

浙公网安备 33010602011771号