python的函数式编程_Python函数式编程-概念理解,python
函數式編程-高級
一、函數的參數類型
1. 不可變類型參數
不可變類型參數有:整數,字典,字符串
傳遞不可變類型參數,不會影響參數本身。
代碼:
a = 100
print(f"函數外邊a的id值----->{id(a)}")
print(f"a的值為{a}")
def func(b):
# a和b的id值相同
print(f"函數參數傳遞過來的id值----->{id(b)}")
print(f"b的值為:{b}")
# 修改b的值
b = 200
print(f"修改后b的id----->{id(b)}")
print(f"修改后b的值為:{b}")
func(a)
print(f"b值修改后,a的id值----->{id(a)}")
print(f"b值修改后,a的值:{a}")
結果:
函數外邊a的id值----->140729229159920
a的值為100
函數參數傳遞過來的id值----->140729229159920
b的值為:100
修改后b的id----->140729229163120
修改后b的值為:200
b值修改后,a的id值----->140729229159920
b值修改后,a的值:100
2. 可變類型參數
可變類型參數有:列表、字典
傳遞可變類型參數,如果直接重新賦值,那么也不會影響參數本身,如果直接在原對象基礎上進行
修改會影響。
代碼:
list_outer = [1, 2, 3]
print("list_outer的值和id值:", list_outer, id(list_outer))
def func(list_inner):
print("list_inner的值和id:", list_inner, id(list_inner))
list_inner.append(4)
print("修改后list_inner的值和id:", list_inner, id(list_inner))
func(list_outer)
print("修改后list_outer的值和id值:", list_outer, id(list_outer))
結果:
list_outer的值和id值: [1, 2, 3] 1615815397768
list_inner的值和id: [1, 2, 3] 1615815397768
修改后list_inner的值和id: [1, 2, 3, 4] 1615815397768
修改后list_outer的值和id值: [1, 2, 3, 4] 1615815397768
二、命名空間
1. 概念
命名空間指的是保存程序中變量名和值的字典。字典的key是變量的名稱,value是變量的值。
如:{“name”: “zr”, “age”:18}
2. 分類
局部命名空間:記錄函數的變量。包括函數的參數和函數內定義的變量。
全局命名空間:記錄模塊(一個.py文件)的變量。包括函數、類、其他導入的模塊。
內置命名空間:記錄解釋器內置的變量。任何模塊都可訪問它,包括內置的函數和異常。
3. 訪問命名空間
locals():訪問局部命名空間:根據調用的位置有關系
globals():訪問全局命名空間:與調用位置無關
def func1(name, age):
"""命名空間的訪問"""
num = 10
loc = locals() # 局部命名空間
print(loc) # {'name': 'tom', 'age': 18, 'num': 10}
func1("tom", 18)
glo = globals()# 全局命名空間
print(glo)
"""
{'__name__': '__main__', '__doc__': None, '__package__': None,
'__loader__': <_frozen_importlib_external.sourcefileloader object at>,
'__spec__': None, '__annotations__': {}, '__builtins__': ,
'__cached__': None, 'func1': , 'glo': {...}}
"""
4. 命名空間的加載順序
First:內置命名空間(程序運行前加載)
Second:全局命名空間(程序運行時加載)
Third:局部命名空間(程序運行中,函數被調用時才加載,當函數返回結果或拋出異常時,被刪除。每個遞歸調用的函數都有自己的命名空間。)
5. 命名空間的查找順序
局部命名空間 -------> 全局命名空間 --------> 內置命名空間
三、作用域,局部變量,全局變量
1. 概念
作用域:變量在程序中的可應用范圍。
局部變量:在函數中定義的變量,只在函數內部生效。
全局變量:在程序一開始定義的變量,在整個程序中起作用。
2. 作用域的分類
Local(函數內部):局部作用域
Enclosing(嵌套函數的外層函數內部):嵌套作用域(閉包)
Global(模塊全局):全局作用域
Built-in(內建):內建作用域
注意:
在Python中,模塊(module),類(class)、函數(def、lambda)會產生新的作用域。而其他代碼塊不會,也就是說,類似分支語句、循環語句、異常捕捉等的變量是可以全局使用的。
3.全局變量和局部變量
全局變量是不可變數據類型,函數無法修改全局變量的值。
全局變量是可變數據類型,函數可以修改全局變量的值。
name = "zs" # 全局變量
def func(arg1):
name = "ls" # 局部變量
age = arg1
print(name) # zs
func(23)
# print(age) # 報錯 NameError: name 'age' is not defined
四、global 和 nonlocal關鍵字
1. global
global關鍵字可以將局部變量變成一個全局變量。
格式: global 變量名
n = 20
def func():
global n # 將n聲明為全局變量
n = n+1
print(n) # 21
func()
print(n) # 21
2. nonlocal
nonlocal關鍵字可以修改外層(非全局)變量。
注意:必須得是嵌套函數,nonlocal才會生效。
格式: nonlocal 變量名
def func():
age = 20
def inner():
# global age # 函數外無age變量,聲明為全局變量會錯誤
nonlocal age # 將內層變量age聲明為外層age
age = age + 1
print(age) # 21
inner()
print(age) # 21
func()
總結
以上是生活随笔為你收集整理的python的函数式编程_Python函数式编程-概念理解,python的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python写货币转换_如何在Pytho
- 下一篇: 已添加了具有相同键的项_奥迪Q2L已上市