函数知识点三
1.迭代器
迭代器就是容器型数据类型,不支持增删改。
(打印一个迭代器无法查看这个迭代器的所有元素,也无法通过len获取元素个数)
如果想要使用迭代器中元素,必须将元素从迭代器中取出,而且在取的时候只能从上往下按顺序取,取一个少一个,取出来就无法放回迭代器
1).创建迭代器
方法一:用iter将其他序列转化成迭代器
i1=iter("abc")
i2=iter([10,23,34,56])
方法二:创建生成器
2).查数据
不管以什么样方式获取迭代器中元素,那被获取到的元素一定会从迭代器中消失
1)获取单个元素:next(迭代器)
i1=iter("abc")
print(next(i1))----#a
print(next(i1))----#b
print(next(i1))----#c
print(next(i1))----#为空,会报错
2)遍历
```python
i1=iter("abc")
for x in i1:
print(f'x:{x}')
#结果
x:a
x:b
x:c
```
3).迭代器转化成序列
i3=iter("hello")
result=list(i3)--------[h,e,l,l,o]
(此时i3已经为空)
#要把字符串,单个单个理解也可以转化成迭代器,在转化为列表
2.生成器----(创建多个数据)
生成器是容器型数据类型,具备创建的能力,不是保存。
打印生成器无法查看所有的元素,也不支持len操作
使用生成器的数据,必须将数据取走,取一个就少一个。
生成器获取数据方法与迭代器一样
1).创建生成器(生成数据的算法)
通过调用函数的方法,得到生成器。带有yield关键字的函数
如果被调用的函数中有yield,调用的时候不会执行函数体,也不会获取函数返回值,而是得到一个生成器。
def fun1( ):
print("+++++++++")
yield
return 100 #(整个函数都不会被执行)
2).创建生成器对应的函数
生成器创建数据的个数和数据的值,由在执行生成器对应的函数的函数体会遇到几次yield,每次遇到yield的时候对应的数据来决定。
执行函数体会遇到几次yield对应的生成器就可以创建多少个数据
每次遇到yield,yield后面的值是什么,对应的元素就是什么
def fun2():
yield 100
yield 200
yield 300
gun2=fun2( ) #整个函数实质就是个生成器,不需要理解为一般的函数 ,生成了3个数据
也可以通过循环来确定yield的次数。
def func3(subject):
for x in range(1, 100):
yield f'{subject}{x:0>3}'
gen3 = func3('python')
print(next(gen3))
for x in gen3:
print(f'x:{x}')
3).原理
def fun():
print("---1----")
yield 10
print("---2-----")
yield 20
print("----3----")
yield 30
gun=fun( )
print(next(gun))
print(next(gun))
print(next(gun))
---1----
10 执行一段,就停在结束位置,在接着这个位置往后执行。
---2-----
20
----3----
30
调用函数创建生成器是不会执行函数体,获取生成器中的元素的时候才会执行函数体。
每次在执行函数体的时候从开始位置开始,执行到yield就停下来,并且将yield后面的数据作为获取到的元素
3.模块
1)定义:一个py文件就是一个模块
2)怎么在一个模块中使用另一个模块内容
前提:被使用的模块的模块名(py文件的文件名)必须符合变量名的要求。
使用原则:先导入才能使用(能被别的模块使用的内容只能是全局变量)
3)怎么导入模块:
方法一:导入指定模块
导入后可以通过"模块名.XXX"方法使用
import 模块名
如
import test1
print(test1.a)------a代表test1中的全局变量
方法二:导入指定变量
from 模块名 import 变量1,变量2…
到如指定模块中的指定变量,导入后可以直接使用所有指定的变量
from test1 import a, fun1
print(a)
fun1()
#只能使用导入的变量,没有导入的变量不能使用
导入多个变量:from 模块名 import *--------导入指定模块中所有的变量,导入后直接使用
from test1 import a, fun1
print(a)
fun1()
print(name)
4)对模块重命名
import 模块名 as 新模块名------导入模块的时候对模块重命名,通过"新模块名.XXX"方式用模块中所有的全局变量
import test1 as t1
print(t1.a)
5)对导入模块中的变量重命名
from 模块名 import 变量1 as 新变量1,变量2 as 新变量2…
from test1 import t1 as t1a:
print(t1a.a)
6)导入模块原理
不管以什么样方式导入模块,或者模块中的内容,系统都会在导入模块的时候进入到对应的模块,将模块中的代码全部执行
原理存在问题:在导入模块时,执行一些没有必要执行的代码
导入模块选择性执行代码:
if __name__ == '__main__': (两个下划线)
将不需要被执行的模块执行代码放入这个语句if语句中
4.包
1.定义
包就是包含——init——.py文件的文件夹
封装-----保存
包就是用来管理py文件的,对py文件按照特定的方式进行分类。
2.创建包
工程名—右击----new----package(包)
3.怎么使用包中的内容
1)import 包名 (必须是包)-----导入后可以用通过"包名.XXX"的方式使用——init——.py文件中的内容
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ji4Oba9Z-1659523766871)(E:\BaiduSyncdisk\前锋学习\第三周\day3-迭代器、生成器、包、模块\图5.jpg)]
2)import 包名.模块名-------导入的是指定模块(文件夹也可以使用)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2vCFSMol-1659523766874)(E:\BaiduSyncdisk\前锋学习\第三周\day3-迭代器、生成器、包、模块\图1.jpg)]
import 包名.模块名 as 新模块名
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-njVWnpNZ-1659523766875)(E:\BaiduSyncdisk\前锋学习\第三周\day3-迭代器、生成器、包、模块\图2.jpg)]
3)from 包名 import 模块名---- 在使用时 “模块名.XXX”
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g4J9o8RG-1659523766876)(E:\BaiduSyncdisk\前锋学习\第三周\day3-迭代器、生成器、包、模块\图3.jpg)]
4)from 包名.模块名 import 变量1,变量2
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eviILroK-1659523766878)(E:\BaiduSyncdisk\前锋学习\第三周\day3-迭代器、生成器、包、模块\图4.jpg)]
4设置快捷键
在——init——文件中设置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P4L0NIEY-1659523766879)(E:\BaiduSyncdisk\前锋学习\第三周\day3-迭代器、生成器、包、模块\图6.jpg)]
5封装通用工具
def remove_file():
print("删除文件")
5.异常捕获
1.异常-----错误
执行程序的过程中如果出现异常,会中断程序的执行。
exit( )----让程序正常退出。
2.异常捕获
作用:让程序在出现错误的时候,程序不崩溃,还可以接着执行。
注意:不要滥用,如果是使用者使用不当导致程序出现异常,又希望在出现异常程序可以继续执行才使用异常捕获
结构1:------捕获所有类型异常
try:
代码段1(需要捕获异常的代码段)
except:
代码段2(捕获到异常需要执行的代码段)
执行过程,先执行代码段1,如果出现异常直接马上执行代码段2;如果没有出现异常,就不执行代码段2
图·:
结构2:-----捕获指定异常
try:
代码段1(需要捕获异常的代码段)
except 异常类型
代码段2(捕获到异常需要执行的代码段)
结构3:-----同时捕获多种异常
try:
代码段1(需要捕获异常的代码段)
except (异常类型1,异常类型2。。。。。)
代码段2(捕获到异常需要执行的代码段)
结构4:------同时捕获多种异常
try:
代码段1(需要捕获异常的代码段)
except 异常类型1
代码段11(捕获到异常需要执行的代码段)
except 异常类型2
代码段22(捕获到异常需要执行的代码段)
ept 异常类型
代码段2(捕获到异常需要执行的代码段)
结构3:-----同时捕获多种异常
try:
代码段1(需要捕获异常的代码段)
except (异常类型1,异常类型2。。。。。)
代码段2(捕获到异常需要执行的代码段)
结构4:------同时捕获多种异常
try:
代码段1(需要捕获异常的代码段)
except 异常类型1
代码段11(捕获到异常需要执行的代码段)
except 异常类型2
代码段22(捕获到异常需要执行的代码段)