全局变量,局部变量,递归---Python重新开始第四天

全局与局部变量

 1 NAME = "产品经理"
 2 
 3 def yangjian():
 4     # NAME = "史正文"
 5     global NAME # 已经声明,NAME就是全局的的那个变量
 6     print('我要搞', NAME)
 7     NAME = "小东北"  # 修改 全局的变量
 8     print('我要搞', NAME)
 9 
10 def qupengfei():
11     NAME = ""
12     print('我要搞', NAME)
13 
14 如果函数的内容无global关键字,
15   - 有声明局部变量(打印自己,内部定义了局部变量,用自己内部的)
16         NAME = ["产品经理","廖波湿"]
17         def qupengfei():
18             NAME = "自己"
19             print('我要搞', NAME)
20         qupengfei()
21   - 无声明局部变量(打印三个,没有局部变量,就用全局变量)
22         NAME = ["产品经理","廖波湿"]
23         def qupengfei():
24             NAME.append('XXOO')
25             print('我要搞', NAME)
26         qupengfei()
27 
28 如果函数的内容有global关键字
29   - 有声明局部变量(声明了这个是全局变量,把“自己”赋值给全局了,打印改变的全局变量)
30         NAME = ["产品经理","廖波湿"]
31         def qupengfei():
32             global NAME
33             NAME = "自己"
34             print('我要搞', NAME)
35         qupengfei()
36         错误示例(报错,重复赋值,先定义局部变量,再声明是全局变量,这样不行)
37         NAME = ["产品经理","廖波湿"]
38         def qupengfei():
39             NAME = "自己"
40             global NAME
41             print('我要搞', NAME)
42         qupengfei()
43   - 无声明局部变量(修改了全局,在修改的基础上,加了新的,打印“阿毛,XXOO”)
44         NAME = ["产品经理","廖波湿"]
45         def qupengfei():
46             global NAME
47             NAME = ["阿毛"]
48             NAME.append('XXOO')
49             print('我要搞', NAME)
50         qupengfei()
51 
52 ####### 全局变量变量名大写
53 ####### 局部变量变量名小写
54 
55 
56 优先读取局部变量,能读取全局变量,无法对全局变量重新赋值 NAME=“fff”,
57     但是对于可变类型,可以对内部元素进行操作
58 如果函数中有global关键字,变量本质上就是全局的那个变量,可读取可赋值 NAME=“fff”
59 qupengfei()
60 yangjian()

注意:nonlocal   可指定上一级变量,如果没有就继续往上直到找到为止

函数即变量

 1 概念:定义函数时相当于定义了一个变量,没有调用时不会执行功能,
 2 但是存在于程序中,下面举两个例子,比较容易理解
 3 
 4 例1:程序不会出错
 5 def foo():
 6     print('from foo')
 7     bar()
 8 
 9 def bar():
10     print('from bar')
11 foo()    #在执行foo函数前已经定义好了bar
12 
13 例2:程序会出错
14 def foo():
15     print('from foo')
16     bar()
17 foo()    #在调用foo前没有定义好bar函数
18 def bar():
19     print('from bar')

 另外:

如果一个函数没有return,那么默认return 的值是None

 1 ####################
 2 def bar():
 3     print('from bar')
 4 def foo():
 5     print('from foo')
 6     bar()
 7 
 8 foo()
 9 #################### 
10 def foo():
11     print('from foo')
12     bar()
13 
14 def bar():
15     print('from bar')
16 foo()
17 ####################
18 #这样不行,第一步foo函数编译,第二部执行foo(),
19 #执行到第三部发现,不知道bar()函数是干嘛的,报错
20 def foo():             1
21     print('from foo')  
22     bar()              3
23 
24 foo()                  2
25 
26 def bar():
27     print('from bar')

递归函数

递归函数效率不高,占用内存

例1

1 def calc(n):
2     print(n)
3     if int(n / 2) == 0:
4         return n
5     res=calc(int(n / 2))    #这样更好理解
6     return res              #这样更好理解
7      #return calc(int(n / 2))#两句合并成
8 res=calc(10)
9 print(res)

例2

 1 import time
 2 person_list=['alex','wupeiqi','linhaifeng','zsc']
 3 def ask_way(person_list):
 4     print('-'*60)
 5     if len(person_list) == 0:
 6         return '根本没人知道'
 7     person=person_list.pop(0)
 8     if person == 'linhaifeng':
 9         return '%s说:我知道,老男孩就在沙河汇德商厦,下地铁就是' %person
10 
11     print('hi 美男[%s],敢问路在何方' % person)
12     print('%s回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问%s...' % (person, person_list))
13     time.sleep(1)
14     res=ask_way(person_list)
15 
16     #此级别没完,在得到返回值后,还要执行打印,再把它返回的值,返回到上一级等待的res
17     print('%s问的结果是: %res' %(person,res))
18     return res
19 
20 res=ask_way(person_list)
21 print(res)
22 # 我             来英            杨建           是征文
23 # res等 <————————res等  <————————res等  <——————return ‘沙河’
24 # print(res)     print(res)      print(res)     

总结:递归函数,在进入下级递归时,有一个res在等待返回的值,但是返回的值又是执行函数本身,一直执行,每一级都有个res在等着它的下一级返回值,

直到设定的边界,边界return了值,返回给边界的上一级,上一级运行完,要执行res=xxx 后面的同级代码,遇到return,再返回给上上级

看结果:

 1 ------------------------------------------------------------
 2 hi 美男[alex],敢问路在何方
 3 alex回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问['wupeiqi', 'linhaifeng', 'zsc']...
 4 ------------------------------------------------------------
 5 hi 美男[wupeiqi],敢问路在何方
 6 wupeiqi回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问['linhaifeng', 'zsc']...
 7 ------------------------------------------------------------
 8 wupeiqi问的结果是: 'linhaifeng说:我知道,老男孩就在沙河汇德商厦,下地铁就是'es
 9 alex问的结果是: 'linhaifeng说:我知道,老男孩就在沙河汇德商厦,下地铁就是'es
10 linhaifeng说:我知道,老男孩就在沙河汇德商厦,下地铁就是
原文地址:https://www.cnblogs.com/lishuaing/p/10679378.html