對于習(xí)慣了Java等面向?qū)ο笳Z言,可能會對其任何對象都可以用類來表示已經(jīng)習(xí)慣,但是python語言的靈活多變可能讓你感到很不習(xí)慣,對于很多騷操作很感到吃驚(:
但是其實實際上是不能真正的理解python中的一切皆對象的概念,當(dāng)你真正理解其概念后,你才會明白原來python的強大
python 中函數(shù)與類都是對象
python 中函數(shù)和類,甚至是模塊都是對象,函數(shù)大部分情況下可以作為類來用,而且都是第一類對象,什么是第一類對象?
第一類對象的通用特性:
- 可作為值傳遞,賦值給另一個對象;
- 可以作為元素添加到集合對象中;
- 可以作為參數(shù)傳遞給其他函數(shù);
- 可以作為函數(shù)的返回值。
函數(shù)賦值給變量,通過變量就可以調(diào)用
def f1(str):
return len(str)
# 函數(shù)賦值給變量,通過變量就可以調(diào)用
temp=f1
print temp('hello')
注意這里是值傳遞,即使刪除f1,也可以通過temp調(diào)用該函數(shù)
def f1(str):
return len(str)
# 函數(shù)賦值給變量,通過變量就可以調(diào)用
temp=f1
del f1
print temp('hello')
作為元素添加到集合中
def f2(str1,str2):
return str1+str2
# 作為元素添加到集合中
a=[]
a.append(f1)
a.append(f2)
print a[0]('hello')
print a[1]('hello','world')
作為參數(shù)
def func(f,str):
return f(str)
print func(f1,'hello')
作為函數(shù)的返回值
def mutiply(x,y):
reutrn x*y
def sub(x,y):return x-y
def func2(i):if i==1: return mutiplyelse:return sub
temp=func2(2)
print temp(2,4)
使用函數(shù)的對象特性
已經(jīng)知道函數(shù)就是對象.因此,對象:
- 可以賦值給一個變量
- 可以在其他函數(shù)里定義
賦值在前面已經(jīng)提到了,函數(shù)可以賦值給任意的變量,當(dāng)作變量來使用,同時還可以在函數(shù)里定義另一個函數(shù)
def getTalk(kind="shout"):
# 在函數(shù)里定義一個函數(shù)
def shout(word="yes"):
return word.capitalize()+"!"
def whisper(word="yes") :
return word.lower()+"...";
# 返回一個函數(shù)
if kind == "shout":
# 這里不用"()",我們不是要調(diào)用函數(shù)
# 只是返回函數(shù)對象
return shout
else:
return whisper
# 怎么用這個特性呢?
# 把函數(shù)賦值給變量
talk = getTalk()
# 可以看到"talk"是一個函數(shù)對象
print talk
# 輸出 : <function shout at 0xb7ea817c>
# 函數(shù)返回的是對象:
print talk()
# 輸出 : Yes!
# 不嫌麻煩你也可以這么用
print getTalk("whisper")()
# 輸出 : yes...
這里要注意賦值時括號的使用,括號表示調(diào)用函數(shù),而賦值時時不需要調(diào)用函數(shù)的,
talk = getTalk(),這里是把第一層函數(shù)賦值給了talk,,所以調(diào)用時可以talk()調(diào)用,當(dāng)然也可以直接 talk=getTalk,調(diào)用時talk()()來調(diào)用
那么這個特性也就行成了函數(shù)的嵌套與閉包
嵌套與閉包
函數(shù)的嵌套
def fun1():
def fun2():
def fun3():
print("Hello world!")
return fun3
return fun2
a=fun1()
# a()
fun1()()()
Hello world!
函數(shù)的閉包
閉包函數(shù)就是函數(shù)可以讀取到與自己不是一個作用域的局部變量
1.必須有一個內(nèi)嵌函數(shù)
2.內(nèi)嵌函數(shù)必須引用外部函數(shù)中的變量
3.外部函數(shù)的返回值必須是內(nèi)嵌函數(shù)
def fun1(x):
def fun2(y):
print(x+y)
return fun2
fun1(2)(3)
5
裝飾器,匿名函數(shù),map函數(shù)等都是函數(shù)的變體,都是通過這些基本特性來實現(xiàn)的
其次,Python中的函數(shù)是最高等級的對象,而不僅僅是一小段代碼.
一個函數(shù)是一個被它自己定義而執(zhí)行的對象;默認參數(shù)是一種"成員數(shù)據(jù)",所以它們的狀態(tài)和其他對象一樣,會隨著每一次調(diào)用而改變.