八、初识python-函数作用域(课时23)

1.变量作用域

  • 全部(global): 在函数外部定义,整个全局范围有效,局部可以使用。
  • 局部(local): 在函数外部定义,只能在局部使用,不能在全局使用。
x = 2
def func():
	y = 20
	print(x)
	print(y)
func() #结果为2,20,x为全部变量,可以在局部使用。
print(y) #NameError: name 'y' is not defined,y为局部变量,无法在全局使用。
  • 提升局部变量
def improve():
    global f
    f = 100
    g = 200
improve() #注意这里结果improve和print(f)不能反着,因为先运行了函数f变量才能被提升
print(f) 
  • 查看全局局部变量: globals()、locals()

2.eval和exec函数

  • 都是把一个字符串当表达式来执行,但是exec函数不返回结果
#eval
x = 10
y = 3.1415926
c = eval("x + y")
print(c) #结果为13.1415926

#exec
x = 10
y = 3.1415926
c = exec("x + y")
print(c) #结果为None

z = exec("print('x + y:',x + y)") #里面的print结果先输出,再通过exec返回值没有
print(z) 
'''结果为
x + y: 13.1415926
None
'''

3.递归函数

  • 函数间接或直接调用自己,对递归深度有限制
#递归函数举例
def digui():
	x = 1
	x += 1
	print(x)
	digui()
  • 斐波那契数列
def fibo(n):
	if n <= 0:
		print("数字必须大于0")
	if n == 1:
		return 1
	if n == 2:
		return 1
	return fibo(n - 1) + fibo(n - 2)
  • 汉诺塔问题
    原则: 1.每次只移动一个盘子
    2.大盘子在上,小盘子在下
    举例: 1.n=1
    直接把A上的一个盘子移动到C 。A->C
    2.n=2
    先把A上的小盘子移动到B。A->B
    再把A的大盘子移动到C。A->C
    最后把B上的小盘子移动到C。B->C
    3.n=3
    先通过C,把A上的两个盘子移动到B。使用递归
    再把A上最大的一个盘子移动到C。A->C
    最后通过A,将B上的盘子移动到C。使用递归
    4.n
    先通过C,把A上的n-1个盘子移动到B。使用递归
    再把A上最大的一个盘子移动到C。A->C
    最后通过A,将B上的n-1个盘子移动到C。使用递归
def hano(n, a, b, c):
    '''
    n:有多少个盘子
    a:第一个塔,开始的塔
    b:第二个塔,中间的塔
    c:第三个塔,目标的塔
    '''
    if n == 1:
        print(a, "-->", c)
        return None
    
    if n == 2:
        print(a, "-->", b)
        print(a, "-->", c)
        print(b, "-->", c)
        return None
    
    #先通过C,把A上的n-1个盘子移动到B
    hano(n - 1, a, c, b)
    print(a, "-->", c)
    #最后通过A,将B上的n-1个盘子移动到C
    hano(n - 1, b, a, c)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值