day3-函数(迭代器、生成器)

函数知识点三

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(捕获到异常需要执行的代码段)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值