目录
文章声明⭐⭐⭐
- 该文章为我(有编程语言基础,非编程小白)的 Python自学笔记
- 知识来源为 Python官方文档 / 菜鸟教程 ,归纳为自己的语言与理解记录于此
- 不出意外的话,我大抵会 持续更新
- 想要了解前端开发(技术栈大致有:Vue2/3、微信小程序、uniapp、HarmonyOS、NodeJS、Typescript)与Python的小伙伴,可以关注我!谢谢大家!
让我们开始今天的学习吧!
迭代器
以下为借鉴菜鸟教程的介绍与定义加以自己的理解:
-
迭代器是一个可以记住遍历位置的对象
-
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束,迭代器只能往前不会后退。
-
迭代器有两个基本的方法:iter() 和 next(), iter() 负责创建迭代器对象, next()负责执行遍历迭代器对象
-
字符串,列表或元组对象都可用于创建迭代器
简单示例,解释器中代码如下:
python
>>> 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 "<stdin>", line 1, in <module>
StopIteration # 迭代完成了
迭代器对象可以使用常规for语句进行遍历,解释器中代码如下:
python
>>> 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 "<stdin>", line 1, in <module>
StopIteration # 迭代完成了
自己创建一个迭代器,解释器中代码如下:
python
>>> 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
生成器
以下为借鉴菜鸟教程的介绍与定义加以自己的理解:
- 在 Python 中,使用了 yield 的函数被称为生成器(generator)
- yield 是一个关键字,用于定义生成器函数,生成器函数是一种特殊的函数,可以在迭代过程中逐步产生值,而不是一次性返回所有结果,类似于一个一个取东西的感觉
- 跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器
- 当在生成器函数中使用 yield 语句时,函数的执行将会暂停,并将 yield 后面的表达式作为当前迭代的值返回
- 然后,每次调用生成器的 next() 方法或使用 for 循环进行迭代时,函数会从上次暂停的地方继续执行 ,直到再次遇到 yield 语句。这样,生成器函数可以逐步产生值,而不需要一次性计算并返回所有结果
- 调用一个生成器函数,返回的是一个迭代器对象
python
>>> 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 "<stdin>", line 1, in <module>
StopIteration
错误和异常
首先我们来辨别一下:语法错误和异常
语法错误,字面意思就是你的代码不符合语法规范(少缩进了、少冒号了等等),程序解析代码错误,程序看不懂你写的代码,解释器中代码如下:
python
>>> if 2 > 1 print('ok') # 少了个冒号
File "<stdin>", line 1
if 2 > 1 print('ok')
^^^^^
SyntaxError: invalid syntax
异常:运行期检测到的错误被称为异常,大多数的异常都不会被程序处理 ,都以错误信息的形式展现,解释器中代码如下(摘录了菜鸟教程的例子):
python
>>> 10 * (1/0) # 0 不能作为除数,触发异常
Traceback (most recent call last):
File "<stdin>", line 1, in ?
ZeroDivisionError: division by zero
>>> 4 + spam*3 # spam 未定义,触发异常
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: name 'spam' is not defined
>>> '2' + 2 # int 不能与 str 相加,触发异常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str
异常处理
try...except
python
>>> 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子句,分别来处理不同的特定的异常,最多只有一个分支会被执行,解释器中代码如下:
python
except (RuntimeError, TypeError, NameError):
pass
try...except...else
else为可选的关键字,放在所有except的最后,只有当try语句没有异常的时候才会运行else语句,pycharm中代码如下:
python
try:
age = int(input("你多少岁啦?"))
print("好的")
except ValueError:
print("你输入的不是数字~")
else:
print("你输入的没有错误~")
----------------
你多少岁啦?asd
你输入的不是数字~
----------------
你多少岁啦?21
好的
你输入的没有错误~
try...except...else...finally
finally和else一样也为可选的关键字,放在所有except和else的后面,不管有没有异常发生都会执行finally语句,pycharm中代码如下:
python
try:
age = int(input("你多少岁啦?"))
print("好的")
except ValueError:
print("你输入的不是数字~")
else:
print("你输入的没有错误~")
finally:
print("运行结束886")
----------------
你多少岁啦?name
你输入的不是数字~
运行结束886
----------------
你多少岁啦?21
好的
你输入的没有错误~
运行结束886
** raise语句抛出异常**
raise语句可以抛出一个异常,pycharm中代码如下:
python
age = 21
if age > 18:
raise Exception('我的年龄不可能大于18岁,虽然我已经{}岁了'.format(age))
--------------------
Exception: 我的年龄不可能大于18岁,虽然我已经21岁了
raise 唯一的一个参数指定了要被抛出的异常,它必须是一个异常的实例或者是异常的类(也就是Exception 的子类 )
如果你只想知道这是否抛出了一个异常,并不想去处理它,那么一个简单的 raise 语句就可以再次把它抛出,pycharm中代码如下:
python
try:
raise Exception("出错啦!")
except:
print("管他呢,让它报错呗~")
raise
----------------
管他呢,让它报错呗~
Traceback (most recent call last):
File "main.py", line 2, in <module>
raise Exception("出错啦!")
Exception: 出错啦!