迭代器、生成器、模块、包、异常捕获

本文详细介绍了Python中的迭代器、生成器的概念和使用,包括它们的特点、创建方法及操作。同时,阐述了Python模块的导入方式和包的管理。此外,还讨论了异常捕获的重要性及其基本结构,帮助读者深入理解Python的错误处理机制。
摘要由CSDN通过智能技术生成

迭代是 python 中访问集合元素的一种非常强大的一种方式。迭代器是一个可以记住遍历位置的对象。在Python中,一边循环一边计算的机制,称为生成器: generator。Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。包就是包含__init__.py 文件的文件夹,用来管理 py 文件,对 py 文件按照特定的方式进行分类。异常捕获是让程序在出现异常的时候,不崩溃,还可以接着往后执行

迭代器

迭代器是容器型数据类型,迭代器可以使用容器型通用操作

1、 迭代器的特点

a. 打印迭代器的时候无法查看迭代器中的所有元素,也无法通过len()获取元素的个数
b. 如果要使用迭代器中的元素必须将该元素取出,取元素的时候只能从上往下按顺序取

2、 创建迭代器

a. 用 iter 将其他序列转换成迭代器
b. 创建生成器 生成器 创建多个数据

3、 查操作

a. 获取单个元素:next(迭代器) 迭代器中为空时去元素会报错
b. 遍历
c. 迭代器转换成序列

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

>>> i1 = iter('abcdefg')
>>> i1
<str_iterator object at 0x0000028D5C5DA4C0>

>>> i2 = iter([1, 2, 3, 4])
>>> i2
<list_iterator object at 0x0000028D5C156CD0>

>>> next(i1)
'a'
>>> next(i1)			# 此时迭代器中没有 a
'b'
>>> next(i2)
1

>>> for i in i2:        # 此时迭代器中没有1
...     print(i)
...                
2
3
4

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

>>> next(i3)		    
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
# 报错    因为将 i3 转换成了列表,已经将元素全部取出,再从 i3 中取元素就会报错

生成器

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

1、特点(和迭代器一样)

a. 打印生成器的时候无法查看迭代器中的所有元素,也不支持 len() 操作
b. 如果要使用生成器中的元素必须将该元素取出,元素取一个少一个,取出来的元素无法再放回迭代器
c. 生成器获取数据的方式和迭代器一样

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

a. 调用 yield 关键字的函数,就可以得到一个生成器
b. 如果调用的函数中有 yield 关键字,调用函数的时候不会执行函数体,也不会获取函数返回值,而是得到一个生成器对象(函数调用表达式的值就是生成器)

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

a. 执行函数体会遇到几次 yield ,对应的生成器就可以创建多少个数据
b. 每次遇到 yield,yield 后面的值是什么,对应的元素就是什么

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

a. 调用函数创建生成器的时候不会执行函数体,获取生成器中的元素的时候才会执行函数体
b. 每次在执行函数体的时候从开始位置开始,执行到 yield 就停下来,并且将 yield 后面的数据作为获取到的元素

>>> def func1():
...     print('=====')
...     print('+++++')
...     if False:
...         yield
...     return 100
...
>>> result = func1()
>>> f'return:{result}'
return:<generator object func1 at 0x0000028D5C5BCD60>

>>> def func2():
...     yield 100
...     yield 200
...     yield 300
...
>>> gen2 = func2()
>>> next(gen2)
100
>>> next(gen2)
200

>>> def func3(subject):
...     for x in range(1, 20):
...         yield f'{subject}{x:0>3}'
...
>>> gen3 = func3('python')
>>> next(gen3)
'python001'
>>> for x in gen3:
...     print(f'x:{x}')
...
x:python002
x:python003
x:python004
x:python005
x:python006
x:python007
x:python008
x:python009
x:python010
x:python011
x:python012
x:python013
x:python014
x:python015
x:python016
x:python017
x:python018
x:python019

def func4():
    print('====1====')
    yield 10			# 第二次就跳过,执行下行代码
    print('====2====')
    yield 20
    print('====3====')
    yield 30


gen4 = func4()
print(next(gen4))
print('----')
print(next(gen4))

# 运行结果为:
====1====
10
----
====2====			 	# 从 print('====2====') 开始执行
20

模块

前提

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

使用原则

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

导入方式一

import 模块名

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

导入方式二

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

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

导入方式三

from 模块名 import *

导入指定模块中所有变量

导入方式四

import 模块名 as 新模块名

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

导入方式五

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

对导入的变量重命名
导入模块的原理

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


存在的问题:

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

解决方法:

导入模块的时候选择性执行代码,在被导入的模块中添加指定的 if 语句:

if __name__ == '__main__'

将不需要被别的模块执行的代码放入到这个 if 语句中

test1.py文件有如下内容:

a = 100

def func1():
    print('test中')

name = 'test'

test2.py

# ==========导入方式1==========
import test1

print(test1.a)
print(test.name)
test1.func1()

# ==========导入方式2==========
from test1 import a, func1

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

# 运行结果为:
100
test中

NameError: name 'test1' is not defined   # 导入变量后
不能直接使用模块


# ==========导入方式3==========
from 模块名 import * 
print(a)
print(name)
func1()


# ==========导入方式4==========
import test1 as t1

test1 = 22
print(t1.a, t1.name)
t1.func1()

# ==========导入方式5==========
from test1 import a as num_a, name as str_1

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

创建包

方法一

新建 Dictionary
在这里插入图片描述
手动添加__init__.py文件

方法二

新建 Python Package
在这里插入图片描述

导入包

a. 导入包

import 包名

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

import fileMamager

b.导入包中的模块

import 包名.模块名

导入包中的指定模块(文件夹也可以用),一般会重命名。例如:

import fileManager.operateFile as file

c. 导入包中多个模块

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

例如:

from fileManager import operateFile, operateJson

d. 导入包中指定模块的指定内容

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

例如:

from fileManager.iperateFile import f1, f2, f3

包的应用

  1. 创建快捷键
from fileManager.images.operateImage import add_filter
  1. 封装通用工具
def remove_file():
print( '删除文件')

异常捕获

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

exit()	-	让程序正常退出

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

结构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:
  代码段2_1
except 异常类型2:
  代码段2_2

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

>>> try:
...     print('abc'[4])
... except:
...     print('程序结束!')
...
程序结束!

>>> try:
...     age = int(input('请输入年龄:'))
...     if age >= 18:
...         print('成年!')
...     else:
...         print('未成年!')
... except:
...     print('年龄输入有误!')
...
请输入年龄:twenty
年龄输入有误!

...
请输入年龄:20
成年!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值