Python基础06-函数

2017-02-17 16:24:33

我们创建一个函数来输出任意边界的斐波那契数列

>>> def fib(n):
...    """打印一个斐波那契数列到n"""
...     a, b = 0, 1
...     while a < n:
...         print(a, end= ' ')
...         a, b = b, a+b
...     print()
...
>>> fib(100)
0 1 1 2 3 5 8 13 21 34 55 89

首先,def这个关键字通知Python:我在定义一个函数,fib是函数名,可以随便定义。括号里的n是参数,参数可以没有或者有多个,用,连接,没有参数为def name():,括号不能省略。整个缩进部分为函数体。第一行是DocumentionString,可以不写,不过有些工具使用DocumentionString生成在线文档等,为了提高函数的可读性,建议写上。

>>> f = fib # 函数名可以赋值给另外的变量,然后该变量可以作为函数调用,相当于函数改了个名字
>>> f(10)
0 1 1 2 3 5 8
>>> def square_sum(a, b):
...     c = a ** 2 + b ** 2
...     return c
...
>>> square_sum(3, 5)
34

这里给函数加了返回值,return 可以返回多个值,比如return a, b, c ,也可以返回单个值return c,或者不写返回值,这时候函数的默认返回值是None

>>> def fun3(a, b = 2, text = "结果是"):
...     print(text , a ** b)
...
>>> fun3(3)
结果是 9
>>> fun3(4, 3)
结果是 64
>>> fun3(2, 6, "最新结果是")
最新结果是 64

上边展示的是参数默认值,当参数没有被传值的时候,对应参数会使用默认值。

注意:默认值只会被求值一次,这在默认值是引用类型的时候,比如list, dictionary或大部分类的对象,函数会在接下来的调用里对传递给他的参数累加。

>>> def fun4(a, L = []):
...     L.append(a)
...     return L
...
>>> fun4(1)
[1]
>>> fun4(2)
[1, 2]
>>> fun4(3)
[1, 2, 3]
>>>

如果不想参数在以后的调用里累加,可用下边的方式定义。

>>> def fun4(a, L = None):
...     if L is None:
...         L = []
...     L.append(a)
...     return L
...

函数可以通过关键字传递参数。

>>> def fun(a, b = "bbb", c = 3):
...     print("a = ", a)
...     print("b = ", b)
...     print("c = ", c)
...
>>> fun(1)
a =  1
b =  bbb
c =  3
>>> fun(1, b="aaa", c = 6)
a =  1
b =  aaa
c =  6
>>> fun(1, c = 8)
a =  1
b =  bbb
c =  8
>>> fun(2, c = 9, b="aaa")
a =  2
b =  aaa
c =  9

有时可能会不确定参数的个数,这时候使用可变参数列表,列表使用 星号加变量名*name,字典使用两个星号加变量名**name

>>> def fun(*keys):
...     print("keys is ",keys);
...
>>> fun("a", "b", "c")
keys is  ('a', 'b', 'c')
>>> fun(1, 2)
keys is  (1, 2)

>>> def fun2(**dic):
...    print("dic is ", dic)
...
>>> fun2(key1 = "value1", key2 = "value2")
dic is  {'key1': 'value1', 'key2': 'value2'}