函数
定义函数
定义函数使用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) 收藏 举报
浙公网安备 33010602011771号