重制版 day 13 迭代器和模块

day 13 迭代器和模块

迭代器

迭代器是容器型数据类型

无法查看一个迭代器中的所有元素,也无法通过len获取元素个数

如果想要使用迭代器中元素,必须将元素从迭代器中取出,从上往下按顺序取出,取出的数据无法放回迭代器

创建迭代器

1)用iter将其他序列转换成迭代器

2)创建生成器

i1=iter('123')
print(i1)
i2=iter([1,2,3,4,5])
print(i2)

迭代器的查操作

被获取到的元素一定会从迭代器中消失

1)获取单个元素:next(迭代器)

当迭代器中的元素都被取出之后,再进行取出,报错

2)遍历

for i in 迭代器:
    print(f'i:{i}')

3)迭代器转换成序列

i3=iter('hello')
result=list(i3)
print(result) # ['h', 'e', 'l', 'l', 'o']

生成器

生成器是容器型数据类型(具备创建多个数据的能力,而不是保存数据的能力)

打印生成器无法查看所有元素,不支持len操作查看元素个数

生成器获取数据的方式和迭代器一样:next(),遍历

创建生成器

生成器保存的是产生数据的算法

调用带有yield关键字的函数,就可以得到一个生成器

生成器创建数据的个数和数据的值与执行函数体中遇到的yield的次数和yield后面的值有关

def func2():
    yield 100
    yield 200
    yield 300
gen2=func2()  # 3个yield,生成器的数据分布是100,200,300
print(next(gen2))  # 100
print(next(gen2))  # 200
print(next(gen2))  # 300

def func3(subject):
    for i in range(1,100):
        yield f'{subject}{i:0>3}'  # 出现99次yield yield后面的值为生成器的元素
gen3=func3('python')
for i in gen3:
    print(f'i:{i}')

生成器产生数据的原理

调用函数创建生成器的时候不会立刻执行函数体,获取生成器中的元素才会执行函数体

每次再执行函数体的时候从开始位置开始,执行到yield就停止,并将yield后面的数据作为获取到的元素,获取下一次生成器的元素,从yield后面开始

模块

模块:python中的一个py文件就是一个模块

被使用的模块的模块名(py文件的文件名)必须符合变量名的要求

使用钱必须先导入,被导入的模块使用的内容只能是模块中的全局变量

导入模块的方法

import 模块名-导入指定模块,通过模块名.变量名的方式使用模块中的全局变量

from 模块名 import 变量1,变量2,...–导入指定模块中的指定变量,导入后直接使用指定变量

from 模块名 import * --导入指定模块中的所有变量,导入后直接使用变量

拓展:* 号在导入模块的时候,默认为所有模块

import 模块名 as 新模块名–导入模块的时候对模块进行重命名操作,导入后使用新模块名.变量名进行使用变量

from 模块名 import 变量1 as 新变量名1,变量2 as 新变量名2–导入模块的时候对变量进行重命名操作,导入后之间使用新的变量名进行使用

重命名操作用as

导入模块的原理:

导入模块的时候,系统会全部执行导入模块中的全部内容

存在的问题:可以会在导入模块的时候,执行一些没有必要执行的操作

导入模块的时候选择性执行代码:

在被导入的模块中加入一个if语句

if __name__=='__main__',将不需要执行的其他内容放里面

包就是包含__init__.py文件的文件夹,包可以看作一个文件夹,模块放在文件夹中,其中有一个模块叫做__init__.py的模块

作用:管理py文件,对py文件按照特定的方式进行分类

使用包中的内容

import 包名–必须是包的名字, 文件夹无意义.导入后使用包名.模块名使用__init__.py模块中的变量

import 包名.模块名–直接导入包中的模块.使用包名.模块名.变量名使用,可以进行重命名操作

from 包名 import 模块名1,模块名2,...-直接导入包中的模块名,直接使用模块名.变量名

from 包名.模块名 import 变量1,变量2,...直接导入包中的模块中的变量,直接使用变量名

包中还有包,包名用.隔开

异常捕获

异常就是错误,如果出现异常,会中断程序的执行(让程序提前结束,非正常结束)

exit() -退出,正常结束

异常捕获-当程序出现异常的时候,不会崩溃,不会闪退,还可以接着往后执行

结构1-捕获所有异常

try:

​ 代码段1(需要捕获异常的代码段)

except:

​ 代码段2(捕获到异常之后需要执行的代码段)

结构2-捕获指定类型的异常,只有捕获的指定的异常类型才会执行立刻马上执行代码段2, 其他类型错误会正常报错

try:

​ 代码段1

except 异常类型:

​ 代码段2

结构3–同时捕获多种异常

try:

​ 代码段1

except(异常类型1,异常类型2,…):

​ 代码段2

结构4-捕获到异常后的操作不一样

try:

​ 代码段1

except 异常类型1:

​ 代码段11

except 异常类型2:

​ 代码段22

try:
    print('abc'[1])
    print('abc'[4]) # 出现异常,后面的代码不执行,立刻跳转except代码
    print('abc'[2])
except:
    print('捕获异常')
print('程序结束')
'''
运行结果:
b
捕获异常
程序结束
'''
try:
    age=int(input('请输入年龄:'))
    if age>=18:   # 判断条件写在try 里面, 输入正确才会执行判断
        print('成年')
    else:
        print('未成年')
except:
    print('年龄输入错误!')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值