一. 函数
1.1 函数基础知识
- 函数的定义和调用如下:
函数定义:
def 函数名字(传入参数):
函数体
return 返回值
# 遇到return语句后函数的执行就结束了,所以写在return后的代码不会执行
"""
函数的调用:
函数名字(参数)
"""
def add(x, y):
print(f"{x}+{y}的结果是:{x+y}")
add(1,2)
- 函数定义中,x和y称为形式参数(形参)
- 函数调用中,提供的1和2称为实际参数(实参)
- 就算没有使用return语句来返回数据,函数仍然具有返回值,只不过返回的结果为None。
- None是python中的一个特殊字面量,和1、1.1、"hello"这些整数、浮点数和字符串所表达的意义相同,其类型是:<class ‘NoneType’>。当我们没有写return语句时,函数实际上返回了None这个字面量。None表示空的、无意义的,所以返回None就表示这个函数没有返回什么有意义的内容,也就是返回了空的意思。在if判断语句中,None等同于False。当定义的变量暂时不需要有具体值,那么就可以将None赋值给该变量。
- 建议以后写函数,尽量带上函数说明文档
- 局部变量和全局变量
- 函数和方法的区别:如果将函数定义在class类中,那么函数就被称为方法(成员方法)。方法和函数的功能一样,有传入参数,有返回值,只是方法的使用格式不同。
# 函数:
def add(x,y):
return x+y
class Student:
# 方法
def add(self, x, y):
return x+y
# 函数的使用:
num = add(1,2)
# 方法的使用
stu = Student()
num = stu.add(1, 2)
1.2 函数进阶
- 函数多个返回值,直接上代码。
def test_return():
return 1, 2, 3
x, y, z = test_return()
print(x) # 结果:1
print(y) # 结果:2
print(z) # 结果:3
# 按照返回值的顺序,书写对应顺序的多个变量接收即可。
# 变量之间使用逗号隔开,可支持return不同类型的数据。
- 函数的多种参数使用形式
(1)位置参数
(2)关键字参数
(3)缺省参数(默认参数)
(4)不定长参数(可变参数)
- 函数作为参数传递:在前面的函数学习中,使用的函数都是接受数据作为参数传入:数字、字符串、字典、列表、元组等,其实函数本身也可以作为参数传入到另一个函数内。
- lambda匿名函数:在函数定义中,关键字"def"可以定义带有名称的函数,关键字"lambda"可以定义匿名函数(无名称)。lambda匿名函数定义语法:
lambda 传入参数: 函数体(一行代码)
,其中,lambda是关键字,表示定义匿名函数;传入参数表示匿名函数的形式参数(形参);函数体就是函数执行的逻辑代码,要注意只能写一行代码,无法写多行代码。
二. 文件操作
2.1 文件编码的概念
编码技术就是翻译的规则,记录了如何将内容翻译成二进制,以及如何将二进制翻译回可识别内容,计算机中存在多种编码方式:UTF-8、GBK、Big5等等。
总结:
- 什么是编码? 编码是一种规则集合,记录了内容(数据)和二进制之间的转换逻辑,在众多编码规则中,最常用的是UTF-8编码。
- 为什么要使用编码?计算机只认识0和1,所以需要将内容翻译成0和1才能保存在计算机中。同时计算机保存的0和1通过反向翻译可以转换为可识别的内容。
2.2 文件的读写操作
- 文件的概念
- 绝对路径:文件真实存在的位置;例如:
D:\Project\python_heima\main.py
- 相对路径:相对于当前位置的路径。其中,
./表示当前文件所在的目录
,../代表当前文件的上一层目录
。例如:module是一个包含train.py和test.py的文件夹,那么对于train.py而言,test.py的相对路径为./test.py 或者 test.py
,./
可以省略不写。 - 在Windows操作系统下,文件路径中使用反斜杠(
\
),Linux系统下的文件路径使用斜杆(/
),Windows系统有时能够正确地解读文件路径中的斜杆(/
)。由于反斜杠\
在python中被视为转义标记(\ + 字母 可以实现特殊的功能
),为了在Windows中确保万无一失,应该在路径的原始字符串开头加上字母r
或者使用双反斜杠\\
,即r"D:\Project\python_heima\test.py"
或者"D:\\Project\\python_heima\\test.py"
。 - 在日常生活中,文件操作主要包括打开、关闭、读和写等操作。大致分为三个步骤:首先打开文件;然后进行读或写操作;最后关闭文件。
- 打开文件
- 使用
open()函数
打开文件,并返回一个表示文件的对象。
- mode常用的三种访问模式
- 读取操作
- 常用的读取操作
read(num)
方法返回字符串,num表示从文件中读取数据的长度(逐个字节或逐个字符读取文件内容),如果没有传入num,那么就读取文件中所有的数据。
"""
AAA.txt文件的内容
hello world
haha hehe
ni hao
"""
obj = open("AAA.txt", "r", encoding="utf-8")
result = obj.read()
print(result)
print(type(result))
obj.close()
"""
输出:
hello world
haha hehe
ni hao
<class 'str'>
"""
readlines()
方法返回一个列表,该方法按照行的方式将文件的所有内容一次性读取,返回到列表中,其中每一行数据为一个元素。
"""
AAA.txt文件的内容
hello world
haha hehe
ni hao
"""
obj = open("AAA.txt", "r", encoding="utf-8")
result = obj.readlines()
print(result)
print(type(result))
obj.close()
"""
输出:
['hello world\n', 'haha hehe\n', 'ni hao']
<class 'list'>
"""
readline()
方法返回字符串,一次读取一行内容。
"""
AAA.txt文件的内容
hello world
haha hehe
ni hao
"""
obj = open("AAA.txt", "r", encoding="utf-8")
result1 = obj.readline()
print(f"读取第一行:{result1}")
print(type(result1))
result2 = obj.readline()
print(f"读取第二行:{result2}")
print(type(result2))
result3 = obj.readline()
print(f"读取第三行:{result3}")
print(type(result3))
obj.close()
"""
输出:
读取第一行:hello world
<class 'str'>
读取第二行:haha hehe
<class 'str'>
读取第三行:ni hao
<class 'str'>
"""
for循环读取文件
"""
AAA.txt文件的内容
hello world
haha hehe
ni hao
"""
obj = open("AAA.txt", "r", encoding="utf-8")
# 每个临时变量line就记录了文件的一行数据
for line in obj:
print(line)
print(type(line))
obj.close()
"""
输出:
hello world
<class 'str'>
haha hehe
<class 'str'>
ni hao
<class 'str'>
"""
close()
方法表示关闭文件对象。如果不调用close(),同时程序没有停止运行,那么该文件将一直被python程序占用。with open() as f:
方法在with open的语句块中对文件进行操作,在操作完成后自动关闭文件,避免遗忘掉close()方法。关键字with
会在需要使用文件的时候打开它,不需要访问文件后在合适的时候自动关闭文件,因此建议使用with open() as f:
来打开文件。
"""
AAA.txt文件的内容
hello world
haha hehe
ni hao
"""
with open("AAA.txt", "r", encoding="utf-8") as obj:
data_list = obj.readlines()
print(data_list)
"""
输出:
['hello world\n', 'haha hehe\n', 'ni hao']
"""
- 写入操作
- 进行写操作时需要将模式mode设置为"w",然后使用
write()
方法实现数据写入到文件中。
直接调用write()
方法,内容并未真正的写入到文件中,而是会积攒在程序的内存中,称之为缓冲区。当调用flush()
方法时,内容才会真正写入到文件中。这样做是为了避免频繁操作硬盘,导致效率下降,积攒成一堆,一次性写出来的效率会很高。close()
方法带有flush()
方法的功能,因此我们可以直接使用close()
方法。python只能将字符串写入到文本文件中,如果要将数值数据存储到文本文件,必须先使用函数str()
将其转换为字符串格式。
# 1.打开文件
obj = open("python.txt", "w", encoding="utf-8")
# 2.文件写入
obj.write("hello world")
# 3.内容刷新
obj.flush()
# 另外一种实现方式
with open("python.txt", "w", encoding="utf-8") as obj:
obj.write("hello world")
- 将模式mode设置为"a"表示追加写入操作,新内容写在已有内容之后。
三. 杂七杂八
3.1 异常操作
- 为什么需要捕获异常
- 捕获异常的方式
- 捕获常规异常语法
"""
基本语法:
try:
可能发生错误的代码
except:
如果出现异常执行的代码
"""
# 需求:尝试以"r"模式打开文件,如果文件不存在,则以"w"方式打开
try:
f = open("linux.txt", "r")
except:
f = open("linux.txt", "w")
- 捕获指定异常语法
# 基本语法
try:
print(name)
except NameError as e:
print("变量name未定义错误")
"""
(1)如果尝试执行的代码异常类型和要捕获的异常类型不一致,则无法捕获异常。
(2)一般try下方只放一行尝试执行的代码
"""
- 捕获多个异常语法
# 当捕获多个异常时,可以把要捕获的异常类型名字放到except后,并使用元组的方式进行书写
# 基本语法
try:
print(name)
print(1/0)
except (NameError, ZeroDivisionError):
print("变量name未定义错误")
print("1/0错误")
- 捕获所有异常语法
# 基本语法
try:
print(1/0)
except Exception as e:
print("出现异常了")
- 异常的else语句
try:
print(1)
except Exception as e:
print("出现异常了")
else:
print("我是else语句,没有出现异常")
# else表示如果没有出现异常需要执行的代码
- 异常的finally语句
# 基本语法
try:
print(1/0)
except Exception as e:
print("出现异常了")
else:
print("我是else语句,没有出现异常")
finally:
print("就算出现异常,我也会执行")
# finally表示无论是否出现异常都会执行的代码,例如关闭文件
- 异常总结
- 异常的传递性
3.2 模块
- python中的模块本质上就是一个python文件(扩展名为.py的文件)。
- import 模块名
"""
基本语法:
import 模块名
import 模块名1, 模块名2
模块名.功能名()
这里的功能名指的是方法名
"""
- 自定义模块
- python中已经存在了许多内置的模块,但是有时候我们需要使用一些个性化的模块,这里就可以通过自定义模块来实现。说白了,自定义模块就是自己制作一个python文件(.py)。
- 在测试自定义的模块是否能达到预期效果时,需要把测试信息放在
if __name__ == "__main__":
中,如下代码所示。
def test(a, b):
return a + b
# 只有执行当前模块,内置变量__name__才等于__main__,进而执行下面的语句。
# 如果将该模块(main.py)导入到其它模块中,__name__就会等于main,因此不会执行下面的语句
if __name__ == "__main__":
print(__name__) # 结果: __main__
num = test(1, 2)
print(num) # 结果: 3
__all__=["xx, "xxx", "xxxx"]
,"__all__"变量是一个列表,可以存储当前模块的一些成员(变量、成员方法、函数和类)名称。当其它文件仅以from 模块名 import *
形式导入该模块时,表示只能使用该模块的__all__
列表中指定成员。
注意:以下两种情况会导致__all__
用法失效。
"""
(1)以 import 模块名 形式导入模块后,通过模块名前缀来调用模块内的成员;
(2)以 from 模块名 import 成员 的形式导入指定成员.
"""
3.3 包
- 基于python模块,我们可以在编写代码的时候,导入许多外部的代码来丰富功能。但如果python模块太多了,就可能造成一定的混乱,此时我们可以通过python包的功能来管理众多的模块。
- 什么是包?
“__init__.py"文件:当文件夹中存在”__init__.py"文件时,该文件夹就是一个包(package),没有"__init__.py"文件就是一个普通的文件夹。只有存在"__init__.py"文件,该文件夹才是一个包,这个"__init__.py"文件里面可以不写任何东西,但作为一个包,它必须存在。 - 怎样使用包?
- 解释"__init__.py"文件
在创建包时默认会自动创建的文件,通过这个文件来表示一个文件夹是python的包,而并非普通文件夹。 - 第三方包
- 什么是第三方包?
- 怎样安装第三方包?
通过pip install 包名称
来安装第三方包,由于pip 这个工具默认链接国外的网站,所以使用它来下载第三方包的速度会有点慢。我们可以使用国内镜像来下载第三方包。
3.4 json数据
- 什么是json?
- json的作用?
- json数据的格式是什么?
- python数据和json数据怎样相互转化?
- json中
dumps、dump、loads、load
的使用
import json
# 1.json.dumps: 将python对象格式化成json字符串
msg = {"姓名": "张三", "年龄": 18, "性别": "男"}
encoded_json = json.dumps(msg, ensure_ascii=False)
print(encoded_json, type(encoded_json)) # 结果: {"姓名": "张三", "年龄": 18, "性别": "男"} <class 'str'>
# 2.json.loads:将json字符串解码成python对象(字典)
decode_json = json.loads(encoded_json)
print(decode_json, type(decode_json)) # 结果: {'姓名': '张三', '年龄': 18, '性别': '男'} <class 'dict'>
# 3.json.dump: 主要用来将python对象写入到json文件中
with open("demo.json", "w", encoding='utf-8') as obj:
json.dump(msg, obj, ensure_ascii=False)
# 4.json.load: 从文件中读取json类型的数据,并返回python对象(字典)
with open("demo.json", "r", encoding='utf-8') as obj:
data = json.load(obj)
print(data, type(data)) # 结果: {'姓名': '张三', '年龄': 18, '性别': '男'} <class 'dict'>
json.load()和json.loads()
方法都可以将JSON数据转换为Python数据类型,只不过json.load()
从JSON文件中读取数据,json.loads()
从JSON字符串中读取数据。json.dump()
是将python对象转成json格式并存入到文件中,json.dumps()
是将python对象转成json格式的字符串。