特殊参数与文件IO

特殊参数

默认值参数

  • 形参设定默认值 称为 **默认参数。**调用函数时,可以使用比定义时更少的参数。
  • 调用函数时,如果没有传入默认参数对应的实参,则实参使用默认值
  • 默认参数在调用的时候可以不传递,也可以传递
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 = 0
    for ele in args:
        result += ele
    return 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(文件名,访问模式)
文件名:文件的相对路径或者绝对路径
访问方式:文件的访问方式有读、写、追加

访问模式对应的功能如下:

功能rr+ww+aa+
++++
+++++
创建++++
覆盖++
指针在开始++++
指针在结尾++

可以通过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] #hello
 sufix_index=filename[dot_index:]  #.txt
 new_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("你输入的文件不存在")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值