Python 函數對象、生成器 、裝飾器、叠代器、閉包函數
阿新 • • 發佈:2017-05-23
exists 空間 體重 main show pow eth 內存 cit
一、函數對象
正確理解 Python函數,能夠幫助我們更好地理解 Python 裝飾器、匿名函數(lambda)、函數式編程等高階技術。
函數(Function)作為程序語言中不可或缺的一部分,太稀松平常了。但函數作為第一類對象(First-Class Object)卻是 Python 函數的一大特性。那到底什麽是第一類對象(First-Class Object)呢?
在 Python 中萬物皆為對象,函數作為第一類對象有如下特性:
#函數身為一個對象,擁有對象模型的三個通用屬性:id(內存地址)、類型、和值 def foo(text): return len(text) print(type(foo)) #函數類型 print(id(foo))#函數id 內存地址 print(foo)#函數值
- 可以作為變量賦值
#函數可以被引用,即函數可以賦值給一個變量
#!/usr/bin/env python # -*- coding:utf-8 -*- def foo(): print(‘from foo‘) foo() func=foo #引用,賦值 print(foo) print(func) func()
輸出:
from foo
內存地址一樣說明func引用的是foo函數地址,也就是foo將地址賦值給func變量
<function foo at 0x0000000002063E18>
<function foo at 0x0000000002063E18>
- 可以作為容器類型(集合)的元素
#容器對象(list、dict、set等)中可以存放任何對象,包括整數、字符串,函數也可以作存放到容器對象中 def foo(): print("hanjialong") dif={"func":foo} # foo() if __name__ == ‘__main__‘: dif={"func":foo} dif["func"]() #比較函數地址 def foo(): print("hanjialong") dif={"func":foo} print(foo) # dif={"func":foo} # dif["func"]() print(dif["func"])
- 作為參數傳遞給其他函數
def foo(name):#傳入數據類型並計算長度 size = len(name) return size #將結果return def show(func): size = func("jjjjj")#相當於在show函數內部運行foo函數,size接受foo函數的return結果 print("length of string is %s"%size)
show(foo)
- 可以作函數的返回值
""" 函數接受一個或多個函數作為輸入或者函數輸出(返回)的值是函數時,我們稱這樣的函數為高階函數 """ def foo(): print("返回值") def bar(func): return func f = bar(foo) f() bar(foo())
- 函數嵌套
1、嵌套調用 #嵌套函數的意義相當於把一個大需求拆成多個小需求然後組合一起,以如下為例 max2函數式做兩個值得大小比如如果要做多個如10 100個就需要在max4中組合 def max2(x,y): return x if x > y else y def max4(a,b,c,d): res1=max2(a,b) res2=max2(res1,c) res3=max2(res2,d) return res3 print(max4(10,99,31,22)) 2、函數嵌套定義
#函數的嵌套定義
def f1():#第一步進入f1函數
def f2():#第二部f1函數體中有f2函數聲明
print(‘from f2‘)
def f3():#第四部f2函數體中有f3函數聲明
print(‘from f3‘)
f3()#第五部f2函數體中運行f3函數
f2()#第三部f1函數體重運行f2內容
f1()
二、命名空間與作用域
1.命名空間定義
命名空間是名字和對象的映射,就像是字典,key是變量名,value是變量的值
#定義名字的方法 import time name=‘egon‘ #定義變量 def func(): #定義函數 pass class Foo:#定義類 pass
2.命名空間的分類
- 內置名稱空間: 隨著python解釋器的啟動而產生,包括異常類型、內建函數和特殊方法,可以代碼中任意地方調用
print(sum) print(max) print(min) print(max([1,2,3])) import builtins for i in dir(builtins): #打印所有的內置函數 print(i) 復制代碼 結果: C:\Python\Python36\python.exe D:/Python/課件/day4/cc.py <built-in function sum> <built-in function max> <built-in function min> 3 ArithmeticError AssertionError AttributeError BaseException BlockingIOError BrokenPipeError BufferError BytesWarning ChildProcessError ConnectionAbortedError ConnectionError ConnectionRefusedError ConnectionResetError DeprecationWarning EOFError Ellipsis EnvironmentError Exception False FileExistsError FileNotFoundError FloatingPointError FutureWarning GeneratorExit IOError ImportError ImportWarning IndentationError IndexError InterruptedError IsADirectoryError KeyError KeyboardInterrupt LookupError MemoryError ModuleNotFoundError NameError None NotADirectoryError NotImplemented NotImplementedError OSError OverflowError PendingDeprecationWarning PermissionError ProcessLookupError RecursionError ReferenceError ResourceWarning RuntimeError RuntimeWarning StopAsyncIteration StopIteration SyntaxError SyntaxWarning SystemError SystemExit TabError TimeoutError True TypeError UnboundLocalError UnicodeDecodeError UnicodeEncodeError UnicodeError UnicodeTranslateError UnicodeWarning UserWarning ValueError Warning WindowsError ZeroDivisionError __build_class__ __debug__ __doc__ __import__ __loader__ __name__ __package__ __spec__ abs all any ascii bin bool bytearray bytes callable chr classmethod compile complex copyright credits delattr dict dir divmod enumerate eval exec exit filter float format frozenset getattr globals hasattr hash help hex id input int isinstance issubclass iter len license list locals map max memoryview min next object oct open ord pow print property quit range repr reversed round set setattr slice sorted staticmethod str sum super tuple type vars zip Process finished with exit code 0
- 全局名稱空間:文件的執行會產生全局名稱空間,指的是文件級別定義的名字都會放入該空間
x=1 #全局命名空間 def func(): money=2000 #非全局 x=2 print(‘func‘,x)#打印的是x=2的值如果沒有將打印全局的 print(x)#打印的是全局 print(func) func()
- 局部名稱空間:調用函數時會產生局部名稱空間,只在函數調用時臨時綁定,調用結束解綁定
x=10000 #全局 def func(): x=1 #局部 def f1(): pass
3.作用域
- 1. 全局作用域:內置名稱空間,全局名層空間
- 2. 局部作用:局部名稱空間
名字的查找順序:局部名稱空間---》全局名層空間---》內置名稱空間
Python 函數對象、生成器 、裝飾器、叠代器、閉包函數