局部变量与全局变量

在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。

全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。

当去那句变量与局部变量同名时:

在定义局部变量的子程序内,局部变量起作用;在其他地方全局变量起作用。

 1 name = 'lhf'       #全局变量
 2 
 3 def change_name():
 4     print('我的名字',name)
 5 
 6 change_name()
 7 
 8 
 9 
10 
11 def change_name():
12     name = '皮卡丘'          #局部变量
13     print('我的名字',name)
14 
15 change_name()
16 print(name)
17 
18 
19 
20 def change_name():
21     global name                        #声明全局变量
22     name = '皮卡丘'
23     print('我的名I',name)
24 
25 change_name()
26 print(name)
27     

如果函数的内容无global关键字:(优先读取局部变量,只能读取全局变量,无法对全局变量重新赋值)
1.有声明局部变量
NAME = ['番茄’,'百香果']
def conghui():
      name = '柠檬'
      print('我爱吃',NAME)
      conghui()       
                
    
2.无声明局部变量
NAME = ['番茄','百香果']
def conghui():
       NAME.append('柠檬')
       print('我爱吃',name) 
conghui()      


如果函数的内容中有global关键字:(变量本质上就是全局变量,可读取可赋值)
1.有声明局部变量
NAME = ['番茄','百香果']
     def conghui ():
     global NAME
     NAME='柠檬'
     print('我爱吃',NAME)
conghui()

2.无声明局部变量   
NAME = ['番茄','百香果']
     def conghui ():
     global NAME
     NAME=['柠檬']
     NAME.append('柠檬')
     print('我爱吃',NAME)
conghui()



         
#指定全局变量

name = '石头'


def chunshe():
    name = '春社'

    def beilei():
        global name
        name = '蓓蕾'

    beilei()
    print(name)


print(name)
chunshe()
print(name)


#指定上一级变量

name = '石头'


def chunshe():
    name = '春社'

    def beilei():
        nolocal name           #nolocal name,指定上一级变量
        name = '蓓蕾'

    beilei()
    print(name)


print(name)
chunshe()
print(name)

 嵌套函数和作用域

name = "Alex"
 
def change_name():
    name = "Alex2"
 
    def change_name2():
        name = "Alex3"
        print("第3层打印",name)
 
    change_name2() #调用内层函数
    print("第2层打印",name)
 
 
change_name()
print("最外层打印",name)

此时,在最外层调用change_name2()会出现什么效果?

没错, 出错了, 为什么呢?

作用域在定义函数时就已经固定住了,不会随着调用位置的改变而改变

例一:
name='alex'

def foo():
    name='lhf'
    def bar():
        print(name)
    return bar

func=foo()
func()


例二:
name='alex'

def foo():
    name='lhf'
    def bar():
        name='wupeiqi'
        def tt():
            print(name)
        return tt
    return bar

func=foo()
func()()

递归调用

在函数内部,可以调用其他函数。如果在调用一个函数的过程中直接或间接调用自身本身

def calc(n):
    print(n)
    if int(n/2) ==0:
        return  n
    res = calc(int(n/2))
    return (res)
calc(10

递归特性:

1. 必须有一个明确的结束条件

2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少

3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

堆栈扫盲http://www.cnblogs.com/lln7777/archive/2012/03/14/2396164.html 

尾递归优化:http://egon09.blog.51cto.com/9161406/1842475

原文地址:https://www.cnblogs.com/hui147258/p/10850181.html