Python基础学习06
ppt看完了8,看到9
列表生成式
简而言之,用来创建list的生成式
举个栗子,不使用列表生成式时
E.g
>>>list(range(1,11))
>>>L=[]
>>>for x in range(1,10)
L.append(x*x)
>>>L
使用列表生成式
>>>[x*x for x in range(1,11)]
>>>[x*x for x in range(1,11)if x%2==0]
>>>[m+n for m in 'ABC' for n in 'XYZ']
一般最多两层循环,三层以上较少
感觉列表生成式就是
[表达式+循环语句(多个)+判断语句]
E.g
>>>d = {'x':'A','y':'B','z':'C'}
>>>[k + '=' + v for k,v in d.items()]
>>>['y=B','x=A','z=C']
>>>L=['Hello','World','IBM']
>>>[s.lower() for s in L] 全部字符串变成小写
>>>['hello','world','ibm']
生成器(generator)
非创建一个完整的list,保留创建list元素的算法,再根据需要进行计算。
一边循环,一边计算。
E.g
>>>L=[x*x for x in range(10)] 比对
>>>L
>>>g=(x*x for x in range(10)) ()
>>>g 生成一个地址
打印所需要的元素(next()函数)
>>>next(g)
0
>>>next(g)
1
···
>>>next(g) 打印完全部全部元素后,报错
更方便的打印元素
>>>g=(x*x for x in range(10))
>>>for n in g:
print(n) 打印全部元素,不报错,也没有调用next()
next()和循环打印不要重复使用,打印出的元素,不会再重复(重新)打印了。
以函数作为生成器
举例
普通的斐波拉契数列函数
def fib(max):
n,a,b=0,0,1
while n<max:
print(b)
a,b=b,a+b
n=n+1
return 'done'
变成生成器
def fib(max):
n,a,b=0,0,1
while n<max:
yield b
a,b=b,a+b
n=n+1
return 'done'
函数定义中包含yield,非普通函数,就是一个生成器
>>>f=fib(3)
>>>f 得到一个地址?(生成器)
两种方法得到返回值,
1、next()
2、for循环(显然更加常用)
>>>for n in fib(3): 循环遇到yield中断,下一次从yield中断地方开始
print(n)
如同前面的列表生成式改成生成器,for循环 得不到错误结果 不会报错
得不到 return 的返回值结果,以yield 结束/开始 的
简单举例:
g = fib(6)
>>>while True:
try:
x=next(g)
print(x)
except StopIteration as e:
print(e.value)
break
如此可打印 return 的返回值
迭代器(Iterator)
可直接用于 for 循环的数据类型
1、集合数据类型
list、tuple、dict、set、str
2、生成器
生成器、带yield的生成器函数
以上称为可迭代对象 Iterable
判断是否 可迭代对象
E.g
>>>from collections import Iterable
>>>isinstance((x for x in range(10))),Iterable)
判断是否 迭代器
E.g
>>>from collections import Iterator
>>>isinstance((x for x in range(10))),Iterator)
迭代器 包括 生成器
可迭代对象(1)
可以通过 iter() 函数转化为迭代器
E.g
>>>isinstance(iter([]),Iterator)
以下仅做了解
Python for 循环本质调用next()函数实现
(上文,迭代出来的值不会重复(重新)迭代出来)
for x in [1,2,3,4]
pass
等价于 it=iter([1,2,3,4])
while True:
try:
x=next(it)
except StopIteration:
break