函数

函数定义

在Python中定义函数为,def 函数名(参数):然后,在缩进块中编写函数体,函数的返回值用return语句返回。
如果没有return语句,函数执行完毕后也会返回结果,只是结果为None。return None可以简写为return。

空函数

1
2
def nop():
pass

在这里pass作为占位符,表示跳过,也可以用在if的缩进块。

参数限制

1
2
if not isinstance(x, (int, float)):
raise TypeError('bad operand type')

实际上参数限制就是定义一个报错,isinstance()判断数据类型,如果不是就提出一个错误。
作为一个弱类型语言,定义这一步是很有必要的,有助于读懂代码。

返回值

Python允许返回多个值,其返回的实际上是一个tuple元组,但是也可以用两个变量接收。

参数定义

在Python中函数参数的定义也比较灵活,提供位置参数、默认参数、可变参数、关键字(key)参数等

位置参数

位置参数指的是参数在传入时,实参和形参有着严格的位置对应关系,为常用参数形式。

默认参数

默认参数是指在位置参数的基础上为其添加默认值,有默认值的参数为默认参数,没有默认值的参数为必选参数
基本定义形式如下:

1
2
3
def my_def(a,b=1):
a=b+1
return

需要注意的是:

  • 默认参数必须在必选参数后边,否则会无法辨认是否输入必选参数,从而报错。
  • 默认参数的默认值一定是不变对象,由于Python中的变量定义为指针指向,会导致可变对象值发生变化

不可变对象有:数值类型、字符串、tuple元组、None等

可变参数

可变参数指的是参数的数目不固定,定义形式:

1
2
3
4
5
def my_function(*v):
sum = 0
for vi in v:
sum+=vi
return sum

在可变参数中传入的所有参数将作为一个tuple被接收,该tuple的变量名为函数在定义时的形参名,
定义时的需要在参数名前加一个*

关键字(key)参数

此处的关键字和c语言中的关键字并不是一个意义,而是在dict中的key的意义。即在传递参数时
,同时传递键(key)和值(value),Python会自动封装为一个dict。

1
2
3
def my_function(**v):
print(v)
return

命名关键字参数

在关键字参数上,进一步限制传入的key的命名,就有了命名关键词参数:

1
2
def person(name, age, *, city, job):
print(name, age, city, job)

这里需要一个*区分位置参数与命名关键字参数,如果在这之前有可变参数,那么就不需要加*
命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错:

1
2
3
4
>>> person('Jack', 24, 'Beijing', 'Engineer')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: person() missing 2 required keyword-only arguments: 'city' and 'job'

参数组合

在一个函数中使用多个参数要保证其中的顺序,依次为:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。

1
2
def onefunction(a,b,c=0,*args,job,city,**kw):
pass

tips:

  • 使用*args**kw是Python的习惯写法。
  • 可变参数和关键字参数有一点层级的感觉,中间包裹的是命名关键字参数这个比较尴尬的参数。

递归函数

写法与Java相同。