初识函数
自定义函数:可以在任何需要它的地方调用
s = "测量字符串长度" def my_len(): #函数定义 i = 0 for k in s: i += 1 return i #写在return后面的叫:返回值 length = my_len() #函数调用 print(length)
return的作用:
- 一旦遇到return, 结束整个函数
- return和返回值之间要有空格, 可以返回多个任意数据类型的值
返回值的3种情况:
没有返回值: --> 返回None 没写return 只写return --> 结束一个函数的继续 return None #不常用 返回1个值: 可以返回任何数据类型 只要返回就可以接收到 如果在一个程序中有多个return, 那么只执行第一个 返回多个值: 用多个变量接收 --> 有多少返回值就用多少变量接收 用一个变量接收 --> 得到的是一个元组
函数的参数:
没有参数
定义函数和调用函数时括号里都不写内容
有一个参数
传什么就是什么
有多个参数
形参(接收时): 位置参数、默认参数
实参(传递时): 位置参数、关键字参数
def my_len(s): #()用来接收参数、这里的变量"s"被称为:形式参数(形参) i = 0 for k in s: i += 1 return i length = my_len("hello world") #这个过程叫:传递参数(传参)、这里的"hello world"被称为:实际参数(实参) print(length)
def my_sum(a,b): #a、b位置形参 print(a,b) res = a+b return res ret = my_sum(1,2) #1、2位置实参 print(ret)
def classmate(name, sex): #位置形参 print("%s : %s" % (name, sex)) classmate("ppd", "男") #位置实参 classmate(sex="男", name="ppd") #关键字实参
def classmate(name, sex="男"): #name位置形参, sex="男" 为默认形参,如果传了就用传的,否则用默认的 print("%s : %s" % (name, sex)) classmate("ppd") #位置实参 classmate("Lisa", sex="女") #Lisa位置实参, sex="女"关键字实参
站在形参的角度上:
位置参数:必须传,且有几个参数就传几个值
默认参数:可以不传,如果不传就是用默认的参数,如果传了就用传的
站在实参的角度上:
按照位置传参 # 1、2 按照关键字传参 # a=1、b=2 混着传参 # 可以,但是,必须先按照位置传参,再按照关键字传参数 --> 1、b=2 不能给同一个变量传多个值
定义函数的时候:先定义位置参数、再定义默认参数
# 位置参数 直接定义参数 # 默认参数/关键字参数 参数名 = "默认的值" # 动态参数 可以接受任意多个参数 参数名之前加*,习惯参数名args 参数名之前加**,习惯参数名kwargs # 动态参数有两种:可以接受任意个参数 *args 接收多个按照位置传参的值, 组织成一个元组 **kwargs 接收多个按照关键字传参的值, 组织成一个字典 # 接收参数顺序 位置参数,*args,默认参数,**kwargs(args必须在kwargs之前) 示例:
接收各种参数示例:
def func(name, *args, gender="女", **kwargs): print(name) # pd print(args) # (1, 'a') print(gender) # 男 print(kwargs) # {'weight': '60kg', 'height': 172} func("pd", 1, "a", gender="男", height=172, weight="60kg")
如果列表或字典作为实参,可以通过 *列表 或 **字典 按照顺序打散,然后传递过去:
def func1(*args): print(args) # (1, 2, 3) func1(*[1, 2, 3]) def func2(**kwargs): print(kwargs) # {'k1': 'v1', 'k2': 'v2'} func2(**{"k1": "v1", "k2": "v2"})
默认参数的陷阱:如果默认参数的值是一个可变数据类型,那么每一次调用函数的时候,如果这个默认参数没有接收到值,就共用这个数据类型的资源。
def func(k, dic={}): dic[k] = "v" print(dic) func(1) #{1: 'v'} func(2) #{1: 'v', 2: 'v'} func(3) #{1: 'v', 2: 'v', 3: 'v'}
def func(lis=[]): lis.append(1) print(lis) func() #[1] func() #[1, 1] func() #[1, 1, 1]
其他:
def func(): """这是一个完成XX功能的函数""" print(func.__name__) # 查看字符串格式的函数名 print(func.__doc__)