5.4
5.45.
4 可呼叫物件
除了使用者定義的函式,呼叫運算子(即())還可以應用到其他物件上。如果想判斷物件能否呼叫,可以使用內建的callable()函式。python的資料模型文件列出了以下7種可呼叫物件。
python中的可呼叫型別有很多,因此可以通過內建函式callable()來判斷物件是否可呼叫。
使用者自定義函式 ———— 每個函式名都有乙個值,該值的型別是可以被直譯器識別為使用者定義函式的型別(還是用了上一節中的例子?)
>>
>
[callable
(i)for i in
(fruits, func1,12,
'hello')]
[false
,true
,false
,false
]>>
>
[callable
(i)for i in
(my_func,
int,
str)][
true
,true
]
5.5
5.55.
5 使用者定義的可呼叫型別
import random
class
bingocase
:def
__init__
(self, items)
: self._items =
list
(items)
random.shuffle(self._items)
defpick
(self)
:try
:return self._items.pop(
)except indexerror:
raise lookuperror(
'pick from empty bingocase'
)def
__call__
(self,
*args,
**kwargs)
:return self.pick(
)bc = bingocase(
range(4
))print
(bc.pick())
# 3print
(bc())
# 0print
(callable
(bc)
)# true
實現__call__方法的類是建立函式類物件的簡便方法。
我們把這個型別的物件當作函式來使用,相當於過載了括號運算子。
5.6
5.65.
6 函式內省
函式物件有很多很多的屬性,除了我們之前提到的__doc__還有以下常用屬性:
屬性說明
doc用於獲取函式的文件說明,如果沒有,則返回 none
name獲取函式的名稱
module返回函式所在的模組,如果無則返回none
defaults以元組的形式返回函式的預設引數,如果無缺省引數則返回none
dict包含了類裡可用的屬性名-屬性的字典;也就是可以使用類名.屬性名訪問的物件
class該例項的類物件
self僅方法可用,如果是繫結的(bound),則指向呼叫該方法的類(如果是類方法)或例項(如果是例項方法),否則為none
示例如下:
>>
> func1.__doc__
' return n!'
>>
> func1.__name__
'func1'
>>
> func1.__class__
# '__iter__'
>>
> func1.__qualname__
'func1'
>>
> func1.__module__
'__main__'
>>
> func1.__code__
,file
"", line 1
>
>>
> func1.__globals__
""",
'reverse': , 'reduce': ,
'add': }
"""
從定位引數到僅限關鍵字引數python中有乙個很好的特性就是提供了極為靈活的引數處理機制。*args, **kwargs這兩個不定引數可以幫我們省去很多麻煩。
在呼叫函式時,使用*或者**可以展開迭代物件,從而對映到單個引數。
示例如下:
>>
>
defbooks
(name, cls=
none
,*content,
**attrs):.
..if cls is
notnone:.
.. attrs[
'class'
]= cls..
.if attrs:..
. attr_str =
''.join(
' %s="%s"'
%(attr, value)..
.for attr, value in
sorted
(attrs.items())
)...
else:.
.. attr_str =''.
..if content:..
.return
'\n'
.join(
'%s'
%(name, attr_str, c, name)..
.for c in content)..
.else:.
..return
''%(name, attr_str)
>>
> books(
'br')'
'>>
> books(
'p',
'hello')''
>>
> books(
'p', div,
'hello'
,'world'
)'hello\nworld'
>>
> my_tag =
>>
> books(
**my_tag)
'
在my_tag前面加上了**之後,字典中的所有元素都作為單個引數傳入,同名的鍵就會自動繫結在指定位置,餘下的則被**attrs捕獲。 51假期讀書筆記 上 流暢的python
今天是51假期,我開啟了新的一章,第五章 一等函式 程式語言理論家將 一等物件 定義為滿足下述條件的程式實體 因此,按照以上的標準,整數 字串和字典都是一等物件。5.1 5.15.1 把函式視作物件 deffunc1 n return n n n 1.return n.func1 1 2 func1...
《流暢的Python》讀書筆記
第1章 python資料模型 通過實現特殊方法,自定義資料型別可以表現得和內建型別一樣 repr 方便除錯和記錄日誌,str 方便使用者看 序列資料型別特殊方法使用最多 第2章 序列構成的陣列 系列型別可分為 可變和不可變 扁平序列和容器序列 列表推導生成器表示式提供了靈活構建和初始化序列的方式 元...
流暢的python讀書筆記
1.雖然也可以用列表推導來初始化元組 陣列或其他序列型別,但是生成器表示式是更好的選擇。這是因為生成器表示式背後遵守了迭代器協議,可以逐個地產出元素,而不是先建立乙個完整的列表,然後再把這個列表傳遞到某個建構函式裡。前面那種方式顯然能夠節省記憶體。生成器表示式的語法跟列表推導差不多,只不過把方括號換...