day13 迭代器和模块

目录

迭代器

什么是迭代器

属性

类型名:iter

容器型数据类型

无法通过print查看迭代器内所有元素,无法通过len获取元素个数。

使用迭代器内元素时需要将其从迭代器内取出,取元素时仅能从上往下按顺序取出,并且取出的元素无法放回迭代器。

创建迭代器

iter(序列)

i1 = iter('abc')
print(i1)
# print(len(i1))  # object of type 'str_iterator' has no len()迭代器无法查看长度

迭代器的查操作

不管以什么样的方式获取到了迭代器中元素,那被获取到的元素一定会从迭代器里消失。

获取单个元素

next(迭代器)
i2 = iter([10,20,30])
print(next(i2))  # 10
print(next(i2))  # 20
print(next(i2))  # 30
# print(next(i2))  # 报错: StopIteration 迭代器中数据已被取出交给列表,迭代器为空,操作会报错。
遍历
i1 = iter('abc')
for x in i1:
    print(f'x:{x}')  # x:a x:b x:c
迭代器转换成序列
i3 = iter('hello')
result = list(i3)
print(result)  # ['h', 'e', 'l', 'l', 'o']

生成器

什么是生成器

容器型数据类型

具备创建多个数据的能力,不是保存多个数据的能力。

无法通过print查看生成器内所有元素,无法进行len操作。

生成器获取数据的方式和迭代器一样。

创建生成器

生成器的本质是保存产生数据的算法,而不是保存数据本身。

def 函数名():

yield

代码段

return

创建生成器就是调用带有yield关键字的函数。

若被调用的函数的函数体中有yield,调用函数的时候不会执行函数体,也不会获取函数返回值,而是得到一个生成器对象。

函数调用表达式的值就是生成器

创建生成器对应函数

生成器创建数据的个数和数据的值,由在执行生成器对应的函数体的时候会遇到几次yield,每次遇到yield的时候对应的数据来决定。

每当遇到yield后,yield后面的值就是对应的元素

def func2():
    yield 100
    yield 200
    yield 300

gen2 = func2()
print(next(gen2))  # 100
print(next(gen2))  # 200
print(next(gen2))  # 300
# print(next(gen2))  # 报错:StopIteration 生完了,没数据了

生成器产生数据的原理

同理迭代器,在创建时不会执行函数体,当获取生成器元素时才执行函数体。

执行函数体

从开始位置执行,到yield位置后停下并将yield后面的数据作为获取到的数据。

def func4():
    print('=======1=======')
    yield 10
    print('=======2=======')
    yield 20
    print('=======3=======')
    yield 30

gen4 = func4()
print(next(gen4))  # =======1======= 10
print(next(gen4))  # =======2======= 20
print(next(gen4))  # =======3======= 30
# print(next(gen4))  # 报错

模块

属性

Python中的一个py文件就是一个模块。

A模块中使用B模块内容

前提

B模块(被使用模块)的模块名必须符合变量名要求。

使用原则

先导入才能使用。

要使用的B模块内容(被使用的模块内容)必须为全局变量

导入模块

方式1

import 模块名

导入指定模块,导入后可以通过’模块名.xx’使用模块名中的所有全局变量。

import test1

print(test1.a)
print(test1.func1())

方式2

from 模块名 import 变量1,变量2

导入指定模块中的指定变量,导入后可以直接使用所有指定变量。

from test1 import a, func1
print(a)
print(func1())

*方式3

from 模块名 import *

导入指定模块中所有变量。

*作为通配符,相当于选中所有变量。

from test1 import *
print(a)  # 100
print(func1())  # None

方式4

import 模块名 as 新模块名

导入模块时对模块重命名,通过’新模块名.xxx’来使用模块中所有全局变量。

import numpy as np
import test1 as t1
print(t1.a)  # 100
print(t1.func1())  # None

重命名导入的变量

from 模块名 import 变量1 as 新变量1, 变量2 as 新变量2

导入原理

不管以什么样的方式导入了模块,或者模块中的内容。系统都会在导入模块的时候进入对应的模块,将模块中的代码全部执行一边。

原理存在的问题

可能存在导入模块的时候执行一些完全没有必要执行的代码。

解决对策

在被导入的模块中添加指定的if语句(if_ _ name _ _ == ‘_ _ main _ _’),将不需要被别的模块执行的代码放入到这个if语句中。

if __name__ == '__main__':
    # 这个语句中的代码不会被别的模块执行
    pass

属性

包就是**_ _ init _ _.py**文件的文件夹;用来管理py文件,对py文件按照特定方式进行分类。

使用方法

方法1

import 包名

导入指定的包(必须是包,文件夹无意义)。

导入后可以通过’包名.xxx’使用**_ _ init _ _.py**文件中所有内容。

import timeManager

timeManager.create_file()
print(timeManager.m)

方法2

import 包名.模块名

导入指定包中的指定模块(文件夹也能用)。

# 直接导入包中模块.然后重命名
import timeManager.operateFill as file

timeManager.operateFill.open_file()
file.open_file()

方法3

from 包名 import 模块名1,模块名2,…

方法4

from 包名.模块名 import 变量1,变量2,…

异常捕获

异常

异常就是错误。

执行程序的过程中,如果出现异常,会中断程序的执行(提前结束程序)

print('********')
print('++++++++')
print('abc'[4])  # 报错,结束程序执行
print('')

异常捕获

让程序再出现异常的时候,不崩溃可以接着往后执行。

:因为使用者使用不当导致程序出现异常,又希望出现异常程序可以继续执行才使用异常捕获。

执行过程

​ 先执行代码段1,如果出现异常直接马上执行代码段2;如果没有出现异常,就不执行代码段2

结构

1:捕获所有异常

try:

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

except:

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

try:
    x = int(input('请输入高考分数: '))
    if x <= 300:
        print('可以打职业或者搞说唱')

except:
    print('输入分数的格式有误')

2:捕获指定异常

try:

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

except 异常类型:

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

try:
    x = int(input('请输入高考分数: '))
    if x <= 300:
        print('可以打职业或者搞说唱')

except TypeError:
    print('输入分数的格式有误')

3:同时捕获多种指定异常

try:

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

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

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

try:
    x = int(input('请输入高考分数: '))
    if x <= 300:
        print('可以打职业或者搞说唱')

except (TypeError, ValueError, EnvironmentError):
    print('输入分数的格式有误')

4:同时捕获多种指定异常,做不同处理

try:

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

except 异常类型1:

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

except 异常类型2:

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

except 异常类型3:

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

try:
    x = int(input('请输入高考分数: '))
    if x <= 300:
        print('可以打职业或者搞说唱')

except TypeError:
    print('输入分数的格式有误')
except ValueError:
    print('输入格式有误')
except EnvironmentError:
    print('格式有误')



**4**:同时捕获多种指定异常,做不同处理

try:

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

except 异常类型1:

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

except 异常类型2:

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

except 异常类型3:

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

```python
try:
    x = int(input('请输入高考分数: '))
    if x <= 300:
        print('可以打职业或者搞说唱')

except TypeError:
    print('输入分数的格式有误')
except ValueError:
    print('输入格式有误')
except EnvironmentError:
    print('格式有误')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值