python函数和文件操作(二)

本文介绍了Python中的函数基础知识,包括定义、调用、参数类型、返回值、局部与全局变量,以及函数进阶如多返回值和参数使用。此外,还涵盖了文件操作、编码概念、读写操作、异常处理、模块与包的使用,以及json数据的处理方法。
摘要由CSDN通过智能技术生成

一. 函数

1.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赋值给该变量。
  • 建议以后写函数,尽量带上函数说明文档
    函数说明文档
  1. 局部变量和全局变量
    局部变量
    全局变量
  2. 函数和方法的区别:如果将函数定义在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 函数进阶

  1. 函数多个返回值,直接上代码。
def test_return():
	return 1, 2, 3
x, y, z = test_return()
print(x)  # 结果:1
print(y)  # 结果:2
print(z)  # 结果:3
#  按照返回值的顺序,书写对应顺序的多个变量接收即可。
#  变量之间使用逗号隔开,可支持return不同类型的数据。
  1. 函数的多种参数使用形式

(1)位置参数
位置参数
(2)关键字参数
关键字参数
(3)缺省参数(默认参数)
默认参数
(4)不定长参数(可变参数)
可变参数
位置传递
关键字传递

  1. 函数作为参数传递:在前面的函数学习中,使用的函数都是接受数据作为参数传入:数字、字符串、字典、列表、元组等,其实函数本身也可以作为参数传入到另一个函数内。
    函数作为参数传递
  2. lambda匿名函数:在函数定义中,关键字"def"可以定义带有名称的函数,关键字"lambda"可以定义匿名函数(无名称)。lambda匿名函数定义语法:lambda 传入参数: 函数体(一行代码),其中,lambda是关键字,表示定义匿名函数;传入参数表示匿名函数的形式参数(形参);函数体就是函数执行的逻辑代码,要注意只能写一行代码,无法写多行代码。
    函数

二. 文件操作

2.1 文件编码的概念

编码技术就是翻译的规则,记录了如何将内容翻译成二进制,以及如何将二进制翻译回可识别内容,计算机中存在多种编码方式:UTF-8、GBK、Big5等等。
编码规则
总结:

  • 什么是编码? 编码是一种规则集合,记录了内容(数据)和二进制之间的转换逻辑,在众多编码规则中,最常用的是UTF-8编码。
  • 为什么要使用编码?计算机只认识0和1,所以需要将内容翻译成0和1才能保存在计算机中。同时计算机保存的0和1通过反向翻译可以转换为可识别的内容。

2.2 文件的读写操作

  1. 文件的概念
    文件的概念
  • 绝对路径:文件真实存在的位置;例如: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"
  • 在日常生活中,文件操作主要包括打开、关闭、读和写等操作。大致分为三个步骤:首先打开文件;然后进行读或写操作;最后关闭文件。
  1. 打开文件
  • 使用open()函数打开文件,并返回一个表示文件的对象。
    open函数
  • mode常用的三种访问模式
    mode
  1. 读取操作
  • 常用的读取操作
    读取操作
  • 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']
"""
  1. 写入操作
  • 进行写操作时需要将模式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 异常操作

  1. 为什么需要捕获异常
    为什么需要捕获异常
  2. 捕获异常的方式
  • 捕获常规异常语法
"""
基本语法:
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表示无论是否出现异常都会执行的代码,例如关闭文件
  • 异常总结
    异常总结
  1. 异常的传递性
    异常的传递性

3.2 模块

  1. python中的模块本质上就是一个python文件(扩展名为.py的文件)。
    python模块
    模块的导入方式
  2. import 模块名
"""
基本语法:
import 模块名
import 模块名1, 模块名2

模块名.功能名()  
这里的功能名指的是方法名
"""
  1. 自定义模块
  • 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 包

  1. 基于python模块,我们可以在编写代码的时候,导入许多外部的代码来丰富功能。但如果python模块太多了,就可能造成一定的混乱,此时我们可以通过python包的功能来管理众多的模块。
  2. 什么是包?
    包
    “__init__.py"文件:当文件夹中存在”__init__.py"文件时,该文件夹就是一个包(package),没有"__init__.py"文件就是一个普通的文件夹。只有存在"__init__.py"文件,该文件夹才是一个包,这个"__init__.py"文件里面可以不写任何东西,但作为一个包,它必须存在。
  3. 怎样使用包?
    使用包
    在这里插入图片描述
  4. 解释"__init__.py"文件
    在创建包时默认会自动创建的文件,通过这个文件来表示一个文件夹是python的包,而并非普通文件夹。
  5. 第三方包
  • 什么是第三方包?
    第三方包
  • 怎样安装第三方包?
    通过pip install 包名称来安装第三方包,由于pip 这个工具默认链接国外的网站,所以使用它来下载第三方包的速度会有点慢。我们可以使用国内镜像来下载第三方包。
    国内镜像

3.4 json数据

  1. 什么是json?
    json
  2. json的作用?
    json的作用
  3. json数据的格式是什么?
    json数据格式
  4. python数据和json数据怎样相互转化?
    二者相互转化
    转化
  5. 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格式的字符串
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值