关闭

python 函数②

标签: 函数python递归
157人阅读 评论(0) 收藏 举报
分类:

递归函数:

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

举个例子,我们来计算阶乘 n! = 1 * 2 * 3 * ... * n,用函数 fact(n)表示,可以看出:

fact(n) = n! = 1 * 2 * 3 * ... * (n-1) * n = (n-1)! * n = fact(n-1) * n

所以,fact(n)可以表示为 n * fact(n-1),只有n=1时需要特殊处理。

于是,fact(n)用递归的方式写出来就是:

def fact(n):
    if n==1:
        return 1
    return n * fact(n - 1)
上面就是一个递归函数。可以试试:

>>> fact(1)
1
>>> fact(5)
120

如果我们计算fact(5),可以根据函数定义看到计算过程如下:

===> fact(5)
===> 5 * fact(4)
===> 5 * (4 * fact(3))
===> 5 * (4 * (3 * fact(2)))
===> 5 * (4 * (3 * (2 * fact(1))))
===> 5 * (4 * (3 * (2 * 1)))
===> 5 * (4 * (3 * 2))
===> 5 * (4 * 6)
===> 5 * 24
===> 120
使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,

栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。可以试试计算 fact(10000)。

定义默认参数

函数的默认参数的作用是简化调用,你只需要把必须的参数传进去。但是在需要的时候,又可以传入额外的参数来覆盖默认参数值。

我们来定义一个计算 x 的N次方的函数:

def power(x, n):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s
print power(2,3)#ok
print power(2)#error

由于函数的参数按从左到右的顺序匹配,所以默认参数只能定义在必需参数的后面:

# OK:
def fn1(a, b=1, c=2):
    pass
# Error:
def fn2(a=1, b):
    pass

任务

请定义一个 greet() 函数,它包含一个默认参数,如果没有传入,打印 'Hello, world.',如果传入,打印 'Hello, xxx.'

?不会了怎么办

默认参数的默认值可以设定为'world'

参考代码:

def greet(name='world'):
    print 'Hello, ' + name + '.'
greet()
greet('Bart')
Hello, world.
Hello, Bart.
定义可变参数

如果想让一个函数能接受任意个参数,我们就可以定义一个可变参数:

def fn(*args):
    print args

可变参数的名字前面有个 号,我们可以传入0个、1个或多个参数给可变参数:

>>> fn()
()
>>> fn('a')
('a',)
>>> fn('a', 'b')
('a', 'b')
>>> fn('a', 'b', 'c')
('a', 'b', 'c')

可变参数也不是很神秘,Python解释器会把传入的一组参数组装成一个tuple传递给可变参数,因此,在函数内部,直接把变量 args看成一个 tuple 就好了。

定义可变参数的目的也是为了简化调用。假设我们要计算任意个数的平均值,就可以定义一个可变参数:

def average(*args):
    ...

这样,在调用的时候,可以这样写:

>>> average()
0
>>> average(1, 2)
1.5
>>> average(1, 2, 2, 3, 4)
2.4

任务

请编写接受可变参数的 average() 函数。

?不会了怎么办

可变参数 args 是一个tuple,当0个参数传入时,args是一个空tuple。

参考代码:

def average(*args):
    sum = 0.0
    if len(args) == 0:
        return sum
    for x in args:
        sum = sum + x
    return sum / len(args)
print average()
print average(1, 2)
print average(1, 2, 2, 3, 4)

 或者

def average(*args):

    if len(args)!=0:
        return sum(args)*1.0/len(args)
    else:
        return 0.0


0
0
查看评论

python的一些函数

numpy函数 1)linspace创建等差数组 它最常用的有三个参数,第一个参数表示起始点,第二个参数表示终止点,第三个参数表示数列的个数,如 a=linspace(1,10,10) print a 结果是:array([1.,2.,3.,4.,5.,6.,7.,8.,9.,10.])
  • zhuhengv
  • zhuhengv
  • 2016-05-07 19:54
  • 1123

python内部函数和常用工具函数

from itertools import * ''' itertools中的迭代器工具 ''' def t1(): #排列 for num in permutations('abc', 2): prin...
  • Yan456jie
  • Yan456jie
  • 2016-08-22 21:26
  • 824

python函数的闭包问题(内部函数与外部函数详述)

python函数的闭包问题(内嵌函数)>>> def func1(): ... print ('func1 running...') ... def func2(): ... print ('func2 running...
  • ChangerJJLee
  • ChangerJJLee
  • 2016-09-20 18:12
  • 2797

python-Counter计数函数

>>> c = Counter() # 创建一个新的空counter >>> c = Counter('abcasdf') # 一个迭代对象生成的counter ...
  • u014755493
  • u014755493
  • 2017-04-09 14:20
  • 4543

python的函数嵌套机制

最近相对来讲比较清闲,所以能用一点时间找一些有意思的东西出来,因为之前在用python写一个简单的mysql访问类的时候想用一下单例,所以从网上copy了很多代码。有些代码用到了python的嵌套函数,但是秉着不熟悉的东西会出错的错误思想,我放弃了用那种看起来更为高大上一点的用法,转而用了一种简单的...
  • gogogogogogzg
  • gogogogogogzg
  • 2015-09-16 13:02
  • 1309

Python函数绘图

最近看数学,发现有时候画个图还真管用,对理解和展示效果都不错。尤其是三维空间和一些复杂函数,相当直观,也有助于解题。 本来想用mathlab,下载安装都太费事,杀鸡不用牛刀,Python基本就能实现。 下面分别在二维三维举例说明。
  • xieyan0811
  • xieyan0811
  • 2017-05-19 13:51
  • 1441

#2 在Python中创建一个函数

在Python中创建一个函数
  • a734789704
  • a734789704
  • 2017-04-28 20:34
  • 325

python函数的属性

最近看learn python,看到使用函数属性完成nonlocal的效果。def test(start): def nest(label): print(label,nest.state) nest.state+=1 nest.state=start return nest 个...
  • bingoabs
  • bingoabs
  • 2015-12-16 18:49
  • 247

python常见函数修饰符总结(不断更新)

Last Update: 2013-4-9 欢迎转载 openxmpp@163.com 1) @classmethod 用classmethod修饰表示这是一个类方法,如果没有用@classmethod修饰,则表示这是一个对象方法,使用时必须与一个对象绑定,如下 class M...
  • openXMPP
  • openXMPP
  • 2013-04-09 21:15
  • 8164

python str函数及其对象

str()一般是将数值转成字符串。 repr()是将一个对象转成字符串显示,注意只是显示用,有些对象转成字符串没有直接的意思。如list,dict使用str()是无效的,但使用repr可以,这是为了看它们都有哪些值,为了显示之用。  The str() function is mean...
  • tianmo2010
  • tianmo2010
  • 2012-08-20 12:05
  • 5078
    个人资料
    • 访问:28634次
    • 积分:1306
    • 等级:
    • 排名:千里之外
    • 原创:80篇
    • 转载:41篇
    • 译文:13篇
    • 评论:0条
    最新评论