Python 中的隱藏特性

2021-07-04 12:06:35 字數 3343 閱讀 5215

在 stackoverflow 上看到有乙個討論 hidden features of python 很有意思,因此將上面的問題和答案收集起來,以便以後查閱。

你可以通過使用***來拆分乙個作為函式引數的元組、列表或者字典。

def

draw_point

(x, y):

print x, y

point_foo = ('a', 'b')

point_list = [5, 4]

point_bar =

draw_point(*point_foo) #a b

draw_point(*point_list) #5 4

draw_point(**point_bar) #2 3

可以注意一下上述**中print x, y的用法哦。

>>> x = 5

>>>

1< x < 10

true

>>>

10< x < 20

false

>>> x < 10

< x*10

< 100

true

>>>

10 > x <= 9

true

>>>

5 == x > 4

true

>>>

true > 4

false

你有可能會認為先執行1 < x,返回true,然後比較true < 10,返回true。然而並不是這樣的(上述邏輯對於**的最後兩個例子不成立)。連環比較運算子其實是將1 < x < 10轉化成1 < x and x < 10,將x < 10 < x*10 < 100轉化成x < 10 and 10 < x * 10 and x*10 < 100

修飾符允許將乙個函式或者方法封裝到另乙個可以新增功能、修改引數或者結果等的函式中。修飾符需要寫在函式定義的上一行,並且以@開頭。

下面的例子介紹了print_args修飾符在呼叫被修飾函式(write函式)之前,列印了被修飾函式的引數:

>>> def print_args(function):

... print 'arguments:', args, kwargs

...return

function(*args, **kwargs)

......

>>> @print_args

... def write(text):

... print text

...>>> write('foo')

arguments: ('foo',) {}

foo

這部分還沒看懂,留到以後再研究。

下面例子的意圖是:當不帶引數呼叫函式時,列印乙個預設的列表 [1]。但是結果並沒有達到預期:

>>> def foo(x=):

... print x

...>>> foo()

[1]>>> foo()

[1, 1]

>>> foo()

[1, 1, 1]

為了達到預設引數的作用,應該這樣做:

>>> def foo(x=none):

...if x is none:

... x =

... print x

...>>> foo()

[1]>>> foo()

[1]>>> foo([2,1,'a'])

[2, 1, 'a', 1]

>>> foo()

[1]

或者

>>> def foo(x=none):

... x = x or

... print x

...>>> foo()

[1]>>> foo()

[1]>>> foo([2,1,'a'])

[2, 1, 'a', 1]

>>> foo()

[1]

當你使用小圓點來訪問乙個成員時(例如,x.y),python 首先會在例項字典中查詢該成員。如果找不到,會繼續在類字典中查詢。如果在類字典中找到,並且該物件實現了描述符的協議,而不是僅僅返回成員,那麼 python 會執行它。乙個描述符是指任何實現了__get____set____delete__方法的類。

下面使用描述符來實現自己的 property 類:

class

property

(object):

def__init__

(self, fget):

self.fget = fget

def__get__

(self, obj, type):

if obj is

none:

return self

return self.fget(obj)

接下來,你就可以像使用內建的 property() 一樣使用上面的類:

class

myclass

(object):

@property

deffoo

(self):

return

"foo!"

這一部分我也沒搞懂,詳細的可以參考 how-to guide for descriptors。

將乙個可迭代物件包進 enumerate 中,它會輸出索引和對應的項。例如:

>>> a = ['a', 'b', 'c', 'd', 'e']

>>> for index, item in enumerate(a): print index, item

...0 a

1 b2 c

3 d4 e

>>> b = ('a', 'b', 'c', 'd', 'e')

>>> for index, item in enumerate(b): print index, item

...0 a

1 b2 c

3 d4 e

python中物件的特性 Python物件型別解析

課課家將講述python的物件型別,包括數字 整型 布林型 長整形 浮點型 複數型 字串 列表 元組 字典等。python使用物件模型來儲存資料。構造任何型別的值都是乙個物件。所有的python物件都擁有三個特性 身份 型別 值。身份 每乙個物件都有乙個唯一的身份來標誌自己,任何物件的身份可以使用內...

C 特性 隱藏和覆蓋

c 類中覆蓋與隱藏一直是乙個容易理解出錯的地方,接下來我就詳細講解一下區別在何處 覆蓋指的是子類覆蓋父類函式 被覆蓋 特徵是 1.分別位於子類和父類中 2.函式名字與引數都相同 3.父類的函式是虛函式 virtual 隱藏指的是子類隱藏了父類的函式 還存在 具有以下特徵 子類的函式與父類的名稱相同,...

Python隱藏特性 字串駐留 常量摺疊

下面是python字串的一些微妙的特性,絕對會讓你大吃一驚。案例一 a some string id a 140420665652016 id some string 注意兩個的id值是相同的.140420665652016案例二 a wtf b wtf a is b true a wtf b wt...