在 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...