1、迭代(Iteration)
for … in … 遍历
2、列表生成式
>>>print([x*x for x in range(1,11)])
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>> print([m+n for m in "asd" for n in "zxc"])
['az', 'ax', 'ac', 'sz', 'sx', 'sc', 'dz', 'dx', 'dc']
if … else … 用法
>>> print([x for x in range(1,11) if x%2==0])
[2, 4, 6, 8, 10]
>>> print([x for x in range(1,11) if x%2==0 else -x]
SyntaxError: invalid syntax
>>> print([x if x%2==0 else -x for x in range(1,11)])
[-1, 2, -3, 4, -5, 6, -7, 8, -9, 10]
>>> print([x if x%2==0 for x in range(1,11)])
SyntaxError: invalid syntax
观察上方代码会发现,for前的if后面必须加else,for后的if不能加else。因为在列表生成式中for前的部分是一个表达式,需要给出一个明确的值,而for后的if只是一个过滤条件,所以不能加else。
3、生成器(generator)
定义生成器:
将列表生成式的[] 换成()即变成一个生成器,使用next调用。
>>> g=(x for x in range(6))
>>>> print(g)
<generator object <genexpr> at 0x000001F9D18E2660>
>>> next(g)
0
>>> next(g)
1
>>> next(g)
2
>>> for i in g:
print(i)
3
4
5
next取出元素后就将该元素删除了,所以for循环只输出了3,4,5。通过上面的代码可以看出next很鸡肋,及其不方便,所以通常来说我们都用for循环遍历生成器。
定义生成器函数:
函数中包含yield
return与yield的区别在于,程序运行过程中遇到return就返回值,程序终止,而运行过程中遇到yield后返回,再次调用时从yield后继续执行。
>>> def odd():
print('step 1')
yield 1
print('step 2')
yield(3)
print('step 3')
yield(5)
>>> o=odd()
>>> next(o)
step 1
1
>>> next(o)
step 2
3
>>> next(o)
step 3
5
>>> next(o)
Traceback (most recent call last):
File "<pyshell#50>", line 1, in <module>
next(o)
StopIteration
try:
a=testGen()
print(next(a))
print(next(a))
print(next(a))
print(next(a)) # 函数里已经没有 会出现异常
print(next(a))
except StopIteration as si: # 怎么知道会报什么异常 异常的基类 Exception
print(si) # 打印了return over
注意:在使用next时要注意后面括号里是函数,还是函数的调用(个人理解函数是test(),而函数的调用是a=test())
括号里是函数的情况,每次都是运行第一个yield前的内容,都是一样的:
括号里是函数的调用的情况,十分正确:
3、可迭代对象(Iterable)
第一类:list,dist,tuple,str,set等集合数据类型
第二类:生成器函数、生成器
这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
可以使用isinstance()判断一个对象是否是Iterable对象:
>>>isinstance((x for x in range(2)),Iterable)
True
NameError: name ‘Iterable’ is not defined 报错解决方案入下:
from collections import Iterable
4、迭代器(Iterator)
可以被next不断调用返回下一个值的对象被称为迭代器。
生成器是迭代器,但list,tuple等是可迭代对象,却不是迭代器。可以把迭代器看为一个源源不断的数据流,起初并不知道长度。
异常处理
except [错误类型] as [自定义名称]:
print([自定义名称])
以上结构是为了可以输出错误类型,如下所示: