Python函数

  • 定义函数
  • 函数的参数
  • 递归函数

 


  函数名其实就是指向一个函数对象的引用,完全可以把函数名赋值给一个变量,相当于给这个函数起了一个“别名”。

>>> a = abs    # 变量a指向abs函数
>>> a(-1)    # 所以也可以通过a调用abs函数
1

 

 

定义函数

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

  函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回。

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

 

空函数

  如果想定义一个什么事也不做的空函数,可以用pass语句:

def nop():
    pass

  pass还可以用在其他语句里,比如:

if age >= 18:
    pass
# 缺少了pass,代码运行就会有语法错误

 

 

返回多个值

  Python返回的任然是单一值,返回值是一个tuple。但是在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值,所以,Python的函数返回多值其实就是返回一个tuple,但写起来更方便。

 

函数的参数

  Python函数除了正常的必选参数外,还可以使用默认参数、可变参数和关键字参数。

# 当调用power(5)时,相当于调用power(5, 2)
# 而对于n > 2的其他情况,就必须明确地传入n,比如power(5, 3)
def power(x, n=2):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s

  默认参数使用不当的情况:当正常调用时,结果是对的;当使用默认参数调用时,一开始结果是对的,但是当再次调用add_end()时,结果就不对了。

  默认参数是[],但是函数似乎每次都“记住了”上次添加了'END'后的list。

  原因如下:Python函数在定义的时候,默认参数L的值就被计算出来了,即[],因为默认参数L也是一个变量,每次调用该函数,如果改变了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了。

  注意:默认参数必须指向不变对象。

>>> def add_end(L=[]):
...     L.append('END')
...     return L
...
>>> add_end([1, 2, 3])
[1, 2, 3, 'END']
>>> add_end(['x', 'y', 'z'])
['x', 'y', 'z', 'END']
>>> add_end()
['END']
>>> add_end()
['END', 'END']
>>> add_end()
['END', 'END', 'END']

 

 

  可变参数就是传入的参数个数是可变的。

  定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个*号。在函数内部,参数numbers接收到的是一个tuple,在调用该函数时,可以传入任意个参数,包括0个参数。

  如果已经有一个list或者tuple,要调用一个可变参数时,可以在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去。

>>> def calc(*numbers):
...     sum = 0
...     for n in numbers:
...         sum = sum + n * n
...     return sum
...
>>> calc(1, 2)
5
>>> calc()
0

 >>> nums = [1, 2, 3]
 >>> calc(*nums)
 14

 

 

 

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

>>> def person(name, age, **kw):
...     print('name:', name, 'age:', age, 'other:', kw)
...
>>> person('Mike', 30)
name: Mike age: 30 other: {}
>>> person('Bob', 29, city='Beijing')
name: Bob age: 29 other: {'city': 'Beijing'}
>>> person('Adam', 23, gender='M', job='Engineer')
name: Adam age: 23 other: {'gender': 'M', 'job': 'Engineer'}

 

posted @ 2018-05-23 16:19  zhangcd  阅读(288)  评论(0编辑  收藏  举报