Python基础——函数
在Python的函数跟Java中的方法是一个概念,区别在于用法的不同。Python中自带了很多有用的函数, 可以在交互式命令行通过 help(函数名)
查看该函数的帮助信息
1 | >>> help(sum) |
Python中定义一个函数的格式如下
1 | def my_abs(x): |
首先是需要使用def
语句, 依次写出函数名、括号、括号中的参数和冒号:
,然后,在缩进块中编写函数体,函数的返回值用 return
语句返回。每个函数都要return
,如果没有的话,那么函数执行完毕后也会返回结果,只是结果为 None。
1 | >>> def s(x): |
多返回值
函数可以返回多个值,这看上去不合理,其实他返回的是一个tuple
类型,只是在语法上进行了省略。
1 | >>> def move(x,y): |
默认参数
函数的还可以设置默认参数,这个跟Kotlin语言中是一样,和Java中的方法的重载效果类似。
1 | def power(x, n=2): |
由于函数的参数按从左到右的顺序匹配,所以默认参数只能定义在必需参数的后面:
1 | # OK: |
可变参数
和Java中一样,函数的参数也可以定义为可变参数,也就是说可以接收任意个数的参数,Python中的原理是将传入的参数在内部转换成一个tuple
类型,然后再遍历出来,依次处理。
1 | //Java中的可变参数 |
1 | #Python中的可变参数 |
关键字参数
关键字参数跟可变参数类似,但是可以为每一个参数设置一个参数名。在内部方法会组装成一个dict
,我们就可以根据参数名来使用参数。他的申明方式就是在参数的前面加**
。
1 | def printSum(**kw): |
也可以直接用一个dict
作为参数传给函数,传入是要在变量名前面加上**
:
1 | 'a' = 3,'b' = 8} a = { |
注意:虽然没有明确规定,一般情况下关键字参数的参数都是用kw
。
在函数内部使用关键字参数时需要进行参数检查,这样可以保证参数的正确。
1 | def printSum(**kw): |
命名关键字参数
如上面所言,关键字参数,在函数内部使用时我们为了保证函数的正确性,必须要对它进行检查,但是我们并不知道函数调用时,会传入那些参数,因此我们要对参数名进行限制,这样就可以不必再去做过多检查。命名关键字声明时以*
作为分割,然后后面的参数就会被视为关键字参数的参数名:
1 | def printSum(*,a,b): |
如果函数包含有可变参数,那么*
就可以省略:
1 | def printSum(*arg,a,b): |
在调用的时候,命名关键字参数必须要指定参数名。否者会报错。
参数组合
Python中函数的参数形态非常灵活,我们可以进行组合使用,但是他的执行是有顺序的,依次为:固定参数,默认参数,可变参数,命名关键字参数,关键字参数。
1 | def printSum(a,b = 3,*args,c,**kw): |
还可以用一个tuple
和一个dict
,代替复杂的参数传入:
1 | >>> def printSum(a,b = 3,*args,c,**kw): |
不管你怎么传入他都会按照上面说的优先级进行赋值,所以对于任何参数我们都可以func(*args,**kw)
的方式调用。
小结
Python的函数具有非常灵活的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数。
默认参数一定要用不可变对象,如果是可变对象,程序运行时会有逻辑错误!因为函数在定义时默认参数就已经计算好了,每一次调用都是用的一个变量。
要注意定义可变参数和关键字参数的语法:
*args
是可变参数,args接收的是一个tuple
;
**kw
是关键字参数,kw接收的是一个dict
。
以及调用函数时如何传入可变参数和关键字参数的语法:
可变参数既可以直接传入:func(1, 2, 3)
,又可以先组装list
或tuple
,再通过*args
传入:func(*(1, 2, 3))
;
关键字参数既可以直接传入:func(a=1, b=2)
,又可以先组装dict
,再通过**kw
传入:func(**{'a': 1, 'b': 2})
。
使用*args
和**kw
是Python的习惯写法,当然也可以用其他参数名,但最好使用习惯用法。
命名的关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。
定义命名的关键字参数在没有可变参数的情况下不要忘了写分隔符*
,否则定义的将是位置参数。