九、python沈澱之路--遞歸、全局變量、局部變量、作用域
阿新 • • 發佈:2018-04-28
pan [ ] int 變量的作用域 賦值 嵌套 return 重點 hang
一、遞歸
1、遞歸函數,同時使用嵌套,並且是將別的函數作用於調用函數裏面
例1
1 num = [1,2,3,4,5] 2 def add_one(i): 3 return i+1 4 def reduce(i): 5 return i - 1 6 def map_test(func,array): #此處為重點 7 ret = [ ] 8 for n in array: 9 re = func(n) 10 ret.append(re) 11 return ret 12 13 print(map_test(add_one,num))14 print(map_test(lambda x :x**2,num)) 15 print(list(map(lambda x:x-1,num)))
1 [2, 3, 4, 5, 6] 2 [1, 4, 9, 16, 25] 3 [0, 1, 2, 3, 4]
例2
1 ms = ‘ajfklasf‘ 2 print(list(map(lambda x :x.upper(),ms))) #map後面可傳進去的可以是列表字典集合定 3 4 lis2 = [‘bjgugong‘,‘bjtiananmen‘,‘bjxiangshan‘,‘motianlun‘] 5 def filter_test(func,array):6 li = [] 7 for n in array: 8 if not func(n): 9 li.append(n) 10 return li 11 def show_bj(ss): 12 return ss.startswith(‘bj‘) 13 14 print(list(filter_test(show_bj,lis2))) 15 16 li = [2,2,3,100] 17 def mult(x,y): 18 return x * y 19 def reduce_test(func,array,init=None):20 if init is None: 21 rr = array.pop(0) 22 else: 23 rr =init 24 for i in array: 25 rr = func(rr,i) 26 return rr 27 28 print(reduce_test(mult,li,2)) 29 30 #註:map filter reduce 三者的區別 31 from functools import reduce 32 print(reduce(lambda x,y:x * y,li,3))
1 [‘A‘, ‘J‘, ‘F‘, ‘K‘, ‘L‘, ‘A‘, ‘S‘, ‘F‘] 2 [‘motianlun‘] 3 2400 4 3600
遞歸示例
1 name=‘地球‘ 2 def china(): 3 name = "中國" 4 print(name) 5 def beijing(): 6 name = "北京" 7 print(name) 8 def haidian(): 9 name = ‘海澱‘ 10 print(name) 11 haidian() 12 print(name) 13 beijing() 14 print(name) 15 16 print(‘*‘,name) 17 china() 18 print(‘**‘,name)
1 * 地球 2 中國 3 北京 4 海澱 5 北京 6 中國 7 ** 地球
二、函數的作用域只跟函數聲明時定義的作用域有關,跟函數的調用位置無任何關系
三、全局變量與局部變量
1、全局變量:關鍵字global
例1、
1 name = ‘地球‘ 2 print(name) 3 4 def change_name(): 5 global name #在函數裏面的name本身是局部變量的,由於經過了global的聲明,函數內部的name變成了全局變量 6 name = ‘中國‘ #也就是說原來的作用域是函數內部,現在聲明以後的作用域變成了全部 7 print(‘change_name:‘,name) 8 9 change_name() 10 print(name)
1 地球 2 change_name: 中國 3 中國
對比下面的
1 name = ‘地球‘ 2 print(name) 3 4 def change_name(): 5 name = ‘中國‘ 6 print(‘change_name:‘,name) 7 8 change_name() 9 print(name)
1 地球 2 change_name: 中國 3 地球
錯誤示例如下
1 name = ‘地球‘ 2 print(name) 3 4 def change_name(): 5 name = ‘中國‘ 6 global name #既然要聲明,就必須放在被聲明變量的上面,,如果放在下面,沒意義,運行會出錯 7 print(‘change_name:‘,name) 8 9 change_name() 10 print(name)
例2:局部可以讀取全局變量
1 NAME = ‘地球‘ 2 print(NAME) 3 4 def change_name(): 5 name = ‘中國‘ #在局部不可以對全局變量進行修改、賦值等,因為沒有關鍵字global 6 print(‘change_name:‘,name ,NAME) #此處在局部讀取了全局變量 7 8 change_name()
1 地球 2 change_name: 中國 地球
#############關於全局變量和局部變量的一些規則##############
全局變量變量名大寫
局部變量變量名小寫
在局部裏面,優先讀取局部變量;如果沒有關鍵字global聲明,局部也能讀取全局變量,但是在局部無法修改全局變量
但是對於可變類型,如局部變量,可以在內部對其進行修改。即可以對內部元素進行操作
如果函數內部有global關鍵字,變量本質上就是全局的那個變量,也就是在局部可以對其讀取,也可以對其進行修改。
2、局部變量:關鍵字nonlocal
例1:沒有關鍵字nonlocal的情況
1 NAME = ‘地球‘ 2 print(‘第一次:‘,NAME) 3 def outward(): 4 name = ‘中國‘ 5 def inward(): 6 name1 = ‘北京‘ #此處是關鍵,註意細節 7 print(‘inward:‘,name1) 8 inward() 9 print(name) 10 11 outward()
1 第一次: 地球 2 inward: 北京 3 中國
例2:有nonlocal的情況
1 NAME = ‘地球‘ 2 print(‘第一次:‘,NAME) 3 def outward(): 4 name = ‘中國‘ 5 def inward(): 6 nonlocal name #nonlocal可以作用到上一層,但是,如果只有一層函數,那麽nonlocal不能作用到最外層 7 name = ‘北京‘ #下面還有一個例子 8 print(‘inward:‘,name) 9 inward() 10 print(‘outward:‘,name) 11 12 outward()
1 第一次: 地球 2 inward: 北京 3 outward: 北京
例3:錯誤示例
1 name = ‘地球‘ 2 print(‘第一次:‘,name) 3 def outward(): 4 nonlocal name #報錯。nonlocal不能作用到全局變量的作用域,它只能在局部向上次一層作用 5 name = ‘中國‘ 6 print(name) 7 8 outward()
九、python沈澱之路--遞歸、全局變量、局部變量、作用域