Python迭代器、模块、包

本文详细介绍了Python编程中的迭代器、生成器、模块、包以及异常捕获的概念和使用方法。迭代器用于按需逐个访问元素,不可通过len获取元素数量;生成器则在运行时动态生成数据,节省内存。模块是可复用的代码单元,通过import导入;包是包含__init__.py文件的文件夹,用于组织模块。异常捕获则允许程序在遇到错误时继续执行,避免程序崩溃。文章提供了丰富的示例代码进行说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 迭代器

  1. 什么是迭代器
    迭代器是容器型数据类型。
    打印迭代器无法获取迭代器中所有元素,迭代器无法通过len获取元素个数。
    如果想要使用迭代器中的元素,必须将元素将迭代器取出,在取的时候只能从上到下取,取一个少一个。
  2. 什么是迭代器
    1)用iter将其他序列转换成迭代器
    2)创建生成器
i1 = iter('abc')
i2 = iter([12, 34])
print(i1) # <str_iterator object at 0x10ed7ffd0>
print(i2) # <list_iterator object at 0x10ed7ff10>
  1. 迭代器的查操作
    不管以什么样的方式获取到了迭代器的元素,那被获取到的元素一定会从迭代器。
    1)获取单个元素:next(迭代器)
i1 = iter('abc')
print(next(i1)) # a
print(next(i1)) # b

2)遍历

i2 = iter([10, 20, 30, 40])
for i in i2:
    print(f'{i}')# 10 20 30 40

3)迭代器转换成序列

i3 = iter('hello')
result = list(i3)
print(result) # ['h', 'e', 'l', 'l', 'o']
print(next(i3)) # 报错 没有元素

2. 生成器

  1. 什么是生成器
    生成器是容器型数据类型,具备创建多个数据的能力,而不是保存多个数据的能力。
    打印生成器无法查看所有的元素,生成器也不支持len操作。
    如果需要使用生成器中的数据,必须将数据取出来,取一个少一个。
  2. 创建生成器
    生成器保存的不是数据本身,而是产生数据的算法。
    创建生成器:调用带有yield关键字的函数,就可以得到一个生成器。
def func1():
    yield
    print('===')
    print('+++')
    return 100
# 只有被调用的函数的函数体中有yield,不会执行函数体,,不会获取函数返回值,只会得到一个生成器
result = func1()
print(result) # <generator object func1 at 0x10d4c7a50>
# 没有yield时 #  === +++ 100
  1. 定义生成器对应的函数
    生成器创建数据的个数和数据的值,由在执行生成器对应的函数的函数体的时候会遇到几次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
def func3(subject):
    for i in range(1,100):
        yield f'{subject}{i:0>3}'

gen3=func3('python')
print(next(gen3))
for i in gen3:
    print(f'{i}') # python001-python099
  1. 生成器产生数据的原理
    调用函数创建生成器的是不会执行函数体,获取生成器中的元素的时候才会执行函数体。
    每次在执行函数体的时候从开始位置开始,执行到yield就停下来,并且将yield后面的数据作为获取到的元素。
def func4():
    print('=======1=======')
    yield 10
    print('=======2=======')
    yield 20
    print('=======3=======')
    yield 30


gen4 = func4()
print(next(gen4)) #=======1======= 10
print('----') # ----
print(next(gen4)) # =======2======= 20
print('----') # ----
print(next(gen4))  # =======3======= 30

3. 模块

被使用的模块的模块名必须符合变量名的要求。
使用原则:先导入才能使用(能被别的模块使用的内容只能说全局变量)

  1. 导入模块
    导入方式1
    import 模块名->
    导入制定模块,导入后可以通过‘模块名.xxx’的方式使用这个模块中所有的全局变量
    案例1 :
import text1
print(text1.a)
print(text1.name)
text1.func1()

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

from text1 import a, name, func1

print(a)
print(name)
func1()

导入方式3
from 模块名 import * ->
导入指定模块中所有指定的变量。

from text1 import *
print(a)
print(name)
func1()

导入方式4
import 模块名 as 新模块名 通过新’模块名.xxx’的方式只用模块中的全局变量

import text1 as t1
print(t1.a)
print(t1.name)
t1.func1()
  1. 导入模块的原理
    不管以什么样式的方式导入了模块,或者模块中的内容。系统都会在导入模块的时候进入对应的模块,将模块中的代码全部执行。
    原理存在的问题:可能存在在导入模块的时候执行一些完全没有必要执行的代码
    导入模块的时候选择性执行代码:
    在被导入的模块中添加指定的if语句(if name == ‘main’),将不需要被别的模块执行的代码放入到这个if语句中。
    download文件的内容:
def download_film(name):
    print(f'=={name}开始下载:')
    print('检查网络')
    print('链接服务器')
    print('传输数据')
    print('保存数据')
    print(f'{name}下载结束=====\n')


print('if语句外面')


if __name__ == '__main__':
    print('if语句里面')
    for x in range(10):
        download_film(f'电影{x}')
from download import download_film
download_film('肖生克的救赎')
if __name__ == '__main__':
    # 这个if语句中的代码不会被别的模块执行
    pass
# if语句外面
==肖生克的救赎开始下载:
检查网络
链接服务器
传输数据
保存数据
肖生克的救赎下载结束=====

4. 包

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

  1. 怎么使用包中的内容
    init.py文件里的内容:
def remove_file():
    print('删除文件')
m = 11
def create_file():
    print('创建文件')

1)import 包名 -> 必须是包,文件夹无意义,导入后,通过’包名.xxx’的方式使用__init__.py文件的内容。

import fileManager

fileManager.create_file()
print(fileManager.m)

2)import 包名.模块名 ->
a).operateFile.py文件下的内容:

def open_file():
    print('打开文件')
def close_file():
    print('关闭文件')

直接导入包中的模块:

import fileManager.operateFile

fileManager.operateFile.open_file() # 打开文件
fileManager.operateFile.close_file() # 关闭文件

b). text2.py中的内容

x = 1000

def func2():
    print('test2中函数')

直接导入包中的模块:

import files.test2

print(files.test2.x) # 1000
files.test2.func2() # test2中函数

3)from 包名3 import 模块1,模块2,…
operateFile.py文件下的内容:

def open_file():
    print('打开文件')

直接导入包中指定多个模块

from fileManager import operateFile, operateJsonFile as json
operateFile.open_file() # 打开文件

4)from 包名.模块名 import 变量1,变量2,…
a)导入指定包名中指定模块中的指定内容

from files.test2 import x, func2
print(x) # 1000
func2() # test2中函数

b)image.py文件下的内容

def load_image():
    print('加载图片')
from files.images.image import load_image
load_image() # 加载图片

5. 异常捕获

执行程序的过程中,如果出现异常,会中断程序的执行
exit() —> 让程序正常退出
2. 异常捕获
让程序出现异常时候不崩溃,还可以接着往后执行。
结构1 捕获所有类型:

try:
代码段1(需要捕获异常的代码段)
except:
代码段2 (捕获到异常需要执行的代码段)

结构2:

try:
代码段1(需要捕获异常的代码段)
except 异常类型:
代码段2 (捕获到异常需要执行的代码段)

结构3:

try:
代码段1(需要捕获异常的代码段)
except (异常类型1,异常类型2):
代码段2 (捕获到异常需要执行的代码段)

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

try:
    print('abc'[4])
    print('====')
except:
    print('捕获到异常') # 捕获到异常
print('程序结束')# 程序结束

案例:

try:
    age=int(input('输入年龄:'))
    if age >=18:
        print('成年')
    else:
        print('未成年')
except:
    print('有误')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值