目录
1、模块
2、包
3、异常
4、文件
5、高阶函数
一、模块
定义:在python中,一个文件(以“.py”为后缀名的文件)就叫做一个模块
导入模块的三种方式:
-
方式一:import 模块名
# 导入整个demo模块
import demo
# 使用demo模块名作为前缀访问模块中的Tiger类
t = demo.Tiger()
# 使用demo模块名作为前缀访问模块中的函数
demo.say()
-
方式二:from 模块名 import 功能名
使用了 from...import 最简单的语法来导入指定成员:
# 导入demo模块中的指定成员
from demo import Tiger
t = Tiger()
print(Tiger.name)
-
方式三:from 模块名 import *
在Python项目下创建fun包,并在__init__.py文件中配置包的导入行为。
# 导入fun包下中demo01模块下的Lion成员
from fun.demo01 import Lion
__all__ = ["Lion"]
二、包
定义:包将有联系的模块组织在一起,放在同一个文件夹下,这个文件夹就称之为包。
每个包下默认会有一个__init__.py
文件。(__init__.py
控制着包的导入行为)
导入包的三种方式:
-
import 包名[.模块名 [as 别名]]
import my_package.module1
# 必须通过包名.模块名的方式访问模块中的成员
my_package.module1.hello()
-
from 包名 import 模块名 [as 别名]
# 导入my_package包下的module1模块
from my_package import module1
module1.hello()
-
from 包名.模块名 import 成员名 [as 别名]
此语法格式用于向程序中导入“包.模块”中的指定成员(变量、函数或类)。
通过该方式导入的变量(函数、类),在使用时可以直接使用变量名(函数名、类名)调用:
# 导入my_package包下的module1模块中的hello成员
from my_package.module1 import hello
hello()
三、异常
程序运行时常会碰到一些错误,例如除数为 0、年龄为负数、数组下标越界等,这些错误如果不能发现并加以处理,很可能会导致程序崩溃。和 C++、Java 这些编程语言一样,Python 也提供了处理异常的机制,可以让我们捕获并处理这些错误,让程序继续沿着一条不会出错的路径执行。
异常处理
-
捕获指定异常类型
通过多 except 代码块,捕获不同类型的异常。
# 捕获指定异常类型
nums = [1, 2]
try: # 监控可能发生异常的代码
print(nums[2])
except IndexError:
print('超过索引范围')
print('程序结束')
-
捕获多个指定异常
# 每个 except 块都可以同时处理多种异常
try:
print(1 / 0)
except (IndexError, ZeroDivisionError):
print("下标越界或除数不能为0")
except Exception:
print("未知错误")
-
捕获所有异常
所有异常的父类都是Exception,通过Exception即可捕获所有异常信息。
# 每个 except 块都可以同时处理多种异常
try:
print(1 / 0)
except (IndexError, ZeroDivisionError):
print("下标越界或除数不能为0")
except Exception:
print("未知错误")
-
异常的捕获信息
针对未知异常信息,可以通过Exception as 变量名
方式捕获特定的异常信息。
# 接收2个数,输出其商
try:
x = int(input('请输入第一个数')) # valueError
y = int(input('输出第二个数'))
rs = x / y # ZeroDivisionError
print(f'{x}/{y}={rs}')
except ValueError as ex:
print(f'输入正确格式{ex}')
except ZeroDivisionError as ex:
print('除数不能为0')
except Exception:
print('未知错误!')
print('程序结束')
异常的else
在原本的try except
结构的基础上,Python异常处理机制还提供了一个 else 块,也就是原有 try except 语句的基础上再添加一个 else 块,即try except else
结构。
nums = [10, 9, 8]
try: # 监控可能发生异常的代码
print(nums[4])
except IndexError:
print('超出索引范围')
else:
print('没有异常!')
print('程序结束')
异常的finally
Python异常处理机制还提供了一个 finally 语句,通常用来为 try 块中的程序做扫尾清理工作。
在整个异常处理机制中,finally 语句的功能是:无论 try 块是否发生异常,最终都要进入 finally 语句,并执行其中的代码块。
nums = [10, 9, 8]
try: # 监控可能发生异常的代码
print(nums[2])
print('try块中,异常后面的代码') # 没有异常就会执行 有异常就不会被执行
except IndexError:
print('超出索引范围')
else:
print('没有异常!')
finally:
print('无论是否有异常,都会被执行!')
print('程序结束')
自定义异常
# 自定义异常应用于:业务规则
# 方法或函数找不到合适的值告诉调用者违反业务规则
class MyException(Exception):
def __init__(self, msg: str):
self.msg = msg
def __str__(self):
return self.msg
try:
a = 20
if a < 18 :
raise MyException('不能小于18')
except MyException as ex:
print(ex)
print('程序结束')
四、文件
功能:打开文件、读取和追加数据、插入和删除数据、关闭文件、删除文件等。
open()函数
open() 函数用于创建或打开指定文件
该函数的常用语法格式如下:
file = open(file_name [, mode='r' [ , buffering=-1 [ , encoding = None ]]])
open() 函数支持的文件打开模式:
模式 | 说明 | 注意实现 |
r | 只读模式打开文件,读文件内容的指针会放在文件的开头。 | 操作的文件必须存在。 |
rb | 以二进制格式、采用只读模式打开文件,读文件内容的指针位于文件的开头,一般用于非文本文件,如图片文件、音频文件等。 | |
r+ | 打开文件后,既可以从头读取文件内容,也可以从开头向文件中写入新的内容,写入的新内容会覆盖文件中等长度的原有内容。 | |
rb+ | 以二进制格式、采用读写模式打开文件,读写文件的指针会放在文件的开头,通常针对非文本文件(如音频文件)。 | |
w | 以只写模式打开文件,若该文件存在,打开时会清空文件中原有的内容。 | 若文件存在,会清空其原有内容(覆盖文件);反之,则创建新文件。 |
wb | 以二进制格式、只写模式打开文件,一般用于非文本文件(如音频文件) | |
w+ | 打开文件后,会对原有内容进行清空,并对该文件有读写权限。 | |
wb+ | 以二进制格式、读写模式打开文件,一般用于非文本文件 | |
a | 以追加模式打开一个文件,对文件只有写入权限,如果文件已经存在,文件指针将放在文件的末尾(即新写入内容会位于已有内容之后);反之,则会创建新文件。 | |
ab | 以二进制格式打开文件,并采用追加模式,对文件只有写权限。如果该文件已存在,文件指针位于文件末尾(新写入文件会位于已有内容之后);反之,则创建新文件。 | |
a+ | 以读写模式打开文件;如果文件存在,文件指针放在文件的末尾(新写入文件会位于已有内容之后);反之,则创建新文件。 | |
ab+ | 以二进制模式打开文件,并采用追加模式,对文件具有读写权限,如果文件存在,则文件指针位于文件的末尾(新写入文件会位于已有内容之后);反之,则创建新文件。 |
文件读写
示例一:读
Python提供了如下 3 种函数,它们都可以帮我们实现读取文件中数据的操作:
函数 | 说明 |
---|---|
read() | 逐个字节或者字符读取文件中的内容 |
readline() | 逐行读取文件中的内容 |
readlines() | 一次性读取文件中多行内容 |
try:
# 1.读取整个文件,并返回列表
print(f.readlines())
# 2.读取一行
print(f.readline())
# 3.逐个字节或者字符读取文件中的内容
print(f.read(8))
except Exception as ex:
print(ex)
finally:
# 关闭文件
f.close()
示例二:写
函数 | 说明 |
---|---|
write() | 可以向文件中写入指定内容。注意:在使用 write() 向文件中写入数据,需保证使用 open() 函数是以 r+、w、w+、a 或 a+ 的模式打开文件,否则执行 write() 函数会抛出 io.UnsupportedOperation 错误。 |
writelines() | 可以实现将字符串列表写入文件中。注意:使用 writelines() 函数向文件中写入多行数据时,不会自动给各行添加换行符。 |
注意,写入函数只有 write() 和 writelines() 函数,而没有名为 writeline 的函数。
f = open("a.txt", "w+",encoding="UTF-8")
# 不换行
f.write("hello")
f.write("hello")
f.write("hello world")
# 换行
f.write("hello world\n")
f.write("hello world\n")
f.write("hello world\n")
# 追加 这个需要打开模式为a
f.write("ni hao python")
f.close()
实例三:with as
使用 with as 操作已经打开的文件对象(本身就是上下文管理器),无论期间是否抛出异常,都能保证 with as 语句执行完毕后自动关闭已经打开的文件。
with as 语句的基本语法格式为:
with 表达式 [as target]: 代码块
with open("a.txt", "w+", encoding="UTF-8") as f:
# 占用4个字节
f.write("hello☺world\n")
f.write("hello☺world\n")
f.write("hello☺world\n")
五、高阶函数
高阶函数:一个函数可以作为参数传给另外一个函数,或者一个函数的返回值为另外一个函数(若返回值为该函数本身,则为递归),满足其一则为高阶函数。
filter()函数
filter(func,lst)
函数(又称之为过滤函数)用于过滤序列,过滤掉不符合条件的元素,返回一个filter对象,可将其转换成list。
nums = [1, 2, 3, 4, 5, 6, 7]
# 1.filter 过滤函数
f = filter(lambda a: a > 5, nums)
map()函数
map(func,lst)
函数(又称之为遍历函数)将传入的函数变量func作用到lst变量的每个元素中,并将结果组成新的列表(Python2)或者迭代器对象(Python3)。
nums = [1, 2, 3, 4, 5, 6, 7]
# 2.map 遍历函数
m = map(lambda a: a * 2, nums)
reduce()函数
reduce(func,lst)
函数(又称之为规约函数),其中func必须有两个参数,每次func计算的结果继续和序列的下一个元素做累计计算处理。
通过reduce()函数计算总和:
nums = [1, 2, 3, 4, 5, 6, 7]
r = reduce(lambda a, b: a + b, nums)
print(r)