Python函数与文件操作详解:从基础语法到文件读写
本文详细解析Python中函数的定义、参数传递、默认值及Lambda表达式,并深入讲解文件操作的open模式、read系列方法、写入注意事项及with语句的安全用法,最后介绍利用pickle模块进行复杂数据序列化的技巧。
前言
本文将重点探讨编程中至关重要的函数概念及文件处理机制。函数允许我们将多条语句封装在一起,接收输入参数并在内部执行计算后返回结果。这种封装方式能有效避免代码重复,提升程序的可读性与简洁性。
文件操作部分将系统介绍文件的读取与写入方法,辨析各方法的差异及注意事项,并补充说明如何使用pickle模块来持久化存储复杂数据结构。
一、函数
函数的分类主要涵盖两个维度:
- 内置函数
- 自定义函数
内置函数是Python语言自带的功能模块,用户只需提供相应参数即可直接调用,例如最基础的print函数;而自定义函数则是开发者根据具体需求,将特定逻辑封装成新的函数单元。
二、自定义函数
1.创建函数
以下通过构建一个计算长方体体积的示例,来解析函数定义中的关键要素:
In [1]: def vol(length,width,height):
...: volume = length*width*height
...: return volume在上述代码片段中,需掌握以下核心概念:
- def:用于定义函数的关键字
- length, width, height:函数定义的形参列表
- return:用于返回计算结果的语句
2.调用函数
自定义函数创建完成后,可通过“函数名(实参)”的语法进行调用:
In [2]: vol(2,2,3)
Out[2]: 12在传递参数时,必须确保实参的位置和数量与形参严格匹配,否则程序将抛出错误。
In [4]: vol(2,2)
TypeError: vol() missing 1 required positional argument: 'height'若需调整参数传递顺序,可通过指定形参名称的方式传值:
In [8]: vol(width=3,length=4,height=5)
Out[8]: 603.函数默认值
函数的形参支持设置默认值,例如将上述vol函数中的height参数默认值设定为2:
In [6]: def vol(length,width,height=2):
...: volume = length*width*height
...: return volume
...:
In [7]: vol(2,2)
Out[7]: 8此时仅向vol函数传入两个实参,程序不会报错且返回值为8。这表明当形参拥有默认值且调用时未提供对应实参时,系统将自动采用默认值。
4.收集函数(可变函数)
函数的形参也可以设计为接收可变数量的参数:
In [9]: def test(*params):
...: print('参数的长度为%d'%len(params))
...: print('第三个参数为%s'%params[2])
...:
In [10]: test(1,2,'mao',3.14,'pp')
参数的长度为5
第三个参数为mao此处通过*标识形参,调用时即可传入任意数量的实参。
5.全局与局部
在函数内部定义的变量称为局部变量,其作用域仅限于该函数内部,函数外部无法直接访问:
In [12]: def test(a,b):
...: c = 2
...: return a*b*c
In [13]: test(2,2)
Out[13]: 8
In [14]: print(c)
NameError: name 'c' is not defined6.匿名函数lambda
对于逻辑简单、代码量少的函数,可使用匿名函数,例如上述计算体积的逻辑可改写为:
In [20]: vol = lambda a,b,c:a*b*c
In [21]: vol(2,2,3)
Out[21]: 12lambda表达式常嵌套在其他语句中,结合相关函数使用能显著简化代码,后续将提供具体示例。
7.内嵌函数
定义函数时支持函数嵌套,但使用时需特别注意逻辑关系的正确性:
In [24]: def fun1(a):
...: b = 2
...: def fun2():
...: return a*b
...: return fun2()
...:
In [25]: fun1(4)
Out[25]: 8三、常用内置函数
前文已涉及部分内置函数,如len、sorted、reversed、sum等,此处补充介绍几个基础且常用的内置函数。
1.max和min
求一个序列中最大值和最小值:
In [28]: min(1,2,3)
Out[28]: 1
In [29]: max(1,2,3)
Out[29]: 32.abs
用于计算数值的绝对值:
In [31]: abs(-1)
Out[31]: 13.round
用于四舍五入并保留指定小数位数:
In [32]: round(3.555,2)
Out[32]: 3.564.pow
用于计算数值的幂次方,或结合第三个参数计算取余:
In [33]: pow(2,3)#2*2*2
Out[33]: 8
In [34]: pow(2,3,3)#(2*2*2)%3
Out[34]: 25.divmod
用于同时计算数值的商和余数:
In [36]: divmod(10,3)
Out[36]: (3, 1)6.help
用于查询函数的帮助文档:
In [37]: help(abs)
Help on built-in function abs in module builtins:
abs(x, /)
Return the absolute value of the argument.7.filter
filter()函数接收两个参数:第一个可以是函数或None,第二个是序列。其作用是对序列中的每个元素进行判断,返回True或False,并自动过滤掉结果为False的元素,保留为True的元素,该函数常与lambda表达式配合使用:
In [38]: list(filter(lambda x:x%2,range(10)))
Out[38]: [1, 3, 5, 7, 9]8.map
map()函数接收两个参数:一个是函数,另一个是序列。其作用是将指定函数应用于序列中的每一个元素,同样可与lambda表达式结合使用:
In [42]: list(map(lambda x: x*2,range(10)))
Out[42]: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]四、文件
文件读写操作中,open()函数是核心接口。若文件存在则打开,不存在则创建,通常用法包含两个参数:open(filename, mode)。
第一个参数指定文件名,第二个参数指定文件打开模式,常用模式包括:
- 'r':以只读方式打开文件(默认模式)
- 'w':以写入模式打开文件,若文件已存在则覆盖原内容
- 'a':以写入模式打开文件,若文件存在则在末尾追加内容
- 'b':以二进制模式打开文件,可组合使用如rb、wb等
1.read()方法读取
read()方法可接受一个可选参数size,表示读取内容的长度。若不传入或传入负数,则读取文件全部内容:
In [52]: fb = open('E:/Python基础/test.txt','r')
In [53]: fb.read(10)
Out[53]: 'nai\nniatan'
In [54]: fb.read()
Out[54]: 'g\nnaitangmao'
In [55]: fb.read()
Out[55]: ''使用read()方法时需注意三点:
- 1、原文件中的换行符在读取时表现为'\n',且占用一个字符长度
- 2、已读取的内容无法再次被read()重复读取
- 3、若读取返回空字符串,表示已到达文件末尾
2.readline()方法
readline()方法从文件中读取单独一行,该行数据末尾包含换行符'\n'。若某行无数据,则仅返回'\n';若返回空字符串,表示到达文件末尾。
In [59]: fb1 = open('E:/Python基础/test.txt','r')
In [60]: fb1.readline()
Out[60]: 'nai\n'3.readlines()方法
readlines()方法用于读取全部文件,与read()的区别在于前者按行读取,且返回值为列表,每行数据作为列表的一个元素:
In [72]: fb3 = open('E:/Python基础/test.txt','r')
In [73]: fb3.readlines()
Out[73]: ['nai\n', 'niatang\n', 'naitangmao']4.遍历文件对象读取
通过遍历文件对象读取内容,格式较为规范:
In [81]: for i in fb4:
...: print(i,end = '')
...:
nai
niatang
naitangmao5.文件的写入
执行写入操作时需注意两点:
- 若写入数据为非字符串类型,需先转换为字符串
- 需明确写入模式是覆盖原有内容还是追加到文件末尾
In [85]: fb5 = open('E:/Python基础/test1.txt','w')
In [89]: list1 = [1,2]
In [91]: fb5.write(str(list1))
Out[91]: 6write()方法执行后会返回写入字符串的长度。
6.文件关闭
务必注意:使用open()打开文件后,操作完成必须调用close()方法关闭文件。
In [92]: fb5.close()7.with方式
为避免忘记关闭文件,建议习惯使用with语句处理文件对象,它能在文件操作结束后自动关闭文件。
In [93]: with open('E:/Python基础/test.txt','r') as fb:
...: data = fb.read()
In [95]: fb.closed
Out[95]: True8.pickle
前文提及非字符串写入需转换,若需保存字典或列表等复杂数据结构,可使用pickle模块实现序列化存储与读取:
In [96]: import pickle
In [97]: list1 = ['nai','tang','mao',1,2,3]
In [98]: pic_f = open('E:/Python基础/list.pkl','wb')
In [99]: pickle.dump(list1,pic_f)
In [100]: pic_f.close()dump()方法接收两个参数:第一个为待存储内容,第二个为文件对象。操作完成后需调用close()关闭文件对象;存储后可通过load()方法加载文件内容。
In [102]: pic_f = open('E:/Python基础/list.pkl','rb')
In [103]: list2 = pickle.load(pic_f)
In [104]: list2
Out[104]: ['nai', 'tang', 'mao', 1, 2, 3]
In [105]: pic_f.close()使用pickle存储或读取时,必须以二进制模式操作文件对象,即使用'wb'和'rb'模式。pickle适用于存储数据类型复杂且数据量较大的场景。
关于Python函数和文件操作的详解至此结束,更多相关Python文件操作内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













