列表生成式、生成器、三元表达式、

可直接作用于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
posted @ 2021-06-17 15:28  qxll  阅读(67)  评论(0)    收藏  举报