全局与局部变量
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说:我知道,老男孩就在沙河汇德商厦,下地铁就是