1.上节内容补充
文件的删除和修改:
#文件的删除和修改 #文件中全部都要修改 # with open('歌词',encoding='utf-8') as f1,open('歌词.bak','w',encoding='utf-8') as f2: # for line in f1: # new_line = line.replace('呢','呀') # f2.write(new_line) # import os # os.remove('歌词') # os.rename('歌词.bak','歌词') #第二种 某一行要修改 比如第一个出现呢的行 with open('歌词',encoding='utf-8') as f1,open('歌词.bak','w',encoding='utf-8') as f2: flag = True # count = 0 for line in f1: if '呀' in line and flag: # if '呀' in line and coun==0 new_line = line.replace('呀','呢') f2.write(new_line) flag = False # count+=1 else: f2.write(line) import os # 文件的删除接触windows系统的删除 用到了模块 os.remove('歌词') os.rename('歌词.bak','歌词')
文件操作with 体的使用可避免忘记f.close
with open('a.txt','w') as f: pass with open('a.txt','r') as read_f,open('b.txt','w') as write_f: data=read_f.read() write_f.write(data)
二、初始函数
为什么要使用函数
#1、代码的组织结构不清晰,可读性差 #2、遇到重复的功能只能重复编写实现代码,代码冗余 #3、功能需要扩展时,需要找出所有实现该功能的地方修改之,无法统一管理且维护难度极大
#什么是函数:
很明显内置函数所能提供的功能是有限的,这就需要我们自己根据需求,事先定制好我们自己的函数来实现某种功能,以后,在遇到应用场景时,调用自定义的函数即可。
#函数的格式:
def 关键词开头,空格之后接函数名称和圆括号(),最后还有一个":"。
def 是固定的,不能变,必须是连续的def三个字母,不能分开。。。它们要相亲相爱的在一起。
空格 为了将def关键字和函数名分开,必须空(四声),当然你可以空2格、3格或者你想空多少都行,但正常人还是空1格。
函数名:函数名只能包含字符串、下划线和数字且不能以数字开头。虽然函数名可以随便起,但我们给函数起名字还是要尽量简短,并能表达函数功能
括号:是必须加的,先别问为啥要有括号,总之加上括号就对了!
注释:每一个函数都应该对功能和参数进行相应的说明,应该写在函数下面第一行。以增强代码的可读性。
调用:就是 函数名() 要记得加上括号,好么好么好么
例如:
def hell(): print('hell,word!) hell() #hell,word!
函数的返回值
#返回值: # 没有返回值: # 不写return == return None # 只写一个return == return None # return的作用:1.返回一个值 2.终止一个函数的继续 # 返回一个值: 可以返回任意的数据类型。返回什么 就接受什么 # 返回多个值: # 用一个变量接收返回值,接收到的是一个元组 # 返回值有多个变量接收,那么返回值的个数应该和接收变量的个数完全一致 def f1(): return 1,2,3,4 l = f1() print(l) # (1, 2, 3, 4) a,b,c,d = f1() print(a) #1 print(b) #2 print(c) #3 print(d) #4
参数 形参》》位置参数,关键字参数(默认函数) 》》实参 按位置传,按关键字传
# 参数 # 形参和实参 # 传参数可以传任意的数据类型,并且传什么,接受什么 # 站在传参数的角度上看问题:一共有两种传参的方式 # 第一种:按照位置传参数 # 第二种:按照关键字传参数 # def f(para): # print(para) # # f(para = 1) #传多个参数:多个参数分别可以使用任意数据类型 def f2(arg1,arg2,arg3): #站在接受、形参的角度上:位置参数 print(arg1) print(arg2,arg3) #f2('abc',arg1 = [1,23]) #报错 已经传过了 #f2('abc',arg2 = [1,23]) # 报错,缺少一个参数 f2(arg3 = 1,arg2 = 2,arg1 = 3)#如果第一个实参是关键字那么后边的参数必须都是关键字 #按照关键字传参数和按照位置传参数是可以混用的 #但是,首先传按位置的,再传按关键字的 #按照位置传完该接受的参数只能接受一个值,不接受或者重复接收都不想 #形参 #位置参数 #数量必须与实参数量一致 ==> 必须传的参数 def classmate(name,sex='男'): print('姓名:%s,性别%s'%(name,sex)) classmate('尤悦') classmate('曹超') classmate('张建超') classmate('晓梅','女') #默认参数: #默认参数 是可以不传的参数 #在不传参数的情况下可以使用默认的值 #如果传了,就会使用传的值
def foo(x, y, *args, a=1, b, **kwargs): print(x, y) print(args) print(a) print(b) print(kwargs) foo(1, 2, 3, 4, 5, b=3, c=4, d=5) # 结果: # 1 # 2 # (3, 4, 5) # 1 # 3 # {'c': 4, 'd': 5}
默认参数的魔性用法 (默认参数一般都要选择不变的值)
# #魔性的用法:默认参数尽量避免使用可变数据类型 # def func(l = []): # l.append(1) # print(l) # func() #[1] # func() #[1,1] lst = [] def func(l = lst): l.append(1) print(l) func([]) #[1] func([]) #[1] 用[]传参,就会重新赋值 #我们可以用None这个不变对象来实现: def add_end(L=None): if L is None: L = [] L.append('END') return L