51假期讀書筆記 下 流暢的python

2021-09-20 13:00:58 字數 3553 閱讀 6764

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.雖然也可以用列表推導來初始化元組 陣列或其他序列型別,但是生成器表示式是更好的選擇。這是因為生成器表示式背後遵守了迭代器協議,可以逐個地產出元素,而不是先建立乙個完整的列表,然後再把這個列表傳遞到某個建構函式裡。前面那種方式顯然能夠節省記憶體。生成器表示式的語法跟列表推導差不多,只不過把方括號換...