1. 程式人生 > >Python 函數對象、生成器 、裝飾器、叠代器、閉包函數

Python 函數對象、生成器 、裝飾器、叠代器、閉包函數

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 函數對象、生成器 、裝飾器、叠代器、閉包函數