过一遍Python基础---Day5

目录

  • 文章声明⭐⭐⭐
  • 让我们开始今天的学习吧!
    • 迭代器
    • 生成器
    • 错误和异常
      • 异常处理


文章声明⭐⭐⭐

  1. 该文章为我(有编程语言基础,非编程小白)的 Python自学笔记
  2. 知识来源为 Python官方文档 / 菜鸟教程 ,归纳为自己的语言与理解记录于此
  3. 不出意外的话,我大抵会 持续更新
  4. 想要了解前端开发(技术栈大致有:Vue2/3、微信小程序、uniapp、HarmonyOS、NodeJS、Typescript)与Python的小伙伴,可以关注我!谢谢大家!

让我们开始今天的学习吧!

迭代器

以下为借鉴菜鸟教程的介绍与定义加以自己的理解:

  • 迭代器是一个可以记住遍历位置的对象

  • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束,迭代器只能往前不会后退

  • 迭代器有两个基本的方法: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

生成器

以下为借鉴菜鸟教程的介绍与定义加以自己的理解:

  • 在 Python 中,使用了 yield 的函数被称为生成器(generator)
  • yield 是一个关键字,用于定义生成器函数,生成器函数是一种特殊的函数,可以在迭代过程中逐步产生值,而不是一次性返回所有结果,类似于一个一个取东西的感觉
  • 跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器
  • 当在生成器函数中使用 yield 语句时,函数的执行将会暂停,并将 yield 后面的表达式作为当前迭代的值返回
  • 然后,每次调用生成器的 next() 方法或使用 for 循环进行迭代时,函数会从上次暂停的地方继续执行,直到再次遇到 yield 语句。这样,生成器函数可以逐步产生值,而不需要一次性计算并返回所有结果
  • 调用一个生成器函数,返回的是一个迭代器对象
>>> 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: 出错啦!

你可能感兴趣的:(关于Python,python,开发语言)