Python-变量、函数及递归

#规则:

  全局变量全部大写,局部变量全部小写

#关于局部变量和全局变量在函数中应用的关系:

  定义全局变量:

name = 'alex'         #全局变量

  1、函数中先定义与全局变量名相同的变量后再引用:

name = 'alex'         #全局变量
def test():
    name = 'oliver'  #先定义了局部变量(与全局变量名称相同) 
    print(name)     #后使用该变量
test()
print(name)
# -->  oliver    alex

    可看出先定义与全局变量名称相同的局部变量后,在引用时使用的是局部变量的值(Oliver),且原全局变量不受改变(依旧是alex

  2、函数中先使用全局变量后再引用:

name = 'alex'         #全局变量
def test():
    print(name)   #本函数内找不到name,所以将采用全局变量name的值来使用
    name = 'oliver'  #修改name的值
    print(name)
test()
print(name)
# -->  报错

    可看出如果函数中引用某变量时,在本函数内找不到定义,则会使用全局变量。但使用全局变量后就无法更改该变量的值。

# global的使用:

  在上述的讨论中,已经知道方法二:函数中先使用全局变量后再引用,可以使用全局变量的值,但是不能修改,若想修改则需要使用global 将函数中的该变量更改为全局变量。

name = 'alex'         #全局变量
def test():
    global age, name
    age = 18    
    print(name, age)
    name = 'oliver'
    print(name)
test()
print(name, age)
# -->  alex 18     oliver     oliver 18

    只要在函数中先用global定义变量,则该变量与在函数外定义的一样,具有全局性,可被修改(name),也可被外部直接引用(age

#nonlocal的使用:

  global定义的变量为全局变量,该变量会与最外层定义的指定变量等效,但如果想让该变量与其上层函数所定义的某变量等效,则要使用nonlocal。

name = 'haifeng'           #全局变量
def huangwei():
    name = 'chenzhuo'      #第一级变量
    def liuwei():
        nonlocal name      #此处name将与第一级变量name等效
        name = 'lengjing'   #将更改第一级变量的值
    liuwei()
    print(name)
huangwei()
print(name)
# -->  lengjing   haifeng   可看出第一级变量被改变,而全局变量值未被改变

#定义的函数内也可以定义函数(函数嵌套):

def huangwei():
    print('huang')
    def liuwei():
        print('liu')
    liuwei()
huangwei()
# --> huang   liu

  但内部定义的函数不能在外部调用:

def huangwei():
    print('huang')
    def liuwei():
        print('liu')
    liuwei()
liuwei()
# --> 报错:name 'liuwei' is not defined

#递归:

  函数内部继续调用本函数

def calc(n):
    print(n)
    if int(n / 2) == 0:
        return n
    return calc(int(n / 2))
calc(5)
# -->  5  2  1

    特性:

        1、必须有一个明确的结束条件(否则内存溢出就会报错)

       2、每次进入更深一层递归时,问题规模要逐渐减小

原文地址:https://www.cnblogs.com/yu-long/p/9961323.html