函数

一.函数简介

函数必须先声明再调用(函数名+括号)。

函数包括四部分

       1. 函数名:使用该函数的依据 (函数名的命名规则跟变量名一模一样)

       2. 函数体:完成功能的代码块(函数体代码定义截断只检测语法 不执行代码)

       3. 返回值:功能完成的反馈结果

       4. 参数:完成功能需要的条件信息

def my_max(x,y) :
    if x > y :
        return x
    else :return y


print(my_max(my_max(3,2),1))
View Code

二.函数返回值

不写return ,只写return和return None时返回值都为None

def my_print (l):
    print(l)

res = my_print("adafFDASFCAa")
print(res)
View Code

return 返回单个值:这个值可以是python任意数据类型

def my_print (l):

    return {
        "1" : "stevin"
    }

res = my_print("adafFDASFCAa")
print(res)
View Code

return 返回多个值:return会自动将多个值以元组的形式返回给调用者(函数不喜欢自己的返回的结果被修改)

def my_print ():
    return {'name':'jason'},{'username':'tank'},{'user_name':'egon'}

res = my_print()
print(res)
View Code

         返回多个值 如果不想返回元祖  可以自己手动加上想要返回的数据类型符号(字典除外)

def my_print ():
    return [[1,2,3,4],[1,2,3,4],[1,2,34]]
res = my_print()
print(res)
View Code

return的作用:return除了可以返回值之外 还可以直接结束整个函数的运行

def my_print (l):
    
    return 
    print(l)

my_print("adafFDASFCAa") # 永远不会打印字符串
View Code

三.函数参数

函数参数分为形参和实参

形参:在函数的定义阶段 括号内写的变量名 叫做该函数的形式参数 简称 形参

实参:在函数的调用阶段 括号内实际传入的值 叫做实际参数 简称 实参

形参与实参的关系 :

形参就相当于变量名,而实参就相当于变量的值
函数调用传参的过程 就是给形参变量名赋值的过程

注意:形参和实参的绑定关系只在函数的调用阶段有效,函数运行结束关系自动解除
只在函数内部有效 函数外部无任何影响

1.位置参数

位置形参:在定义函数阶段按照从左到右的顺序依次定义的形参

位置实参:在调用函数阶段按照从左到右的顺序依次传入的值

def my_max(x,y):
    print(x,y)
    if x > y:
        return x
    else:
        return y


res = my_max(20,10) # 在调用函数的时候 必须被传值少一个实参不行多一个实参也不行   传入的参数会按照位置一一对应给形参
View Code

2.关键字参数

关键字实参:在调用函数阶段,按照key=value的形式指名道姓地为形参传值

可以打乱顺序,以指名道姓的方式为指定的形参传值
可以混合使用位置实参与关键字实参,但是位置实参必须放到关键字实参前面,并且不能对一个形参重复赋值

def my_max(x,y):
    print(x,y)
    if x > y:
        return x
    else:
        return y

my_max(10,y=20)  # 关键字传参
View Code

3.默认值参数

默认值参数:在函数的定义阶段,形参(变量名)就已经被赋值了

在调用的时候可以不为默认值形参传值,默认使用定义阶段就已经绑定的值
在调用的时候如果可以给默认值形参传值 传了那么就使用你传的值
在定义阶段 默认值形参必须放在位置形参的后面

def my_max(x,y = 200):
    print(x,y)
    if x > y:
        return x
    else:
        return y

res = my_max(200) # 默认参数
View Code

4.可变长参数

而实参的定义方式无法两种:位置实参,关键字实参,对应着形参也必须有两种解决方案*与**,类分别应对溢出的位置实参与关键字实参

1. 在形参中带*:会将调用函数时溢出位置实参保存成元组的形式,然后赋值*后的变量名

def func(x,y,*z):
    print(x,y,z)  
func(1,2,3,4,5,6,)
View Code

 2. 在实参中带*: 但凡在实参中带*星的,在传值前都先将其打散成位置实参,再进行赋值

def func(x,y,z,a,b):
    print(x,y,z,a,b)

func(*[1,2,3,4,5])  # *在形参中只能接收多余的位置实参 不能接收关键字实参
View Code

3. 在形参中带**:会将调用函数时溢出关键字实参保存成字典的形式,然后赋值**后的变量名

def func(x,y,**z):
    print(x,y,z)
func(1,2,z=1,a=1,b=2,c=3)
View Code

4. 在实参中带**: 但凡在实参中带**星的,在传值前都先将其打散成关键字实参,再进行赋值

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)
View Code

总结 * 与 **
*在形参中能够接受多余的位置参数 组织成一个元祖赋值给*后面的变量名
**在形参中能够接受多余的关键字参数 组织成一个字典赋值给**后面的变量名

*:在实参中 *能够将列表 元祖 集合 字符串 打散成位置实参的形式传递给函数
(*就看成是for循环取值)
**:在实参中 能将字典打散成key = value的形式 按照关键字参数传递给函数

规范: 在形参中带*与**的,*后的变量名应该为args,**后跟的变量名应该时kwargs

原文地址:https://www.cnblogs.com/Cpsyche/p/11160772.html