特殊参数与文件IO
文章目录
- 特殊参数
- 默认值参数
- 关键字参数
- 可变参数args
- 可变参数kwargs
- 传递元组/列表给可变参数args
- 传递字典给可变参数kwargs
- 组合使用
- 文件IO
- 打开文件
- 关闭文件
- 文件读取
- read
- readline
- readlines
- 文件写入
- write
- writelines
- 使用with
特殊参数
默认值参数
- 形参设定默认值 称为 **默认参数。**调用函数时,可以使用比定义时更少的参数。
- 调用函数时,如果没有传入默认参数对应的实参,则实参使用默认值
- 默认参数在调用的时候可以不传递,也可以传递
def say_hello(name='林青霞'):# 形参 没有默认数据的参数定义在有默认数据的参数后面"""给女神打招呼:param name::return:"""print('hello ', name)# 调用时不传递参数,使用默认值
say_hello()
# 调用时传递参数
say_hello('高圆圆')
注意:默认参数一定要在参数的最后
def say_hello(score, name='林青霞'):# 默认参数放在参数最后面"""给女神打招呼:param name::return:"""print('hello %s'%(name))say_hello(60, '高圆圆')
关键字参数
- 调用函数时,实参可以指定对应的形参,称为 关键字参数
def say_hello(name, age, score):print('姓名:%s,年纪:%d,分数:%f'%(name,age,score))say_hello(name='林青霞',age=60,score=70.5)
- 使用关键字参数调用可以改变传递参数的顺序
# 改变参数传递的顺序
say_hello(score=70,age=30,name='高圆圆')
可变参数args
可变参数需要添加*
,用于接收任意数量的参数
这里的args
代指arguments
,可以写其他任意名称
def sum(*args):# 形参能够接收任意个长度的数据pass# 调用可变参数的函数
sum(10,20,30)
sum(10,20,30,40)
可变参数的本质是 将传递的参数包装成了元组
实现多个参数的sum
函数
def sum(name, *args):# 形参能够接收任意个长度的数据 args为元组类型result = 0for ele in args:result += elereturn result
如果还有其他参数时,*args
要放最后
可变参数kwargs
可变参数还有一种形式 可以接收不存在的关键字参数
定义参数时需要在变量名前添加两个*
,这里的kwargs
代指keywords
,可以写其他任意名称。
def func(**kwargs):# kwargs 接收不存在的关键字参数pass# 调用不存在的关键字参数函数
func(name = '张三', age = 30, score = 70)
不存在的关键字参数包装成字典
def func(a,**kwargs):# kwargs 接收不存在的关键字参数 kwargs为字典类型name = kwargs['name']age = kwargs['age']# 调用不存在的关键字参数函数
func(name = '张三',age = 30,a=10,score=70)
传递元组/列表给可变参数args
可以传递元组、列表给可变参数args
,需要在元组/列表前加上*
进行解包操作
def fun(*args):print(sum(args))list=[1,2,3]
#fun(list)#error
fun(*list)
传递字典给可变参数kwargs
在字典的前面加上**的作用是将字典中的元素解包成一个一个的不存在的关键字参数传递给函数
def fun(**kwargs):print(kwargs)stu={"name":"张三","age":18
}fun(**stu)
组合使用
**kwargs
形参可以与 *args
形参组合使用(*args
必须在 **kwargs
前面), *args
形参接收一个元组。
例如,定义如下函数:
def milk_tea_shop(kind,*args,**kwargs):print(f"需要一杯{kind}")for item in args:print(f"{item}")for key in kwargs:print(f"{key}:{kwargs[key]}")#调用函数
milk_tea_shop("QQ咩咩好喝到爆的咩噗茶","加糖", "少冰", "加奶", "加珍珠",price="10元", address="北京市朝阳区望京SOHO",phone="010-12345678"
)
文件IO
文件I/O的基本流程
- 打开文件
- 文件读写
- 关闭文件
打开文件
使用open函数,可以打开一个已经存在的文件,或者创建一个新文件
f = open(文件名,访问模式)
文件名:文件的相对路径或者绝对路径
访问方式:文件的访问方式有读、写、追加
访问模式对应的功能如下:
功能 | r | r+ | w | w+ | a | a+ |
---|---|---|---|---|---|---|
读 | + | + | + | + | ||
写 | + | + | + | + | + | |
创建 | + | + | + | + | ||
覆盖 | + | + | ||||
指针在开始 | + | + | + | + | ||
指针在结尾 | + | + |
可以通过seek()
设置指针的位置
打开文件
f = open('a.txt')
如果没有传入打开模式,默认访问模式为r只读模式
关闭文件
读取或写出文件后,要使用close()
方法关闭文件
f.close()
注意:
一定要保证文件操作完之后要关闭掉,因为程序能打开的文件数量是有上限的,并且不关闭文件会造成内存泄漏
文件读取
read
read
方法读取,格式为:
f = open('a.txt', "r")
data = f.read(num) # 参数num: 默认-1,读取整个文件内容。可以指定num,读取num个数据
f.close()
读取整个文件内容
result = f.read()
读取5个数据
result = f.read(5)
file=open("./hello.txt") #内容为hello world
result=file.read(5)
print(result) #打印结果hello
file.close()
readline
readline
指的是读取一行
result = f.readline()
也可以指定读取一行的n
个字符的数据
result = f.readline(15)
readlines
readlines
指的是读取整个文件,返回每一行数据的列表
result = f.readlines()
file=open("./hello.txt",encoding="utf-8") #如果读取中文有乱码,注意修改对应的编码格式
result=file.readlines()
print(result)
#['hello world\n', '你好世界'] 返回的是列表
file.close()
文件写入
write
write
写入字符串到文件中
f = open('test.txt','w')
f.write('hello world')
f.close()
writelines
writelines
可以将容器中数据写入到文件中
lst = ['bill','gates','tom']
f = open('test.txt','w')
# 将列表中数据写入到文件中
f.writelines(lst) #billgatestom
f.close()
使用with
在处理文件对象时,最好使用 with
关键字。优点是,子句体结束后,文件会正确关闭,即便触发异常也可以。而且,使用 with
相比等效的 try-finally
代码块要简短得多:
# 读文件
with open('workfile.txt', encoding="utf-8") as f:read_data = f.read()with open('test.txt','w') as f:f.write('hello world')print(f.closed) # True
我们可以通过如下代码验证文件是否已经关闭:
f.closed
如果没有使用 with
关键字,则应调用 f.close()
关闭文件,即可释放文件占用的系统资源。
警告: 调用
f.write()
时,未使用with
关键字,或未调用f.close()
,即使程序正常退出,也 可能 导致f.write()
的参数没有完全写入磁盘。
通过 with
语句,或调用f.close()
关闭文件对象后,再次使用该文件对象将会出现异常。
练习:拷贝文件
import os
filename=input("请输入文件名:")
if os.path.exists(filename):dot_index=filename.rfind(".")prefix_index=filename[:dot_index] #hellosufix_index=filename[dot_index:] #.txtnew_filename=f"{prefix_index}[复制]{sufix_index}"with open(filename,"rb") as f: #rb是以字节读入with open(new_filename,"wb") as fr:line=f.readline()while line:fr.write(line)line=f.readline()
else:print("你输入的文件不存在")