以下为借鉴菜鸟教程的介绍与定义加以自己的理解:
迭代器是一个可以记住遍历位置的对象
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束,迭代器只能往前不会后退。
迭代器有两个基本的方法:iter() 和 next(), iter() 负责创建迭代器对象, next()负责执行遍历迭代器对象
字符串,列表或元组对象都可用于创建迭代器
简单示例,解释器中代码如下:
>>> list = [1,2,3,4,5]
>>> it = iter(list)
>>> it
<list_iterator object at 0x0000021F0B1AF100>
>>> type(it)
<class 'list_iterator'>
>>> next(it)
1
>>> next(it)
2
>>> next(it)
3
>>> next(it)
4
>>> next(it)
5
>>> next(it)
Traceback (most recent call last):
File "" , line 1, in <module>
StopIteration # 迭代完成了
迭代器对象可以使用常规for语句进行遍历,解释器中代码如下:
>>> list = [1,2,3,4,5]
>>> it = iter(list)
>>> for num in it:
... print(num)
...
1
2
3
4
5
>>> next(it)
Traceback (most recent call last):
File "" , line 1, in <module>
StopIteration # 迭代完成了
自己创建一个迭代器,解释器中代码如下:
>>> class MyIterator:
... def __iter__(self):
... self.num = 1
... return self
... def __next__(self):
... if self.num < 5:
... num1 = self.num
... self.num += 1
... return num1
... else:
... raise StopIteration
...
>>> myIter = MyIterator()
>>> myIter1 = iter(myIter)
>>> for num in myIter1:
... print(num)
...
1
2
3
4
以下为借鉴菜鸟教程的介绍与定义加以自己的理解:
>>> list = [1,2,3,4,5]
>>> def func1(list):
... for num in list:
... yield num
...
>>> print(func1(list))
<generator object func1 at 0x000002B2AB7947C0>
>>> g = func1(list)
>>> print(next(g))
1
>>> print(next(g))
2
>>> print(next(g))
3
>>> print(next(g))
4
>>> print(next(g))
5
>>> print(next(g))
Traceback (most recent call last):
File "" , line 1, in <module>
StopIteration
首先我们来辨别一下:语法错误和异常
语法错误,字面意思就是你的代码不符合语法规范(少缩进了、少冒号了等等),程序解析代码错误,程序看不懂你写的代码,解释器中代码如下:
>>> if 2 > 1 print('ok') # 少了个冒号
File "" , line 1
if 2 > 1 print('ok')
^^^^^
SyntaxError: invalid syntax
异常:运行期检测到的错误被称为异常,大多数的异常都不会被程序处理,都以错误信息的形式展现,解释器中代码如下(摘录了菜鸟教程的例子):
>>> 10 * (1/0) # 0 不能作为除数,触发异常
Traceback (most recent call last):
File "" , line 1, in ?
ZeroDivisionError: division by zero
>>> 4 + spam*3 # spam 未定义,触发异常
Traceback (most recent call last):
File "" , line 1, in ?
NameError: name 'spam' is not defined
>>> '2' + 2 # int 不能与 str 相加,触发异常
Traceback (most recent call last):
File "" , line 1, in <module>
TypeError: can only concatenate str (not "int") to str
try…except
>>> while True:
... try:
... num = int(input("请输入一个数字:"))
... break
... except ValueError:
... print('你输入的不是数字~')
...
请输入一个数字:asda
你输入的不是数字~
请输入一个数字:asda
你输入的不是数字~
请输入一个数字:1 # 运行break
执行流程为(摘录了菜鸟教程):
首先,执行 try 里的语句
如果没有异常发生,忽略 except 子句,try 子句执行后结束
如果在执行 try 子句的过程中发生了异常,那么 try 子句余下的部分将被忽略,如果异常的类型和 except 之后的名称相符,那么对应的 except 子句将被执行。
如果一个异常没有与任何的 except 匹配,那么这个异常将会传递给上层的 try 中
一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常,最多只有一个分支会被执行,解释器中代码如下:
except (RuntimeError, TypeError, NameError):
pass
try…except…else
else为可选的关键字,放在所有except的最后,只有当try语句没有异常的时候才会运行else语句,pycharm中代码如下:
try:
age = int(input("你多少岁啦?"))
print("好的")
except ValueError:
print("你输入的不是数字~")
else:
print("你输入的没有错误~")
----------------
你多少岁啦?asd
你输入的不是数字~
----------------
你多少岁啦?21
好的
你输入的没有错误~
try…except…else…finally
finally和else一样也为可选的关键字,放在所有except和else的后面,不管有没有异常发生都会执行finally语句,pycharm中代码如下:
try:
age = int(input("你多少岁啦?"))
print("好的")
except ValueError:
print("你输入的不是数字~")
else:
print("你输入的没有错误~")
finally:
print("运行结束886")
----------------
你多少岁啦?name
你输入的不是数字~
运行结束886
----------------
你多少岁啦?21
好的
你输入的没有错误~
运行结束886
** raise语句抛出异常**
raise语句可以抛出一个异常,pycharm中代码如下:
age = 21
if age > 18:
raise Exception('我的年龄不可能大于18岁,虽然我已经{}岁了'.format(age))
--------------------
Exception: 我的年龄不可能大于18岁,虽然我已经21岁了
raise 唯一的一个参数指定了要被抛出的异常,它必须是一个异常的实例或者是异常的类(也就是Exception 的子类)
如果你只想知道这是否抛出了一个异常,并不想去处理它,那么一个简单的 raise 语句就可以再次把它抛出,pycharm中代码如下:
try:
raise Exception("出错啦!")
except:
print("管他呢,让它报错呗~")
raise
----------------
管他呢,让它报错呗~
Traceback (most recent call last):
File "main.py", line 2, in <module>
raise Exception("出错啦!")
Exception: 出错啦!