目录
递归函数斐波那契数列汉诺塔
匿名函数变量作用域全局变量和局部变量
递归函数
函数自己调用自己
往下分解,计算的过程往上回溯,综合的过程
def func(n
):
print(n
)
if n
== 1:
return 1
return n
*func
(n
-1)
func
(5)
>>>
5
4
3
2
1
120
递归必须有结束条件,否则会死掉在python中,递归是有深度的,深度根据机器
斐波那契数列
这个数列从第3项开始,每一项都等于前两项之和
def func(n
):
if n
== 1 or n
== 2:
return 1
return func
(n
-1)+func
(n
-2)
func
(10)
>>>
55
汉诺塔
a
= 'A'
b
= 'B'
c
= 'C'
def hano(a
,b
,c
,n
):
if n
== 1:
print("{}-->{}".format(a
,c
))
return None
if n
== 2:
print("{}-->{}".format(a
,b
))
print("{}-->{}".format(a
,c
))
print("{}-->{}".format(b
,c
))
return None
hano
(a
,c
,b
,n
-1)
print("{}-->{}".format(a
,c
))
hano
(b
,a
,c
,n
-1)
>>>hano
(1)
A
-->C
>>>hano
(2)
A
-->B
A
-->C
B
-->C
>>>hano
(3)
A
-->C
A
-->B
C
-->B
A
-->C
B
-->A
B
-->C
A
-->C
匿名函数
python 使用 lambda 来创建匿名函数lambda 只是一个表达式,函数体比 def 简单很多lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率
sum = lambda arg1
, arg2
: arg1
+ arg2
print ("相加后的值为 : ", sum( 10, 20 ))
print ("相加后的值为 : ", sum( 20, 20 ))
>>>
相加后的值为
: 30
相加后的值为
: 40
变量作用域
Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称作用域分类
L (Local) 局部作用域E (Enclosing) 闭包函数外的函数中G (Global) 全局作用域B (Built-in) 内置作用域(内置函数所在模块的范围) 以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内置中找
g_count
= 0
def outer():
o_count
= 1
def inner():
i_count
= 2
内置作用域是通过一个名为 builtin 的标准模块来实现的,但是这个变量名自身并没有放入内置作用域内,所以必须导入这个文件才能够使用它。在Python3.0中,可以使用以下的代码来查看到底预定义了哪些变量
>>> import builtins
>>> dir(builtins
)
Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的,也就是说这些语句内定义的变量,外部也可以访问
全局变量和局部变量
定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中
total
= 0
def sum( arg1
, arg2
):
total
= arg1
+ arg2
print ("函数内是局部变量 : ", total
)
return total
sum( 10, 20 )
print ("函数外是全局变量 : ", total
)
>>>
函数内是局部变量
: 30
函数外是全局变量
: 0
global 和 nonlocal关键字
当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了
num
= 1
def fun1():
global num
print(num
)
num
= 123
print(num
)
fun1
()
print(num
)
>>>
1
123
123
如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字了
def outer():
num
= 10
def inner():
nonlocal num
num
= 100
print(num
)
inner
()
print(num
)
outer
()
>>>
100
100