写在前面
对于计算机来说,非常乐于处理精确和具体的指令,但是人就不同了。对一个问路要去电影院的人来说,估计不会希望获得诸如“向前走十步”,“左转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)
递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。在多数情况下,递归更易读,有时会大大提高可读性。