day 13 模块和异常捕获
生成器
1. 什么是生成器
生成器是一种同时创建多个数据的容器,生成器中保存的是创建数据的方法,而不是数据本身
-
特点:
a. 打印生成器无法查看元素
b. 不能通过len统计元素的个数
c. 如果需要生成器中的数据,必须将数据取出,且取一个少一个。
-
取出数据和迭代器相同:next()、for遍历、转换为列表
取完数据后再取会报错
-
优势:内存占用少
2. 怎么创建生成器
调用带有yield关键字的函数,就可以得到一个生成器
def func1():
yield
print('h')
return 100
result = func1() # 函数的返回值
print(f'result:{result}')
# result:<generator object func1 at 0x0000018345178120>
在一个普通函数中放一个yield关键字,最后调用时不会执行函数体,且返回的是一个生成器对象。
3. 怎么控制生成器中的元素个数和元素的值
执行创建生成器的函数的函数体时,会遇到几次yield,对应的生成器就会创建几个数据,yield后面的值就是能创建出来的数据
def func3(n):
yield 100
if n % 2 == 0:
yield 200
yield 300
gen3 = func3(3)
print(gen3) # 此时遇到yield两次,所以生成器会创建两个元素:100、300
print('next:', next(gen3)) # next: 100
print('next:', next(gen3)) # next: 300
print(list(gen3)) # []
模块
1. 什么是模块
Python中一个py文件就是一个模块
2. 怎么在一个模块中使用另外一个模块中的内容
-
前提:如果想要在一个模块中使用另外一个模块中的内容,被使用的模块的模块名必须符合变量名要求。
-
导入模块(需要将要使用的模块(py文件)放在当前项目里才能导入)
方法1 import 模块名(即文件名) – 导入指定模块,导入后可以通过 模块名.xxx 使用这个模块中所有内容
import demo print(demo.a) # 100 print(demo.name) # 小明 demo.f_demo1() # demo中函数
方法2 from 模块名 import 内容1,内容2 ,……— 导入模块后可以直接使用指定内容。
from demo import a, f_demo1 print(a) # 100 f_demo1() # demo中函数 print(name) 会报错,因为name没有导入。只能使用import后导入的内容
方法3 from 模块名 import * — 导入指定模块,导入后可以直接使用模块中所有内容
from demo import * print(a) print(name) f_demo1()
方法4 import 模块名 as 新模块名 — 导入指定模块后,对模块进行重命名,使用其中内容:新模块名.xxx
import demo as d print(d.name) print(d.a) d.f_demo1()f
方法5 from 模块名 import 内容1 as 新内容1,内容2,…… — 可以对其中某一个内容重命名,其他内容导入但不命名
from demo import a as score, name print(score) # 100 print(name) # 小明
包 packeage
1. 什么是包 Python package
# 包含__init__.py文件的文件夹就是包
2. 怎么使用包或文件夹中的内容
需要使用的内容所在模块不在当前项目下,而是在一个文件夹(包)中。
1)只适用于python package:
方法1 import 包名 — 导入指定包,导入后通过 包名.xxx 去使用 —init–.py文件中所有内容
import files2 files2.f_test2() print(files2.name)
方法2 from 包名 import 内容1,内容2 …… — 导入 指 定包中–init–.py文件中指定内容
from files2 import name
print(name)
2)包和普通文件夹都可以用
方法3 from 包名 import 模块1,模块2…… — 导入指 定包中指定模块, ’模块名.xxx’
导入包:
from files2.abc import test3,test4
print(test3.demo)
print(test4.a)
导入普通文件夹
from files import test1
print(test1.name)
方法4 import 包名 模块名 – 包名.模块名.内容1
import files2.test2 as t2
print(t2.msg)
方法5 from 包名.模块名 import 内容1, 内容2…… 直接用
from files2.test2 import msg
print(msg)
异常捕获
异常 – 程序中错误
程序中出现异常(报错)会直接让程序结束(在那个位置出现的异常,程序就会在那个地方结束)
# print('+++++')
# print('abc'[3]) 程序报错,在此结束,则打印结果只有 +++++
# print('=====')
异常捕获
让程序在出现异常时,程序不结束,还可以接着往后执行
异常捕获针对 用户操作不当时而导致的程序报错(代码本身是没有问题的) 如不小心在输入年龄是输入了字符
age = int(input('请输入年龄:'))
-
语法结构1 – 捕获所有异常
try: 代码段1(需要捕获异常的代码) except: 代码段2(出现异常后会执行的代码) finally:(可有可无,所有语法结构最后都可以加,不影响前面代码的执行) 代码段3 # 执行过程:先执行代码段1,若代码段1报错(出现异常),程序不报错且立刻会执行代码段2;若代码段1不报错(没有出现异常),则代码段2不执行
finally 后的代码是无论前面代码发生什么都会执行代码段3. 即使报错程序中途结束,代码段3也会执行。
try: age = int(input('请输入年龄:')) print(age) except: print('年龄输入有误!')
-
语法结构2 — 捕获指定类型的异常(推荐使用)
try: 代码段1(需要捕获异常的代码) except 异常类型: 代码段2(出现异常后会执行的代码) #执行过程:如果代码段1出现的异常刚好是except后的异常类型,则执行代码段2;如果不是指定异常类型则程序报错 # 如果没有出现异常,代码段2不执行。
-
语法结构3 ---- 同时捕获多种异常类型,且统一处理
try: 代码段1(需要捕获异常的代码) except (异常类型1、异常类型2……): 代码段2(出现异常后会执行的代码)
-
语法结构4 ---- 同时捕获多种异常类型,分类处理
try:
代码段1(需要捕获异常的代码)
except 异常类型1:
代码段2(出现异常类型1后会执行的代码)
except 异常类型2:
代码段3(出现异常类型2后会执行的代码)
except 异常类型3:
代码段4(出现异常类型3后会执行的代码)
……
"""