python3——函数
常用函数举例
#help()函数接收一个函数名,接着会打印函数声明(定义) help(print) #print()用来打印内容 print("hello world") # hello world #len()用来统计字符串的字符数(注意不是字节数),或者统计list、tuple、set、dict的元素个数 print(len("你好")) # 2 #round()用来指定保留一个浮点数中小数点后几位 print(round(1.23456, 3)) # 1.235 #abs()返回一个数字的绝对值 print(abs(-1234.567)) # 1234.567
查看内置函数的声明
使用help(def)即可,在命令行中或者在代码中执行,比如查看print()函数的使用方法,那么就可以执行help(print),注意要查询的函数名不加括号:
>>> help(print) Help on built-in function print in module builtins: print(...) print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False) Prints the values to a stream, or to sys.stdout by default. Optional keyword arguments: file: a file-like object (stream); defaults to the current sys.stdout. sep: string inserted between values, default a space. end: string appended after the last value, default a newline. flush: whether to forcibly flush the stream.
如果执行help(print()),那么就会首先执行print(),打印一个空字符串,最终,执行的是help(""),查看的就不是print的声明了。
定义函数的基本格式
def funcname(parameter_list): pass
注意:
1、定义函数时,parameter_list(参数列表——形参)如果没有时,可以省略。
2、函数体中可以有return返回结果,当然也可以不返回(省略return),省略return时,默认返回值是None。
3、函数要先定义,再调用;如果函数定义在调用的后面,那么就会报错。
形参
形参就是我们在定义函数时,定义函数需要接收的参数。比如下面这个函数,用来求长方体的体积,接收3个参数:width,length,height。
def getVolume(length, width, height): data = { "length" : length, "width" : width, "height" : height, "volume" : length * width * height } print(data) getVolume(5, 6, 7) # {'length': 5, 'width': 6, 'height': 7, 'volume': 210}
注意,上面这段代码中,我们在调用getVolume函数的时候,传递的三个参数5,6,7会按照函数定义时的顺序,分别赋值给length,width,height。
但是,有时候,我们会忘记定义getVolume函数时参数的顺序,这个时候,想要准确无误的调用函数,并且求得结果,要么查看函数定义,要么使用关键字参数。注意,虽然在这个函数中,三个参数的顺序颠倒是没有太大的问题的,但是,如果是一个比较复杂的函数,参数的顺序(也就决定了每一个参数的值)非常重要,决定了函数能否正常处理问题。
关键字参数
关键字参数,并不是在定义的时候指定,而是在调用函数的时候指定传递给函数,这样的话,可以不用遵循定义函数的形参列表顺序,而是可以自己指定顺序,但是注意参数的个数仍旧要符合函数定义时的参数个数。
以上面getVolume函数为例,不修改函数定义,在调用的时候使用关键字参数。
def getVolume(length, width, height): data = { "length" : length, "width" : width, "height" : height, "volume" : length * width * height } print(data) # 默认的调用方式 getVolume(5, 6, 7) # {'length': 5, 'width': 6, 'height': 7, 'volume': 210} # 这里虽然使用了关键字参数,但是关键字参数的顺序和定义函数时的顺序相同 # 所以等价于上面默认的调用方式 getVolume(length=5, width=6, height=7) # {'length': 5, 'width': 6, 'height': 7, 'volume': 210} # 注意,这里的关键字参数顺序和定义函数时的参数顺序不同 # 但是对应的参数值却是正确的 getVolume(width=5, height=6, length=7) # {'length': 7, 'width': 5, 'height': 6, 'volume': 210} # 可以先传入一个参数,该参数会默认赋值给定义函数时的第一个参数 # 之后可以再使用关键字参数 getVolume(5, height=6, width=7) # {'length': 5, 'width': 7, 'height': 6, 'volume': 210} # 注意,下面这种做法是错误的 # 规则:在关键字参数后面的所有参数,都必须是关键字参数 # getVolume(5, height=6, 7)
使用关键字参数,需要注意两点:
1、再次强调一下,关键字参数,只是在调用的时候有区别,在定义的时候不需要做任何改变。
2、在调用时,如果出现了关键字参数,那么之后的参数也必须是关键字参数。这一点,可以看上面这个代码最后一个错误调用。
指定函数默认参数
仍旧以上面的getVolume为例,假设,我们在定义函数的时候,为height设置一个默认值,该默认值的作用:
1、如果在调用函数时传入了height值,那么传入的值就会替换掉默认值。
2、如果在调用函数时没有传入height(只传入了length和width),那么就是用默认的height值。
指定函数默认值,是在函数定义时进行操作。
# 参数height的默认值为9 def getWeight(length, width, height, density=2): data = { "length" : length, "width" : width, "height" : height, "density": density, "wight" : length * width * height * density } print(data) # 传递4个参数(也就是说传入了density值,会忽略掉density的默认值) getWeight(5, 6, 7, 4) # {'length': 5, 'width': 6, 'height': 7, 'density': 4, 'wight': 840} # 传递3个参数(也就是说没有传入density值,那么就会使用density的默认值) getWeight(5, 6, 7) # {'length': 5, 'width': 6, 'height': 7, 'density': 2, 'wight': 420} # 同样也可以在这里使用关键字参数 getWeight(density=3, height=5, width=6, length=7) # {'length': 5, 'width': 6, 'height': 7, 'density': 4, 'wight': 840} getWeight(height=5, width=6, length=7) # {'length': 5, 'width': 6, 'height': 7, 'density': 2, 'wight': 420}
定义函数使用默认参数值时,需要注意:从左往右开始,遇到的第一个有默认值的参数,之后,每一个参数都必须有默认值。
实例:如果定义函数时,如果有A,B,C,D四个参数(顺序也是这样排列),如果C是第一个有默认值的参数,那么D也必须有默认值,如果D没有默认值,就会出错,而A和B没有默认值,不会出错。 如果想要C有默认值,D不设默认值,可以将C和D交换顺序,比如A,B,D,C,这样C有默认值,D没默认值,但是不会出错。
程序可以表示如下:
# 正确 def getWeight(length, width, height=4, density=2): pass # 错误 def getWeight(length, width, height=4, density): pass
可变参数
有些时候,我们不确定调用函数时,传入的参数,比如有一个求和函数sum(),功能就是求和,可以接受任意多个参数,假设有100个,那么在定义sum函数时,写100个形参,这是不现实的。python提供了一种方式:可变参数。
可变参数的形式很特别,*args,args只是大家通用的名称,也可以换为其他名称,比如命名为*params,*args或者*param表示可变参数,类型是一个tuple。
def multi_args(*args): print(type(args)) print(args) multi_args(9,8,7,6,5,4,3,2,1) # <class 'tuple'> # (9, 8, 7, 6, 5, 4, 3, 2, 1)