克隆策略

1、调用函数

Python内置了很多有用的函数,我们可以直接调用。

要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数abs,只有一个参数。

也可以在交互式命令行通过help(abs)查看abs函数的帮助信息。

In [1]:
help(abs)
Help on built-in function abs in module builtins:

abs(x, /)
    Return the absolute value of the argument.

In [2]:
abs(-10)
Out[2]:
10

2、定义函数

在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。

下面我们定义一个求两数之和的函数:

In [3]:
def add_two(a, b):
    return a + b
add_two(10, 22)
Out[3]:
32

请注意,函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回。因此,函数内部通过条件判断和循环可以实现非常复杂的逻辑。

如果没有return语句,函数执行完毕后也会返回结果,只是结果为None。

return None可以简写为return。

3、函数的参数

定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了。对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解。

Python的函数定义非常简单,但灵活度却非常大。除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简化调用者的代码。

3.1 默认参数

In [4]:
#  求x的平方
def power(x):
    return x * x
power(5)
Out[4]:
25
In [5]:
# 求x的n次幂,设置n的默认值为2。
def power(x, n=2):
    return x ** n
power(5, 3)
Out[5]:
125

设置默认参数时,有几点要注意:

  1. 必选参数在前,默认参数在后,否则Python的解释器会报错(思考一下为什么默认参数不能放在必选参数前面);
  2. 如何设置默认参数。

当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。

使用默认参数有什么好处?最大的好处是能降低调用函数的难度。

3.2 可变参数

在Python函数中,还可以定义可变参数。顾名思义,可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。

我们以数学题为例子,给定一组数字$a,b,c……$,请计算$a+b+c....$

要定义出这个函数,我们必须确定输入的参数。由于参数个数不确定,我们首先想到可以把a,b,c……作为一个 list 或 tuple 传进来,这样,函数可以定义如下:

In [6]:
def calc(numbers):
    amount = 0
    for num in numbers:
        amount += num
    return amount

numbers = [100, 200, 3, 4]
calc(numbers)
Out[6]:
307

如果利用可变参数,我们把函数的参数改为可变参数:

In [7]:
def calc(*numbers):
    amount = 0
    for num in numbers:
        amount += num
    return amount
calc(1,2,3,4,5,7)
Out[7]:
22

3.3 关键字参数

可变参数允许你传入 0 个或任意个参数,这些可变参数在函数调用时自动组装为一个 tuple。而关键字参数允许你传入 0 个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个 dict。

In [8]:
def get_kwargs(**kwargs):
    print(kwargs)
get_kwargs(a=10, b="hello", c=['a', 1, 'bcd'])
{'a': 10, 'b': 'hello', 'c': ['a', 1, 'bcd']}

3.4 混合参数

在Python中定义函数,可以用必选参数、默认参数、可变参数和关键字参数,这4种参数都可以一起使用,或者只用其中某些,但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数和关键字参数。

In [9]:
def func(a, b, c=0, *args, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
func(10, 20, 30, 'd', 'e', 'f', x=99, y ='hello')
a = 10 b = 20 c = 30 args = ('d', 'e', 'f') kw = {'y': 'hello', 'x': 99}

4、匿名函数 lambda

python 使用 lambda 来创建匿名函数。

lambda只是一个表达式,函数体比def简单很多。

lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。

lambda函数拥有自己的名字空间,且不能访问自有参数列表之外或全局名字空间里的参数。

虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。

In [10]:
# 定义lambda函数
f = lambda x: x*x
[f(i) for i in range(10)]
Out[10]:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]