2018.03.06*********************************Day09**********************************
author:wills
hello,everybody!
今天学习了python中,变量的作用域
首先明确python的语法中主要有两种变量,全局变量 and 局部变量。推荐使用局部变量,减少互相调用时的影响。先来看一段代码,然后再一一进行解释。
def foo():
# local variable
# 函数内的局部变量 离开foo 函数变量a无法访问
# 搜索全局变量,使用global
# global a # 关键字global 将全局变量a修改了
global a
global b
a = 200
b = 100
print(a,b)
def bar():
global a
global b
a = '111'
b = '222'
print(a,b)
print(a, b)
bar()
print(a, b)
def main():
a = 'hello'
b = 'good'
foo()
if __name__ == '__main__':
main()
这段代码的运行结果是200,100,200,100,111,222,111,222。首先第一个200,100是刚开始就print的毫无疑问,在定义bar()函数的时候,使用global关键字调用了全局变量a,b并将a,b分别赋值为111,222字符串,但是为什么第一个打印不是111,222呢,注意看定义和调用bar()函数的位置,第二次print是在定义bar()函数之后调用bar()函数之前,那么bar()函数里面对(a,b)的修改还没生效,(a,b)仍然是200,100.但是第三次print是在调用了bar()函数之后,并且在bar()函数内部,此时(a,b)的值已经被修改,第四次print(a,b)的值与第三次相同
所以变量是有作用域的,这一点非常重要。
今天有个小程序,是关于儿童走楼梯,一次1-3阶,如果10阶楼梯,有多少中走法,我们假设有1阶楼梯,走法1种;2阶楼梯,走法2种;3阶楼梯,走法4种。程序如下
def goStairs(x):
if x == 1:
return 1
elif x == 2:
return 2
elif x == 3:
return 4
else:
return goStairs(x-3)+goStairs(x-2)+goStairs(x-1)
print(goStairs(10))
思路就是10阶楼梯,可以走1-3阶。第一次走一阶,剩9阶,有多少种走法;走2阶,剩8阶,有多少种走法;走3阶,剩7阶,有多少种走法。那么10阶的走法=(9阶走法+8阶走法+7阶走法)。同理9阶走法=(8…+7…+6…),8阶走法=(7…+6…+5…),就可以采用递归函数的方法求出来。