变量作用范围及函数的嵌套和递归

1 篇文章 0 订阅
1 篇文章 0 订阅

变量作用范围及函数的嵌套和递归


分为全局变量和局部变量
- 函数即变量:可将定义函数的过程看做是变量赋值的过程
- 函数在定义后只解释不执行,只有调用时才执行,与变量的性质相同。

1. 格式区分

  • 全局变量:赋值语句无缩进定义的变量
  • 局部变量:赋值语句有缩进(即在函数中)的变量

2. 局部变量 转化为 全局变量

使用 global 语句,可将局部变量转化为全局变量,当函数被调用时转化语句生效,如:

name = 'cjl'
def rename():
    print('1:',name)
    global name
    name = 'tom'
    print('2:',name)
print('3:',name)
rename()
print('4:',name)
# 3: cjl
# 1: cjl
# 2: tom
# 4: tom

3. 作用范围

  • 全局变量:作用于所有位置
  • 局部变量:仅作用于函数中

4. 变量被引用生效次序(当二者变量名相同时)

  • 在函数外引用:仅全局变量生效
  • 在函数中引用:优先引用局部变量

【注意:】在函数中,如果引用了全局变量后,又对相同名字的变量重新赋值,会报错,如:

name = 'cjl'
def rename():
    print(name)
    name = 'tom'
    print(name)
rename()
print(name)
# UnboundLocalError: local variable 'name' referenced before assignment

5. 嵌套:注意嵌套中代码的执行顺序,函数定义后,在调用前是不执行的。

  • 调用全局变量 使用关键字 global
  • 调用外面上一层的变量,使用关键字 nonlocal

如:

NAME = '海风'
def huangwei():
    name = "黄伟"
    print(name)
    def liuyang():
        name = "刘洋"
        print(name)
        def nulige():
            name = '沪指花'
            print(name)
        print(name)
        nulige()
    liuyang()
    print(name)
huangwei()
#黄伟
#刘洋
#刘洋
#沪指花
#黄伟

如:

name = "刚娘"
def weihou():
    name = "陈卓"
    def weiweihou():
        nonlocal name   # nonlocal,指定上一级变量,如果没有就继续往上直到找到为止
        name = "冷静"
    weiweihou()
    print(name)
print(name)
weihou()
print(name)
# 刚娘
# 冷静
# 刚娘

6. 递归与尾递归

普通递归
  • 函数在递归应明确结束条件
  • 函数在递归应随着层级递进,剩余层级规模应越来越少
  • 函数递归过程中需要不断保存中间的返回值,所以递归执行的效率不高,递归次数过多可能会导致内存溢出,

如:

def calc(n):
    print(n)
    if n/2 < 1:
        return n
    return calc(n/2)
print(calc(10))
#10
#5.0
#2.5
#1.25
#1.25
尾递归

即将递归函数的最后一步调用其他函数,则递归函数已经执行最后一步,进入下一层递归之后上一层函数可以结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值