模块、包、异常捕获
一、作业修改
1、写一个函数将一个指定的列表中的元素逆序( 如[1, 2, 3] -> [3, 2, 1])(注意:不要使用列表自带的逆序函数)
list1=[1, 2, 3,4]
for i in list1:
print(f'元素{i}')
print(f'pop结果{list1.pop(0)}')
print(f'列表{list1}')
print(list1)
3.编写一个函数,计算一个整数的各位数的平方和
# reduce
def sum_of_square(num: int):
return reduce(lambda initial, item: initial + int(item) ** 2, str(num), 0)
# 列表推导式
def sum_of_square(num: int):
return sum([int(i) ** 2 for i in str(num)])
8 已经一个列表message, 使用reduce计算列表中所有数字的和
# 列表推导式:
result=reduce(lambda initial,item: initial+item ,[i for i in message if type(i)in (int,float)],0)
print(result)
# 三名运算符
result=reduce(lambda inital,item:inital+0 if type(item)not in (int,float) else inital+item,message,0)
print(result)
二、生成器
1、什么是生成器
-
1)是一种可以创建多个数据的容器,生成器中保存的是创建数据的方法,而不是数据本身
-
2)特点:
- 打印生成器的时候看不到元素,
- 也无法通过len统计元素个数
- 如果需要生成器中的数据,必须将数据取出,而且是取一个少一个
-
3)生成器获取元素的方式好=和迭代器获取元素的方式一样
2、创建生成器
- 调用带有yield关键字的函数就可以得到一个生成器
def func1():
print('abc')
yield
return 100
3、怎么控制生成器中元素的个数和元素的值
- 执行创建生成器函数体的时候遇到几个yield,
- 对应的生成器就创建几个数据,每次遇到yield,
- 创建的数据就是yield关键字后的值
def func3(n):
yield 100
if n%2==0:
yield 200
yield 300
gen3=func3(5)
print(list(gen3)) # [100, 300]
三、模块
1、什么是模块
- python中一个py文件就是一个模块
- 系统模块
- 自定义模块
2、怎么在一个模块中使用另外一个模块中的内容
-
**1)使用前提:**在一个模块使用另一个模块中的内容,被使用的内容所在的模块名必须符号变量名要求
-
2)导入模块
- a. import 模块名 -
- 导入指定模块,导入后可以通过 模块名.xxx 的方式使用模块中所有内容
- b. from 模块名 import 内容1,内容2,…
- 导入模块,导入后可以直接使用指定模块的内容
- c. from 模块名 import * -
- 可以直接使用模块中所有内容
- d.import 模块名 as 新模块名
- 导入指定模块后,对指定模块重命名:‘模块名.xxx’
- e. from 模块名 import 内容1 as 新内容
- a. import 模块名 -
导入方式1 import 模块名
import test
print(test.a)
print(test.name)
print(test.func1(21))
导入方法2 from 模块名 import 内容1,内容2,
from test import a,func1
print(func1(22))
print(a)
# print(name) # NameError: name 'name' is not defined
print(test.name) # 会报错
导入方法3 from 模块名 import *
from test import *
print(a)
print(name)
print(func1(21))
导入方法4 import 模块名 as 新模块名
import test as t1
print(t1.func1(2))
print(t1.name)
对导入的内容重命名 from 模块名 import 内容1 as 新内容
from test import name as t_name,a as t_a
name='笑笑'
a=100
print(t_a)
print(t_name)
print(a,name)
四、包
1、什么是包
- 包含__init__.py文件的文件夹就是包
2、怎么使用包或者文件夹中模块的内容-
-
import 包名
- 只适用于包,导入指定的包,导入后可以通过包名.xxx取使用包中__init__.py文件中的东西
-
from 包名 import 模块1,模块2…
- 导入指定包中指定的模块,导入后通过模块名.xx使用指定模块中的内容(适用于文件夹)
-
from 包名 import 内容1,内容2…
- 导入指定包中__init__.py文件中的内容
-
import 包名.模块名
-
from 包名.模块名 import 内容1,内容2…
1)import 包名 (__init__中的内容)
import files2
files2.f_test2()
2)from 包名 import 模块1,模块2…
3)from 包名 import 内容1,内容2…( init.py中的内容)
from files2 import test2, test4, pi, f_test2
print(test4.str1)
print(test2.name)
4)import 包名.模块名
import files2.test2 as f2_t2
print(f2_t2.name)
- from 包名.模块名 import 内容1,内容2…
import files2.abc.tesr3 as t3
print(t3.demo)
五、异常捕获
1、异常 - 程序中的错误
程序出现异常:会直接让程序结束运行,在那个位置出现异常,程序就在哪个位置结束
2、异常捕获
- 让程序在出现异常的时候程序不结束,还可以接着往后执行
3、语法结构
1)语法:
-
捕获所有异常
try:
代码段1(需要捕获异常的代码)
except:
代码段2(出现代码后会执行的代码)
finally:
代码段3(无论如何都会执行的代码) -
执行过程:
先执行代码段1,执行代码段1的时候如果没有出现异常,就不执行代码段2;
如果出现异常,程序马上执行代码段2
try:
age=int(input('请输入年龄:'))
print(f'age:{age}')
except:
print('年龄输入有误!')
2)语法结构2 -
-
捕获指定类型的异常
try:
代码段1(需要捕获异常的代码)
except 异常类型:
代码段2(出现代码后会执行的代码)
finally:
代码段3
try:
print('abc'[4])
except IndexError:
print('出错') # 出错
try:
print('abc'[4])
except KeyError:
print('出错') # 捕获不了其他类型的异常
# IndexError: string index out of range
3)语法结构3 -
-
捕获多个指定类型的异常
try:
代码段1(需要捕获异常的代码)
except (异常类型1,异常类型2):
代码段2(出现代码后会执行的代码)
finally:
代码段3
4)语法结构3 -
-
捕获多个指定类型的异常,并作出不同处理
try:
代码段1(需要捕获异常的代码)
except 异常类型1:
代码段21(出现代码后会执行的代码)
except (异常类型2,异常类型22):
代码段21
…