val[0:-1]是python特有的切片操作,也叫切割操作,這里的下標(biāo)0表示左起第一個(gè)元素, -1表示倒數(shù)最后一個(gè)元素。
成都創(chuàng)新互聯(lián)公司一直在為企業(yè)提供服務(wù),多年的磨煉,使我們?cè)趧?chuàng)意設(shè)計(jì),營(yíng)銷型網(wǎng)站到技術(shù)研發(fā)擁有了開(kāi)發(fā)經(jīng)驗(yàn)。我們擅長(zhǎng)傾聽(tīng)企業(yè)需求,挖掘用戶對(duì)產(chǎn)品需求服務(wù)價(jià)值,為企業(yè)制作有用的創(chuàng)意設(shè)計(jì)體驗(yàn)。核心團(tuán)隊(duì)擁有超過(guò)10多年以上行業(yè)經(jīng)驗(yàn),涵蓋創(chuàng)意,策化,開(kāi)發(fā)等專業(yè)領(lǐng)域,公司涉及領(lǐng)域有基礎(chǔ)互聯(lián)網(wǎng)服務(wù)成都服務(wù)器托管、成都app開(kāi)發(fā)、手機(jī)移動(dòng)建站、網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)絡(luò)整合營(yíng)銷。
取一個(gè)list或tuple的部分元素是非常常見(jiàn)的操作。比如,一個(gè)list如下:
“L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']”
取前3個(gè)元素,利用切片操作就是“L[0:3]”。如果第一個(gè)索引是0,還可以省略“L[:3]”。
也可以從索引1開(kāi)始,取出2個(gè)元素出來(lái),L[1:3],顯示的結(jié)果就是“['Sarah', 'Tracy']”。
類似的,既然Python支持L[-1]取倒數(shù)第一個(gè)元素,那么它同樣支持倒數(shù)切片,試試“L[-2:]”,返回的就是“['Bob', 'Jack']”,記住倒數(shù)第一個(gè)元素的索引是-1。
擴(kuò)展資料:
對(duì)于具有序列結(jié)構(gòu)的數(shù)據(jù)來(lái)說(shuō),切片操作的方法是:consequence[start_index: end_index: step]。
1、start_index:表示是第一個(gè)元素對(duì)象,正索引位置默認(rèn)為0;負(fù)索引位置默認(rèn)為 -len(consequence)
2、end_index:表示是最后一個(gè)元素對(duì)象,正索引位置默認(rèn)為 len(consequence)-1;負(fù)索引位置默認(rèn)為 -1。
3、step:表示取值的步長(zhǎng),默認(rèn)為1,步長(zhǎng)值不能為0。
注意:對(duì)于序列結(jié)構(gòu)數(shù)據(jù)來(lái)說(shuō),索引和步長(zhǎng)都具有正負(fù)兩個(gè)值,分別表示左右兩個(gè)方向取值。索引的正方向從左往右取值,起始位置為0;負(fù)方向從右往左取值,起始位置為-1。因此任意一個(gè)序列結(jié)構(gòu)數(shù)據(jù)的索引范圍為 -len(consequence) 到 len(consequence)-1 范圍內(nèi)的連續(xù)整數(shù)。
切片操作會(huì)將按照給定的索引和步長(zhǎng),截取序列中由連續(xù)的對(duì)象組成的片段,單個(gè)索引返回值可以視為只含有一個(gè)對(duì)象的連續(xù)片段。
切片的過(guò)程是從第一個(gè)想要的對(duì)象開(kāi)始,到第一個(gè)不想要的對(duì)象結(jié)束。第一個(gè)想要的對(duì)象到第一個(gè)不想要的對(duì)象之間的連續(xù)對(duì)象就是你所有想要的對(duì)象。
因此在consequence[start_index: end_index]中,切片中包含了consequence[start_index],但不包括consequence[end_index]。
參考資料來(lái)源:百度百科——python
val()函數(shù)語(yǔ)法為:
i. val(字符表達(dá)式)
val()函數(shù)的功能為:將一組字符型數(shù)據(jù)的數(shù)字部分轉(zhuǎn)換成相應(yīng)的數(shù)值型數(shù)據(jù)
val()函數(shù)用法:
1. 例 x = "12 5fdsa DA456";
那么 val(x)應(yīng)該返回125 后面的456不能返回來(lái)。
val()函數(shù)當(dāng)識(shí)別到非數(shù)字,停止讀入字符串。即如果字符串內(nèi)有字母或其他非數(shù)字字符,val()函數(shù)只轉(zhuǎn)換第一個(gè) 非數(shù)字字符之前的數(shù)字。當(dāng)字符串的首字符為非數(shù)字時(shí),返回值為0。
但是該函數(shù)可以識(shí)別進(jìn)制符號(hào)比如八進(jìn)制、十六進(jìn)制。字符串中的空格和換行符也會(huì)從該參數(shù)中被去掉。
2. 例 a = "五顆星";
b = 3;
當(dāng)進(jìn)行運(yùn)算 a + b 時(shí)顯然是錯(cuò)誤的。若想得到返回值為8,就要使用 val()函數(shù)
c = val(a) + b; 此時(shí)c的值為8。
ii. Val(C, V, Site)
功能為:將字符串C轉(zhuǎn)換成與V相同的數(shù)值類型,并把轉(zhuǎn)換后的結(jié)果賦值給V,如果字符串中有非數(shù)字,則V=0。Site用于返回非數(shù)字字符的位置。
推薦學(xué)習(xí)《python教程》。
基本算法就是二叉樹(shù)的遍歷,首先想到的是深度優(yōu)先遍歷。
難點(diǎn)在于,如何實(shí)現(xiàn)每個(gè)子路徑的記錄和append
binaryTreePaths函數(shù)只給了root變量,無(wú)法存儲(chǔ)每個(gè)子路徑,考慮寫(xiě)輔助函數(shù)res,添加存儲(chǔ)路徑的變量
res(root,temp)
同時(shí)還需要一個(gè)全局變量result存儲(chǔ)最后的輸出結(jié)果,result.append(temp)
1、%.2f是將該浮點(diǎn)數(shù)float保留兩位小數(shù)。2表示保留的位數(shù)。
2、val[0:-1] 是對(duì)字符串的截取操作,str[a:b]表示截取字符串的a開(kāi)始的位置,b表示結(jié)束位置。b是負(fù)數(shù),表示去除后幾位。
由于Python語(yǔ)言的簡(jiǎn)潔性、易讀性以及可擴(kuò)展性,在國(guó)外用Python做科學(xué)計(jì)算的研究機(jī)構(gòu)日益增多,一些知名大學(xué)已經(jīng)采用Python來(lái)教授程序設(shè)計(jì)課程。
擴(kuò)展資料:
關(guān)于python的控制語(yǔ)句:
1、if語(yǔ)句,當(dāng)條件成立時(shí)運(yùn)行語(yǔ)句塊。經(jīng)常與else,elif(相當(dāng)于else if) 配合使用。
2、for語(yǔ)句,遍歷列表、字符串、字典、集合等迭代器,依次處理迭代器中的每個(gè)元素。
3、while語(yǔ)句,當(dāng)條件為真時(shí),循環(huán)運(yùn)行語(yǔ)句塊。
4、class語(yǔ)句,用于定義類型。
5、def語(yǔ)句,用于定義函數(shù)和類型的方法。
6、try語(yǔ)句,與except,finally配合使用處理在程序運(yùn)行中出現(xiàn)的異常情況。
7、class語(yǔ)句,用于定義類型。
8、def語(yǔ)句,用于定義函數(shù)和類型的方法。
參考資料來(lái)源:百度百科-Python
pow(2,1000)的結(jié)果是一個(gè)int型,而int型數(shù)據(jù)是不能用len函數(shù)來(lái)獲取長(zhǎng)度的,要把它轉(zhuǎn)換成string型再獲取長(zhǎng)度,str(val)就是把val轉(zhuǎn)換成string型
在Python中,訪問(wèn)一個(gè)屬性的優(yōu)先級(jí)順序按照如下順序:
1.類屬性
2.數(shù)據(jù)描述符
3.實(shí)例屬性
4.非數(shù)據(jù)描述符
5.__getattr__()方法。這個(gè)方法的完整定義如下所示:
[python] view plain copy
def __getattr__(self,attr) :#attr是self的一個(gè)屬性名
pass;
先來(lái)闡述下什么叫數(shù)據(jù)描述符。
數(shù)據(jù)描述符是指實(shí)現(xiàn)了__get__,__set__,__del__方法的類屬性(由于Python中,一切皆是對(duì)象,所以你不妨把所有的屬性也看成是對(duì)象)
PS:個(gè)人覺(jué)得這里最好把數(shù)據(jù)描述符等效于定義了__get__,__set__,__del__三個(gè)方法的接口。
闡述下這三個(gè)方法:
__get__的標(biāo)準(zhǔn)定義是__get__(self,obj,type=None),它非常接近于JavaBean的get
第一個(gè)函數(shù)是調(diào)用它的實(shí)例,obj是指去訪問(wèn)屬性所在的方法,最后一個(gè)type是一個(gè)可選參數(shù),通常為None(這個(gè)有待于進(jìn)一步的研究)
例如給定類X和實(shí)例x,調(diào)用x.foo,等效于調(diào)用:
type(x).__dict__["foo"].__get__(x,type(x))
調(diào)用X.foo,等效于調(diào)用:
type(x).__dict__["foo"].__get__(None,type(x))
第二個(gè)函數(shù)__set__的標(biāo)準(zhǔn)定義是__set__(self,obj,val),它非常接近于JavaBean的set方法,其中最后一個(gè)參數(shù)是要賦予的值
第三個(gè)函數(shù)__del__的標(biāo)準(zhǔn)定義是__del__(self,obj),它非常接近Java中Object的Finailize()方法,指
Python在回收這個(gè)垃圾對(duì)象時(shí)所調(diào)用到的析構(gòu)函數(shù),只是這個(gè)函數(shù)永遠(yuǎn)不會(huì)拋出異常。因?yàn)檫@個(gè)對(duì)象已經(jīng)沒(méi)有引用指向它,拋出異常沒(méi)有任何意義。
接下來(lái),我們來(lái)一一比較這些優(yōu)先級(jí).
首先來(lái)看類屬性
[python] view plain copy
# -*- coding:utf-8 -*-
'''''
Created on 2013-3-29
@author: naughty
'''
class A(object):
foo=3
print A.foo
a=A()
print a.foo
a.foo=4
print a.foo
print A.foo
上面這段代碼的輸出如下:
3
3
4
3
從輸出可以看到,當(dāng)我們給a.foo賦值的時(shí)候,其實(shí)與類實(shí)例的那個(gè)foo是沒(méi)有關(guān)系的。a.foo=4 這句話給a對(duì)象增加了一個(gè)屬性叫foo。其值是4。
最后兩個(gè)語(yǔ)句明確的表明了,我們輸出a.foo和A.foo的值,他們是不同的。
但是為什么a=A()語(yǔ)句后面的print
a.foo輸出了3呢?這是因?yàn)楦鶕?jù)搜索順序找到了類屬性。當(dāng)我們執(zhí)行a.foo=4的時(shí)候,我們讓a對(duì)象的foo屬性指向了4這個(gè)對(duì)象。但是并沒(méi)有改變
類屬性foo的值。所以最后我們print A.foo的時(shí)候,又輸出了3。
[python] view plain copy
# -*- coding:utf-8 -*-
'''''
Created on 2013-3-29
@author: naughty
'''
class A(object):
foo=3
a=A()
a.foo=4
print a.foo
del a.foo
print a.foo
上面的代碼,我給a.foo賦值為4,在輸出一次之后就del了。兩次輸出,第一次輸出的是a對(duì)象的屬性。第二次是類屬性。不是說(shuō)類屬性的優(yōu)先級(jí)比
實(shí)例屬性的高嗎。為啥第一次輸出的是4而不是3呢?還是上面解釋的原因。因?yàn)閍.foo與類屬性的foo只是重名而已。我們print
a.foo的時(shí)候,a的foo指向的是4,所以輸出了4。
------------------------------------
然后我們來(lái)看下數(shù)據(jù)描述符這一全新的語(yǔ)言概念。按照之前的定義,一個(gè)實(shí)現(xiàn)了__get__,__set__,__del__的類都統(tǒng)稱為數(shù)據(jù)描述符。我們來(lái)看下一個(gè)簡(jiǎn)單的例子。
[python] view plain copy
# -*- coding:utf-8 -*-
'''''
Created on 2013-3-29
@author: naughty
'''
class simpleDescriptor(object):
def __get__(self,obj,type=None):
pass
def __set__(self,obj,val):
pass
def __del__(self,obj):
pass
class A(object):
foo=simpleDescriptor()
print str(A.__dict__)
print A.foo
a=A()
print a.foo
a.foo=13
print a.foo
上面例子的輸出結(jié)果如下:
[plain] view plain copy
{'__dict__': attribute '__dict__' of 'A' objects, '__module__': '__main__', 'foo': __main__.simpleDescriptor object at 0x005511B0, '__weakref__': attribute '__weakref__' of 'A' objects, '__doc__': None}
None
None
None
從輸出結(jié)果看出,print語(yǔ)句打印出來(lái)的都是None。這說(shuō)明a.foo都沒(méi)有被賦值內(nèi)容。這是因?yàn)開(kāi)_get__函數(shù)的函數(shù)體什么工作都沒(méi)有做。直接是pass。此時(shí),想要訪問(wèn)foo,每次都沒(méi)有返回內(nèi)容,所以輸出的內(nèi)容就是None了。
[python] view plain copy
# -*- coding:utf-8 -*-
'''''
Created on 2013-3-29
@author: naughty
'''
class simpleDescriptor(object):
def __get__(self,obj,type=None):
return "hi there"
def __set__(self,obj,val):
pass
def __del__(self,obj):
pass
class A(object):
foo=simpleDescriptor()
print str(A.__dict__)
print A.foo
a=A()
print a.foo
a.foo=13
print a.foo
把__get__函數(shù)實(shí)現(xiàn)以下,就可以得到如下輸出結(jié)果:
[plain] view plain copy
{'__dict__': attribute '__dict__' of 'A' objects, '__module__': '__main__', 'foo': __main__.simpleDescriptor object at 0x00671190, '__weakref__': attribute '__weakref__' of 'A' objects, '__doc__': None}
hi there
hi there
hi there
為了加深對(duì)數(shù)據(jù)描述符的理解,看如下例子:
[python] view plain copy
# -*- coding:utf-8 -*-
'''''
Created on 2013-3-29
@author: naughty
'''
class simpleDescriptor(object):
def __init__(self):
self.result = None;
def __get__(self, obj, type=None) :
return self.result - 10;
def __set__(self, obj, val):
self.result = val + 3;
print self.result;
def __del__(self, obj):
pass
class A(object):
foo = simpleDescriptor();
a = A();
a.foo = 13;
print a.foo;
上面代碼的輸出是
16
6
第一個(gè)16為我們?cè)趯?duì)a.foo賦值的時(shí)候,人為的將13加上3后作為foo的值,第二個(gè)6是我們?cè)诜祷豠.foo之前人為的將它減去了10。
所以我們可以猜測(cè),常規(guī)的Python類在定義get,set方法的時(shí)候,如果無(wú)特殊需求,直接給對(duì)應(yīng)的屬性賦值或直接返回該屬性值。如果自己定義類,并且繼承object類的話,這幾個(gè)方法都不用定義。
-----------------
在這里看一個(gè)題外話。
看代碼
[python] view plain copy
# -*- coding:utf-8 -*-
'''''
Created on 2013-3-29
@author: naughty
'''
class simpleDescriptor(object):
def __init__(self):
self.result = None;
def __get__(self, obj, type=None) :
return self.result - 10;
def __set__(self, obj, val):
if isinstance(val,str):
assert False,"int needed! but get str"
self.result = val + 3;
print self.result;
def __del__(self, obj):
pass
class A(object):
foo = simpleDescriptor();
a = A();
a.foo = "13";
print a.foo;
上面代碼在__set__ 函數(shù)中檢查了參數(shù)val,如果val是str類型的,那么要報(bào)錯(cuò)。這就實(shí)現(xiàn)了我們上一篇文章中要實(shí)現(xiàn)的,在給屬性賦值的時(shí)候做類型檢查的功能。
-----------------------------------------------
下面我們來(lái)看下實(shí)例屬性和非數(shù)據(jù)描述符。
[python] view plain copy
# -*- coding:utf-8 -*-
'''''
Created on 2013-3-29
@author: naughty
'''
class B(object):
foo = 1.3
b = B()
print b.__dict__
b.bar = 13
print b.__dict__
print b.bar
上面代碼輸出結(jié)果如下:
{}
{'bar': 13}
13
那么什么是非數(shù)據(jù)描述符呢?
簡(jiǎn)單的說(shuō),就是沒(méi)有實(shí)現(xiàn)get,set,del三個(gè)方法的所有類。
讓我們?nèi)我饪匆粋€(gè)函數(shù)的描述:
def call():
pass
執(zhí)行print dir(call)會(huì)得到如下結(jié)果:
[plain] view plain copy
['__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__doc__', '__format__', '__get__', '__getattribute__', '__globals__', '__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_name']
先看下dir的幫助。
dir列出給定對(duì)象的屬性或者是從這個(gè)對(duì)象能夠達(dá)到的對(duì)象。
回到print dir(call)方法的輸出,看到,call方法,有輸出的那么多個(gè)屬性。其中就包含了__get__函數(shù)。但是卻沒(méi)有__set__和__del__函數(shù)。所以所有的類成員函數(shù)都是非數(shù)據(jù)描述符。
看一個(gè)實(shí)例數(shù)據(jù)掩蓋非數(shù)據(jù)描述符的例子:
[python] view plain copy
'''''
Created on 2013-3-29
@author: naughty
'''
class simpleDescriptor(object):
def __get__(self,obj,type=None) :
return "get",self,obj,type
class D(object):
foo=simpleDescriptor()
d=D()
print d.foo
d.foo=15
print d.foo
看輸出:
('get', __main__.simpleDescriptor object at 0x02141190,
__main__.D object at 0x025CAF50, class '__main__.D')
15
可見(jiàn),實(shí)例數(shù)據(jù)掩蓋了非數(shù)據(jù)描述符。
如果改成數(shù)據(jù)描述符,那么就不會(huì)被覆蓋了??聪旅妫?/p>
[python] view plain copy
'''''
Created on 2013-3-29
@author: naughty
'''
class simpleDescriptor(object):
def __get__(self,obj,type=None) :
return "get",self,obj,type
def __set__(self,obj,type=None) :
pass
def __del__(self,obj,type=None) :
pass
class D(object):
foo=simpleDescriptor()
d=D()
print d.foo
d.foo=15
print d.foo
代碼的輸出如下:
[plain] view plain copy
('get', __main__.simpleDescriptor object at 0x01DD1190, __main__.D object at 0x0257AF50, class '__main__.D')
('get', __main__.simpleDescriptor object at 0x01DD1190, __main__.D object at 0x0257AF50, class '__main__.D')
由于是數(shù)據(jù)描述符,__set __函數(shù)體是pass,所以兩次輸出都是同樣的內(nèi)容。
最后看下__getatrr__方法。它的標(biāo)準(zhǔn)定義是:__getattr__(self,attr),其中attr是屬性名