函数

定义函数

定义函数使用def关键字,一般格式如下:

def 函数名(参数列表):
    """函数说明"""
    函数体
    return

规则:

  函数代码块以def关键字开头,后接函数标识名称和圆括号

  任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数

  函数的第一行语句可以选择性地使用文档字符串,用于存放函数说明

  函数内容以冒号起始,并且缩进

   return 结束函数,选择性的返回一个值给调用方。不写return相当于返回None

调用函数

函数的使用分为定义阶段与调用阶段,定义函数时只检测语法,不执行函数体代码,函数名加括号即调用函数,只有调用函数才会执行函数体代码

def printstr(str):
    print(str)
printstr("调用自定义函数")
printstr("再次调用printstr函数")

上面代码执行结果:

调用自定义函数
再次调用printstr函数

参数

函数的参数分为实际参数以及形式参数,简称实参和形参

实参即是在调用函数时,括号内传入的值,值可以使厂里、变量、表达式或三者的组合

形参则是在定义函数时,括号内声明的参数。形参本质就是一个变量名,用来接收传来的值。在调用有参函数时,实参会赋值给形参

参数的具体使用

位置参数

位置参数指的是按顺序定义的参数

在定义函数时,按照从左到右的顺序依次定义形参,称为位置形参,按照这种形式定义的形参必须被传值

在调用函数时,按照从左到右的顺序依次定义实参,称为位置实参,按照这种形式定义的实参会从按照左到右的顺序与形参一一对应

def register(name,age,sex):
    print("姓名:{} 年龄:{} 性别:{}".format(name,age,sex))
register("star",18,"male")
register(18,"male","star")

上面代码执行结果:

姓名:star 年龄:18 性别:male
姓名:18 年龄:male 性别:star

关键字参数

在调用函数时,实参可以是key=value的形式,称为关键字参数,凡是按照这种形式定义的实参,可以完全不按照从左到右的顺序定义,但仍能为指定的形参赋值

register(sex = "female", age = 18, name = "jj")

上面代码执行结果:

姓名:jj 年龄:18 性别:female

需要注意在调用函数时,实参也可以是按位置或按关键字的混合使用,但必须保证关键字参数在位置参数后面,且不可以对一个形参重复赋值

register("jj", sex = "female", age = 18)  # 正常调用
register(name = "jj", 18, sex = "female")  # 报错SyntaxError: positional argument follows keyword argument
register("jj", sex = "female", age = 18,name = "wx")  # 报错TypeError: register() got multiple values for argument 'name'

 默认参数

在定义函数时,就已经为形参赋值,这类形参称之为默认参数。当函数有多个参数时,需要将值经常改变的参数定义成位置参数,而将值改变较少的参数定义为默认参数

def register(name,age,sex = "male"):
    print("姓名:{} 年龄:{} 性别:{}".format(name,age,sex))
register("Star",23)

上面代码执行结果:

姓名:Star 年龄:23 性别:male

需要注意的是:

  默认参数必须在位置参数之后

  默认参数的值仅在函数定义阶段被赋值一次

  默认参数的值通常设为不可变类型

可变参数

当你调用函数时是参个数不确定时,这就需要用到可变参数

可变的位置参数

在最后一个形参名前加 * 号,那么在调用函数时,溢出的位置实参会以元组的形式保存下来赋值给该形参

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

上面代码执行结果:

1
2
(3, 4, 5, 6)

可变的关键字参数

在最后一个形参名前加 ** 号,那么在调用函数时,溢出的关键字参数会以字典的形式保存下来赋值给该形参

def func(x, y, **kwargs):
    print(x)
    print(y)
    print(kwargs)
func(x=1, y=2, z=3, a=4, b=5, c=6)

上面代码执行结果:

1
2
{'z': 3, 'a': 4, 'b': 5, 'c': 6}

命名关键字参数

Python3提供了一个语法:在定义形参时,用 * 号作为一个分隔符, * 号之后的形参称为命名关键字参数。对于这类函数,在调用函数时,必须按照key = balue的形式为其传值,且必须被传值

def func(x, y, *, z):
    pass
func(1, 2, z=3) #  正确调用
func(1, 2, 3) #  报错TypeError: func() takes 2 positional arguments but 3 were given
func(1, 2) #  报错TypeError: func() missing 1 required keyword-only argument: 'z'

命名关键字参数也可以有默认值,但需要强调的是他们不是默认参数,也不是位置参数,因为在 * 号后,所以都是命名关键字参数

另外,如果形参中已经有一个可变参数了,命名关键字参数就不再需要一个单独的 * 号作为分隔符号了

def register(name, age, *agrs, sex="male", height, weight):
    print("姓名:{} 年龄:{} 性别:{} Arg:{} 身高:{} 体重:{}".format(name, age, sex, agrs, height, weight))
register("Star", 23, 1,2,3,height="1.8m", weight="60kg")

上面代码执行结果:

姓名:Star 年龄:23 性别:male Arg:(1, 2, 3) 身高:1.8m 体重:60kg

 匿名函数

使用lambda关键字创建没有名字的函数,即匿名函数,匿名函数用于临时使用一次的场景

func = lambda x, y, z: x + y + z
# 等同于
# def func(x, y, z):
#     return x + y + z
res = func(1, 2, 3)

posted on 2020-06-01 15:31  MidSummer丶  阅读(138)  评论(0)    收藏  举报

导航