Python学习随笔五:抽象之函数

来源:互联网 发布:比价软件推荐 编辑:程序博客网 时间:2024/05/18 03:06

写在前面

对于计算机来说,非常乐于处理精确和具体的指令,但是人就不同了。对一个问路要去电影院的人来说,估计不会希望获得诸如“向前走十步”,“左转135度”,但如果被告知“一直沿着桥走”就会清晰明白很多。
组织计算机程序也是类似的。将语句组织成函数,这样只需告诉计算机一次如何做事。有了函数以后,就不必反反复复向计算机传递同样的具体指令了。程序应该是非常抽象的,就像“下载网页”、“计算频率,打印每个单词的频率”一样易懂
本博客是基于廖雪峰Python教程基础上的自我整理和消化,欢迎大家批评指正。第五节内容将介绍:

  • 创建函数
  • 函数参数
  • 递归

创建函数

创建函数是组织程序的关键。Python中,使用def语句

def hello(name):    return 'Hello, ' + name + '!'

函数定义包括三个重点:
1、关键词 def
2、函数名(参数列表),以及紧随其后的:
3、函数体和返回信息

定义函数之后,就可以像内建函数一样

>>> print(hello('world'))Hello, world!单引号与双引号

return

数学意义上的函数,总在计算其参数后返回点什么。Python的有些函数却并不返回任何东西——没有return语句或者虽有return语句但后面没有任何值
但实际上
函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回。
如果没有return语句,函数执行完毕后也会返回结果,只是结果为None。
return None可以简写为return

def test():    print('This is printed')    return    print('This is not')

这里的return语句只起到结束函数的作用,调用该函数

>>> x = test()This is printed>>> print(x)None

函数参数

写在def语句中函数后面的变量通常叫做函数的形参,而调用函数时提供的值是实参,或者称为参数

关键词参数和默认值

目前为止,我们所使用的函数都叫做位置参数,因为他们的位置很重要
如,下面这个计算一个数的n次方的函数

def power(x, n):    s = 1    while n > 0:        n = n - 1        s = s * x    return s

调用这个函数,第一个位置上放置底,第二位置上放置指数
但是有些时候(尤其是参数很多的时候),参数的顺序是很难记住的。为了让事情简单点,可以提供参数的名字

>>> power(n=2,x=3)9

这样一来,顺序就没有影响了,但参数名和值一定要对应。这类使用参数名提供的参数叫做关键词参数。
当参数具有默认值的时候,调用的时候就就不用提供参数了。

def hello(greeting = 'Hello' , name ='world'):    print('%s,%s!' % (greeting,name))>>> hello()Hello,world!>>> hello("Greeting")Greeting,world!>>> hello(name='Ada')Hello,Ada!`

收集参数

1、任意多参数
用户可以给函数提供任意多的参数

>>> def print_params(*params):    print(params)>>> print_params('name')('name',)

结果作为元组打印出来
*的作用是收集其他位置的参数
**的作用是收集关键字参数,返回的是字典

>>> print_params(1,2,3,4,5,6,foo=1,bar=2)1 2 3(4, 5, 6){'foo': 1, 'bar': 2}

2、参数收集的逆过程

在调用的时候

>>> def add(x,y):        return x+y>>> params=(1,2)>>> add(*params)3

*params表示把params这个tuple的所有元素作为可变参数传进去

递归

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
阶乘的案例

 def power(x,n):     if n==0:        return 1    else:        return x*power(x,n-1)

递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。在多数情况下,递归更易读,有时会大大提高可读性。