函数
day8
1.为什么需要函数
1)代码的组织结构不清晰,可读性差
2)需要重复使用某个功能时,需要重新编写成程序,重复率高
3)多处引用相同代码时,需要扩展功能的时候过于麻烦,工作量大
2.函数的定义
函数,类似于将某些特定的功能的代码打包起来,当需要用的时候直接拿来用,避免重新定义或者编写,例如Python内置的很多方法就是一个个已经打包好的函数,需要的时候直接拿来用,无序自己再打包定义一次
3.函数的分类
如上描述的,Python中内置存在的函数称为内置函数,而我们在编写程序的过程中,出于自身 的需求自己定义的函数称为自定义函数
4.函数的使用
遵循规则:先定义再调用
1)实现
# 语法 # 函数名应该尽可能的体现函数实现的功能 def 函数名(参数1,参数2....): ‘‘‘ 注释,描述函数的功能 ‘‘‘ 函数体 return 返回值
# 函数定义举例
# 定义 def max(x,y): ‘‘‘ 比较两个数的大小 ‘‘‘ if x > y: print(x) else: print(y) return x # 调用 max(10,20)
注意:
函数即‘变量’,在调用之前必须先定义,再调用,否者会报错
2)定义函数的三种形式
a.无参函数
def func(): print(‘我只是个简单的函数....‘)
b.有参函数
如上定义的比较两个数大小的函数,调用时必须传入参数,否则报错
c.空函数
无任何实际执行函数体的函数
def func(): pass
3)函数的调用
a.函数调用的名字
b.根据名字调用代码,调用时函数名后必须加括号,且有参数时必须传入参数
4)函数的返回值
可返回多个值,且返回类型不限,如不写默认返回None
什么时候该有返回值?
调用函数,经过一系列的操作,最后要拿到一个明确的结果,则必须要有返回值
通常有参函数需要有返回值,输入参数,经过计算,得到一个最终的结果
什么时候不需要有返回值?
调用函数,仅仅只是执行一系列的操作,最后不需要得到什么结果,则无需有返回值
通常无参函数不需要有返回值
5)函数调用的三种形式
a.语句形式 func()
b.表达式形式 4*len(ditc)
c.用函数作为另一个函数的传入参数 func(max(10,1))
day8练习:
1)写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成批量修改操作
def change_txt(file,old_data,new_data): with open(r‘%s‘ %file,‘rt‘,encoding=‘utf-8‘) as f_1: data = f_1.read() data = data.replace(old_data,new_data) with open(r‘%s‘ %file,‘wt‘,encoding=‘utf-8‘) as f_2: f_2.write(data) file = input(‘输入要修改的文件名>>‘).strip() data_1 = input(‘要修改的内容>>‘).strip() data_2 = input(‘修改后的内容>>‘).strip() change_txt(file,data_1,data_2)
2)写函数,计算传入字符串中数字、字母、空格以及其他的个数
def count(msg): num_count = 0 letter_count = 0 blank_count = 0 other = 0 for i in msg: if i.isdigit():num_count += 1 elif i.isalpha():letter_count += 1 elif i.isspace():blank_count += 1 else:other += 1 print(‘数字个数:%s‘ % num_count) print(‘字母个数:%s‘ % letter_count) print(‘空格个数:%s‘ % blank_count) print(‘其他:%s‘ % other) msg_inp = input(‘输入字符串>>‘) print(len(msg_inp)) count(msg_inp)
day9
1.函数的参数
分为两大类:形参和实参
1)形参:即便变量名,定义函数时括号内的变量即为形参
2)实参:即变量值,调用函数时绑定在变量名上,函数结束后解除绑定
2.参数应用
根据调用的方式又可分为几大类:
1)位置参数:括号内从左到右,按顺序一一对应
def func(x,y,z): print(x,y,z) # 对应于xyz分别为1、55、22 func(1,55,22)
2)关键字参数:key=value形式
def func(x,y,z): print(x,y,z) # xyz的位置不固定 func(x=1,z=55,y=22)
3)默认参数:在函数定义时赋予值,调用时如无重新传入的值则默认值不变
def func(x,y,z=33): print(x,y,z) # 默认值不变 func(x=1,y=22)
4)可变长参数
指传入参数的个数不固定,而实参有按位置和按关键字的两种形式定义,针对这两种形式的可变长,形参对应有两种方法解决:*args和**kwargs
*args
a.*会将溢出的!!!位置实参!!!全部接收,然后保存成元组的形式赋值给args
def func(x,y,z,*args): print(x,y,z) print(args) func(1,2,3,4,[1,2,2,5,],{‘name‘:‘zhang‘})
b.一旦实参前有* ,则把形参打散成多个参数
def func(x,y,z): print(x,y,z) func(*[1,2,2]) # *[] 把列表内的元组打散成三个参数 # func(*[1,2,2,‘ss‘]) # 报错,打散后为四个参数,原函数只有三个形参 # func(*[1,2,]) # 报错
**kwargs
a.**会将溢出的!!!关键字实参!!!全部接收,然后保存成字典的形式赋值给kwargs
def func(x,y,z,**kwargs): print(x,y,z) print(kwargs) func(x=‘a‘,y=‘z‘,z=‘sss‘,ss=4444,sss=888)
b.一旦碰到实参前加**,就把该实参的值打散
def func(x,y,z,**kwargs): print(x,y,z) print(kwargs) func(1,2,3,**{‘name‘:‘zhang‘,‘age‘:18})
混合使用
# 位置式参数以元组形式赋值给args # 关键字参数以字典形式赋值给kwargs def wapper(*args,**kwargs): print(args) print(kwargs) wapper(12,12,545,488,66,a=555,sss=555)
注意:
*args针对的位置实参,**kwargs针对的关键字实参