1. 程式人生 > >九、python沈澱之路--遞歸、全局變量、局部變量、作用域

九、python沈澱之路--遞歸、全局變量、局部變量、作用域

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沈澱之路--遞歸、全局變量、局部變量、作用域