一、函数的返回值
关键词:return
def demo():
print(111)
return 1,2,3 # 代码走到这里就会立刻结束。哪怕下面还有函数体代码
print(222)
'''
1.每一个函数不是必须需要有返回值,可有可无
2.当函数中没有return关键字,那么函数返回的就是None
3.只有是return关键字后面的数据才是函数的返回值
4.一个函数有且只能有一个return关键字,函数体代码只有遇到return
才会被直接结束
5.return后面可以返回多个值,逗号隔开,以元组的形式返回
'''
1.函数体代码没有return关键字,默认返回None
def demo():
print('I AM King!') # 函数体代码
rel = demo() # 优先运行函数体代码 在把函数demo赋值给rel
print(rel) #没有return关键字,返回None
2.函数体代码有return关键字,但是没有写数据,返回None
def demo():
print('I AM GOD!') # 函数体代码
return # 有return,但是没有写数据 返回None
rel = demo() # 优先运行函数体代码 在把函数demo赋值给rel
print(rel) # 有return关键字,但是无数据。返回None
3.函数体代码有return关键字,也有后面的数据,后面写什么就返回什么(如果是数据值则直接返回 如果是变量则需要找到对应的数据值返回)
def demo():
print('I AM') #函数体代码
return 123 # 有return关键字,也有数据。返回123
rel = demo() #优先运行函数体代码,后把demo函数赋值给rel
print(rel) # 返回123
4.函数体代码有return关键字且后面写了多个数据,用逗号隔开,则组成元组返回
def demo():
print('I AM')
return 1,2,3,4
rel = demo()
print(rel) # (1,2,3,4)
二、函数的参数
1.函数参数的两大类
函数的参数分为形式参数和实际参数,简称形参和实参:
形式参数:函数在
定义阶段
括号中定义的变量名
就是形式参数,简称形参
形参本质就是一个变量名,用来接收外部传来的值。
def demo(a,b): # a,b就是形参
pass
实际参数:函数在
调用阶段
括号中写的变量值
就是实际参数,简称实参
实参可以是常量、变量、表达式或者三者的组合。
def demo(a,b)
pass
demo(1,2) # 1,2就是实参
形参和实参的关系:
简单理解为把形参名=实参值--------->变量名=变量值的形式来看
形参和实参是在函数调用阶段临时绑定,函数调用结束的时候,两者断开
函数传参形参其实只有一种情况:变量名
但是实参有好几种形式:变量名、变量值、函数的返回值等。本质还是变量值
2.位置参数
位置即顺序,位置参数指的是按顺序定义的参数,需要从两个角度去看
1.在函数定义阶段时,按照从左到右的顺序依次定义形参,称为位置形参
def demo(a,b): # a,b就是位置形参
pass
2.在函数调用阶段时,按照从左到右的顺序依次定义实参,称为位置实参
def demo(a,b):
pass
demo(1,2) # 1,2就是位置实参
'''位置参数的特点:形参和实参是一一对应'''
3.关键字参数
在调用函数时,实参可以是key=value的形式,称为关键字参数,凡是按照这种形式定义的实参,可以完全不按照从左到右的顺序定义,但仍能为指定的形参赋值。
需要注意在调用函数时,实参也可以是按位置或按关键字的混合使用,但必须保证关键字参数在位置参数后面,且不可以对一个形参重复赋值
关键字实参
在函数调用阶段括号内以什么等于什么的形式传值称之为关键字实参
1.指名道姓的给形参传值(打破了位置的限制)
2.位置实参必须在关键字实参的前面
小诀窍:无论是形参还是实参 都遵循的短的(简单)在前面 长的(复杂)在后面
3.同一个形参在一次调用中只能传一次值
调用函数:
def demo(a,b):
print(a,b)
demo(1,2) 一一对应传递
demo(1,2,3) 不可以 不是一一对应。故报错
demo(a=1 , b=2) 知名道姓的传递
demo(1 , b=2) 可以 位置参数不能够放在关键字参数后面
demo(b=2 , 1) 不可以 位置参数不能放在关键字后面。故报错
'''位置参数不能够放在关键字参数后面,越短的越靠前'''
关键字实参:可以打破按照顺序传递参数的规则
特点:严格按照变量名=变量值的形式一一传递
4.默认参数
在函数定义阶段括号内以什么等于什么的形式填写的形参称之为默认值形参
定义:
在函数定义阶段已经给形参赋予了变量值
1.如果你在函数定义的时候,给形参赋予值之后,调用函数的时候,
实参如果没有给,就使用默认的。
2.如果你在函数调用的时候,给了值,那就使用你给的值,不在使用默认的
3.还需要遵循前面总结的规律(短的在左边,复杂的在右边)
def demo(a = 10, b = 20):
print(a,b)
demo() # 没给值,使用默认值
demo(1) # 按照顺序从左到右,只给了一个值,第二个值还是使用默认
demo(2,20) # 两个都给了值,那就不使用默认的
小习题:
1.写一个注册用户的函数
def register(name,age,gender='male'):
print('name:%s,age:%s,gender:%s' % (name,age,gender))
register('chen',18) # name:chen,age:18,gender:male
register('tom',19) # name:tom,age:19,gender:male
register('jason',20,'female') #name:jason,age:20,gender:female
2.当默认值是列表的时候,哪么,当多次被调用的时候,多个值会指向同一个固定的地址
def demo(name,age,gender,hobby=[]):
hobby.append(gender)
print(hobby)
print('name:%s,age:%s,gender:%s,hobby:%s' % (name,age,gender,hobby))
demo('chen',18,'male') # name:chen,age:18,gender:male,hobby:['male']
demo('tom',19,'female') # name:tom,age:19,gender:female,hobby:['male', 'female']
demo('jason',20,'male')# name:jason,age:20,gender:male,hobby:['male', 'female', 'male']
3.
"""
1. 函数在定义阶段,给的默认值直接就定死了,后续不会在改变
2. 根据变量名和变量值在内存中得关系来理解
"""
m = 200
def hank(a,b,c = m):
print(a,b,c) # 1 2 200
m = 400
hank(1,2)
5.可变长参数
可变长参数可以打破形参与实参的个数限制,随意传参
接收多余的位置参数并组织成字典的形式赋值给*后面的变量
def demo(**z):
print(z)
demo(name = 'chen',age=19)
demo(name='tom',age=18,gender='male')
1.无论我传入多少个位置参数,函数都能够正常的被调用?
'''
*号在形参中使用:它会接收多余的位置参数,
然后组成元组的形式赋值给*号后面的变量名
'''
def demo(x,y,z,m,n,*a):
print(x,y,z,m,n,a) #1 2 3 4 5 (6, 7, 8, 9, 10, 11)
demo(1,2,3,4,5,6,7,8,9,10,11)
2.无论我们传入多少个关键字参数,函数都能够正常的被调用?
'''
**号在形参中使用,它会接受多余的关键字参数,
然后组成字典的形式赋值给**号后面的变量名
'''
def demo(x,y,z,**a):
print(a) # {'c': 5, 'h': 7, 'k': 8}
print(x,y,z,a) # 1 2 3 {'c': 5, 'h': 7, 'k': 8}
demo(x=1,y=2,z=3,c=5,h=7,k=8)
3.无论我传入多少个位置参数和关键字参数,函数都能够被正常调用
def demo(x,y,m=1,n=2,*args,**kwargs):
print(args) # (7, 8)
print(kwargs) # {'l': 20, 'a': 10, 'c': 100, 'b': 3}
demo(1,2,3,4,7,8,l=20,a = 10,c=100,b=3)
4.在可变长参数中(*和**号)在实参中的使用
'''位置参数'''
def demo(*args):
print(args) # (1, 2, 3, 4, 5, 6)
ll=[1,2,3,4,5,6]
demo(*ll)
'''关键字参数'''
**号在实参中得使用:会把字典打散成关键字的形式当成实参传递
def demo(**kwargs):
print(kwargs)
#{'name': 'chen', 'age': 18, 'gender': 'male', 'salary': 2000}
d={'name':'chen','age':18,'gender':'male','salary':2000}
demo(**d)
'''补充:
*和**号后面的变量可以随便叫
但是在Python中,推荐使用*args **kwargs
args:arguments 位置参数
kwargs:keywords arguments 关键字参数
'''
6.命名关键字参数
# 1. 别人这么写了,你要看懂
# 2. 在源码中会出现这种写法,你看得懂即可
'''
命名关键字传参:在形参中会出现*的用法,如果出现在*号后面的形参,
那么实参传递的时候,必须以关键字的形式传递
'''
def register(name,age,*,sex,height,salary): #sex,height为命名关键字参数
pass
# register('kevin', 10, 'male', 1.9)
register('kevin', 10, sex='male', height=1.9, salary=2000)