过一遍Python基础---Day5

目录


文章声明⭐⭐⭐

  1. 该文章为我(有编程语言基础,非编程小白)的 Python自学笔记
  2. 知识来源为 Python官方文档 / 菜鸟教程 ,归纳为自己的语言与理解记录于此
  3. 不出意外的话,我大抵会 持续更新
  4. 想要了解前端开发(技术栈大致有: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: 出错啦!
相关推荐
一点媛艺41 分钟前
Kotlin函数由易到难
开发语言·python·kotlin
姑苏风1 小时前
《Kotlin实战》-附录
android·开发语言·kotlin
奋斗的小花生2 小时前
c++ 多态性
开发语言·c++
魔道不误砍柴功2 小时前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
闲晨2 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
_.Switch2 小时前
高级Python自动化运维:容器安全与网络策略的深度解析
运维·网络·python·安全·自动化·devops
老猿讲编程2 小时前
一个例子来说明Ada语言的实时性支持
开发语言·ada
Chrikk3 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*3 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue3 小时前
go语言连续监控事件并回调处理
开发语言·后端·golang