day13 迭代器、生成器、模块、包、异常

本文详细介绍了Python中的迭代器和生成器,包括它们的概念、创建方法(如iter转换和生成器函数)、操作特性(如单步获取元素和遍历),以及生成器的原理。涵盖了模块、包和异常处理的相关知识,帮助读者理解如何高效地使用和管理数据流。
摘要由CSDN通过智能技术生成

4.8 迭代器(iter)

1.什么是迭代器(iter)

迭代器是容器型数据类型(for in 或者 可以转列表 可变但是不支持增删改,有序的也没作用)

特点:a.打印一个迭代器无法查看迭代器中所有的元素;

​ b.迭代器也无法通过len获取元素个数;

​ c.如果想使用这个元素必须将元素从迭代器中取出,而且取出时只能从上往下按顺序,去一个少一个,取出的数据不无法再放回迭代器。

2.创建迭代器

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

2)创建生成器

i1 = iter('abc')
i2 = iter([1,2,3])
print(i1) #迭代器打印都是这样 <str_iterator object at 0x000001A5D5B4BC70>
# print(len(i2)) #报错

3.迭代器的查操作

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

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

print(next(i2)) #1 只能获取当前第一个元素,获取后i2迭代器中就没有1了
print(next(i2)) #2
print(next(i2)) #3
# print(next(i2)) #StopIteration  当前已经取完了就报错!!!

2)遍历

print(next(i1))
for i in i1:
    print(i) #上面取了‘a’,所以这儿打印b c
for i in i2:
    print(i) #因为上面已经取了,所有现在没有元素,不会报错

3)迭代器转换序列

i3 = iter('hello')
result = list(i3)
print(result) #['h', 'e', 'l', 'l', 'o']
# print(next(i3)) #报错 因为上面遍历已经取出迭代器里面所有的元素

4.9 生成器(yield)

1.什么是生成器 - (可以减少内存和CPU资源)

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

特点:打印生成器无法查看所有的元素,生成器也不支持len操作;

如果需要使用生成器中的数据,必须将数据取出来,而且取一个少一个。

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

2.创建生成器

生成器保存的不是数据本身,而是产生数据的算法(函数)

怎么创建生成器:调用带有yield关键字的函数,就可以得到一个生成器。

def func1():
    yield
    print('=====')
    print('-----')
    print('+++++')
    return 100
# 如果被调用的函数的函数体中有yield,调用函数的时候不会执行函数体,也不会获取函数返回值,而是得到一个生成器对象(函数调用表达式的值就是生成器)
result = func1()
print(f'result:{result}') #result:<generator object func1 at 0x000001C86F7745F0># 如果被调用的函数的函数体中有yield,调用函数的时候不会执行函数体,也不会获取函数返回值,而是得到一个生成器对象(函数调用表达式的值就是生成器)
result = func1()
print(f'result:{result}') #result:<generator object func1 at 0x000001C86F7745F0>

3.定义生成器对应的函数 - yield

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

定。

执行函数体会遇到几次yield对应的生成器就可以创建多少个数据。

每次遇到yield,yield后面的值是什么,对应的元素就是什么

def func2():
    yield 100
    yield 200
    yield 300


g2=func2()
print(next(g2)) #100

def func3(subject):
    for i in range(1,100):
        yield f'{subject}{i:0>3}'


g3=func3('python')
print(next(g3))
for i in g3:
    print(f'i:{i}')

4.生成器产生数据的原理

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

每次在执行函数体的时候从开始位置开始,执行到yield就停下来,并且将yield后面的数据作为获取到的元素。

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

五 模块、包、异常值

5.1 模块

1.什么是模块 - python中py文件就是一个模块

2.怎么在一个模块里面使用另外一一个模块的内容

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

使用原则:先导入才能使用(能被别的模块使用的只能是全局变量)

3.导入模块

import 模块名 - 导入指定模块,导入后可以通过’模块名.xxx’的方式使用这个模块中所有的全局变量

from 模块名 import 变量1,变量2,… - 导入指定模块中的指定变量,导入后可以直接使用所有指定的变量

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

import 模块名 as 新模块名 - 导入模块的时候对模块重命名,通过’新模块名.xxx’的方式只用模块中所有的全局变量。

from 模块名 import 变量1 as 新变量1,变量2 as 新变量2,… - 对导入的变量重命名


# =========导入方式1===========
import test1
print(test1.a,test1.name)
test1.func1()

# =========导入方式2===========
from test1 import a,func1 #导入后才能用,但是能用的只能是import
print(a)
func1()

# =========导入方式3===========
from test1 import *
print(a)

# =========导入方式4(对模块重命名)===========
import test1 as te
print(te.a)

# =========导入方式5(对变量重命名)===========
from test1 import a as b,name as name1
print(b,name1)

4.导入模块的原理

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

原理存在的问题:可能存在导入模块的时候执行一些完全没有必要的代码

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

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

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

5.2 包

1.什么是包

包就是包含__init__.py文件的文件夹

包就用来管理py文件,对py文件按照特定的方式进行分类。

2.怎样使用包中的内容

1)import 包名 - 导入指定的包(必须是包,文件夹无意义),导入后可以通过’包名.xxx’的方式使用__init__.py文件中的所有内容。

2)import 包名.模块名 - 导入指定包中的指定模块(文件夹也可以用)

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

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

3.init.py里面有可能需要装的东西···

a.创建快捷键

from file.tese.eee import add_filter #将常用的提前在__init__.py里面打好,外面用的时候有提示

b.封装通用工具 - 将删除文件放在__init__里面作用于所有文件

5.3 异常捕捉

1.异常

异常就是错误;

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

exit() - 程序正常结束
print('======')
exit()
print('------')
print('++++++')

2.异常捕获 - 让程序出现异常的时候不崩溃,还可以接着往后执行

注意:不要滥用异常捕获,如果是因为使用者使用不当导致程序出现异常,又希望在出现异常程序可以继续执行才使用异常捕获。

结构1: - 捕获所有异常

try:

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

except:

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

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

结构2: - 捕获指定异常

try:

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

except 异常类型: #Error

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

结构3: - 同时捕获多个异常(捕获后只有一种结果)

try:

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

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

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

结构4: - 同时捕获多种异常(捕获后有不同结果)

try:

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

except 异常类型2:

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

except 异常类型3:

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

print('======')
try:
    print('abc'[4])  #捕获异常
except:
    print('123') #因出现异常执行该代码
print('------')

print('======')
try:
    print('abc'[12]) #出现异常后面不执行,直接执行except的代码
    print('----')
    print('2222')
except:
    print('123')
print('------')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值