D09 函数(一) 返回值,参数
1.什么是函数
函数就是具有某个具体功能的工具,提升开发效率,减少代码重复,提升程序的扩展性
2 函数的定义和调用
用def来定义函数,函数在定义的时候只检测函数体语法,不执行函数体代码
def my_len(): # 定义函数,函数命名规则与变量命名规则一致
s = 'abcdefg'
i = 0
for k in s:
i += 1
print(i)
my_len() # 调用函数
3 函数的返回值
返回值是指函数在完成一件事情后,最后返回给调用者结果。函数的返回值用return语句完成
def my_len(): # 定义函数,函数命名规则与变量命名规则一致
s = 'abcdefg'
i = 0
for k in s:
i += 1
return i # 将 i 的值返回给调用者
print(my_len()) # 调用函数
返回值有3种情况 :1.没有返回值 或者返回None
- 不写return
- 只写return,用于结束函数的继续
- return None 不常用
2. 返回一个值,可以返回任意类型,只要返回就可以接收,如果在一个程序中有多个return,那么只执行第一个
3.返回多个值用多个变量接收,有多少返回值就用多少变量,一一对应,用一个变量接收,得到的是一个元组
def func():
return {'k':'v'}
print(func()) #{ 'k': 'v'}
def func2():
return 1,2,3 #return 1,2,3
r= func2()
print(r) # (1, 2, 3)
4 参数
参数分为实参与形参
形参:在函数的定义阶段 括号内写的变量名 叫做该函数的形式参数
实参:在函数的调用阶段 括号内实际传入的值 叫做实际参数
def add(a,b): # a,b 为形参,形式参数
return a+b
print(add(1,2)) # 1,2 实际参数,用来将值传到函数中
形参与实参的关系:
形参就相当于变量名,而实参就相当于变量的值
函数调用传参的过程 就是给形参变量名赋值的过程
注意:形参和实参的绑定关系只在函数的调用阶段有效,函数运行结束关系自动解除,只在函数内部有效 函数外部无任何影响
-
形参:有位置参数,默认参数,不定长参数
- 位置参数:直接定义参数,并且必须传,有几个参数就需要传几个值
def user_name(name, sex): print("%s : %s" % (name, sex)) user_name('张三','男') # 只能传递两个,多了会报错
- 默认值参数:也称为关键字参数。在函数的定义阶段,形参就已经被赋值了,可以不传参数,若不传则使用默认值,如果传则使用传递的参数
def user_name(name, sex='男'): print("%s : %s" % (name, sex)) user_name('张三') # 张三 : 男 没有传递,使用了默认的参数 user_name('李四', sex='女') # 李四 : 女 都传递,使用了传递的参数
- 不定长参数:用*和**来接收多余的(溢出的)位置参数和关键字参数
- 位置参数:直接定义参数,并且必须传,有几个参数就需要传几个值
1.*args : 形参角度:参数名前面加* 常用参数名*args ,接收的是按位置传的值,组成一个元组赋值给args
def func(*args): # 定义动态参数
print(args)
def add(*args): # 定义动态参数
sum = 0
for i in args:
sum += i
return sum
func(1,2,3) # (1, 2, 3) 以元组的形式
print(add(1,2,3)) # 6
print(add(1,2,3,4)) # 10
实参角度:会将列表或元组打散成位置实参一一传入
func(*[1,2,3,4,5,6]) # func(1,2,3,4,5,6)
2.**kwargs: 形参角度:参数名前加两个* 常用参数名**kwargs ,接收的是按关键字传的值,组成一个字典,字典的key就是关键字的名字,字典的value就是关键字的名字指向的值
def func(**kwargs): # 定义动态参数
print(kwargs)
func(a=111,b=122,c=133) # {'a': 111, 'b': 122, 'c': 133} 以字典的形式返回
实参角度:能将字典打散成key = value的形式 按照关键字参数传递给函数
def func(x,y,z): print(x,y,z) d = {'x':1,'y':2,'z':333} func(**d) # 相当于func(x=1,y=2,z=333)
定义顺序: 位置参数,*args ,默认参数,**kwargs
def func(a, *args, b=1, **kwargs): # 定义动态参数
print(a, args, b, kwargs)
func(1,2,3,4,b=6,c=1,d=2,e=3) # 1 (2, 3, 4) 6 {'c': 1, 'd': 2, 'e': 3} 以对应的位置传输。否则会报错
-
实参的位置,形式,顺序必须与形参一一对应,不能给一个变量传多个值