作用就是把合理的數(shù)據(jù)轉(zhuǎn)換為需要的類型。int()整數(shù),float()浮點(diǎn)數(shù),str()字符串,list()列表,tuple()元組,set()集合……
創(chuàng)新互聯(lián)主營德保網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,app軟件定制開發(fā),德保h5微信小程序開發(fā)搭建,德保網(wǎng)站營銷推廣歡迎德保等地區(qū)企業(yè)咨詢
比如a='12'這個(gè)是字符串類型,用int函數(shù)a=int(a)這時(shí)變量a就是整型,字符串'12'變?yōu)榱苏麛?shù)12。Python沒有變量聲明的要求,變量的屬性在賦值時(shí)確定,這樣變量的類型就很靈活。
有一種題目判斷一個(gè)整數(shù)是否回文數(shù),用字符串來處理就很簡單
a=1234321#整數(shù)
if str(a)==str(a)[::-1]:#借助字符串反轉(zhuǎn)比較就可以確定是否回文數(shù)。
還比如元組b=(1,3,2,4),元組是不可以更新刪除排序成員的,但是列表是可以的,通過列表函數(shù)進(jìn)行轉(zhuǎn)換來實(shí)現(xiàn)元組的更新刪除和排序。
b=(1,3,2,4)
b=list(b)
b.sort()
b=tuple(b)
這時(shí)得到的元組b就是一個(gè)升序的元組(1,2,3,4)
再比如你要輸入創(chuàng)建整數(shù)列表或者整數(shù)元組基本上寫法相同,就是用對應(yīng)的函數(shù)來最后處理。
ls=list(map(int,input().split()))#這個(gè)就是列表
tup=tuple(map(int,input().split()))#這個(gè)就是元組
再比如有個(gè)叫集合的,集合有唯一性,可以方便用來去重。
ls=[1,2,3,1,2,3,1,2,3]
ls=list(set(ls))#通過set()去重后,現(xiàn)在的ls里就是[1,2,3]去重后的列表。
在Python中,訪問一個(gè)屬性的優(yōu)先級順序按照如下順序:
1.類屬性
2.數(shù)據(jù)描述符
3.實(shí)例屬性
4.非數(shù)據(jù)描述符
5.__getattr__()方法。這個(gè)方法的完整定義如下所示:
[python] view plain copy
def __getattr__(self,attr) :#attr是self的一個(gè)屬性名
pass;
先來闡述下什么叫數(shù)據(jù)描述符。
數(shù)據(jù)描述符是指實(shí)現(xiàn)了__get__,__set__,__del__方法的類屬性(由于Python中,一切皆是對象,所以你不妨把所有的屬性也看成是對象)
PS:個(gè)人覺得這里最好把數(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是指去訪問屬性所在的方法,最后一個(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è)垃圾對象時(shí)所調(diào)用到的析構(gòu)函數(shù),只是這個(gè)函數(shù)永遠(yuǎn)不會(huì)拋出異常。因?yàn)檫@個(gè)對象已經(jīng)沒有引用指向它,拋出異常沒有任何意義。
接下來,我們來一一比較這些優(yōu)先級.
首先來看類屬性
[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是沒有關(guān)系的。a.foo=4 這句話給a對象增加了一個(gè)屬性叫foo。其值是4。
最后兩個(gè)語句明確的表明了,我們輸出a.foo和A.foo的值,他們是不同的。
但是為什么a=A()語句后面的print
a.foo輸出了3呢?這是因?yàn)楦鶕?jù)搜索順序找到了類屬性。當(dāng)我們執(zhí)行a.foo=4的時(shí)候,我們讓a對象的foo屬性指向了4這個(gè)對象。但是并沒有改變
類屬性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對象的屬性。第二次是類屬性。不是說類屬性的優(yōu)先級比
實(shí)例屬性的高嗎。為啥第一次輸出的是4而不是3呢?還是上面解釋的原因。因?yàn)閍.foo與類屬性的foo只是重名而已。我們print
a.foo的時(shí)候,a的foo指向的是4,所以輸出了4。
------------------------------------
然后我們來看下數(shù)據(jù)描述符這一全新的語言概念。按照之前的定義,一個(gè)實(shí)現(xiàn)了__get__,__set__,__del__的類都統(tǒng)稱為數(shù)據(jù)描述符。我們來看下一個(gè)簡單的例子。
[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語句打印出來的都是None。這說明a.foo都沒有被賦值內(nèi)容。這是因?yàn)開_get__函數(shù)的函數(shù)體什么工作都沒有做。直接是pass。此時(shí),想要訪問foo,每次都沒有返回內(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
為了加深對數(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為我們在對a.foo賦值的時(shí)候,人為的將13加上3后作為foo的值,第二個(gè)6是我們在返回a.foo之前人為的將它減去了10。
所以我們可以猜測,常規(guī)的Python類在定義get,set方法的時(shí)候,如果無特殊需求,直接給對應(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í)候做類型檢查的功能。
-----------------------------------------------
下面我們來看下實(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ù)描述符呢?
簡單的說,就是沒有實(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列出給定對象的屬性或者是從這個(gè)對象能夠達(dá)到的對象。
回到print dir(call)方法的輸出,看到,call方法,有輸出的那么多個(gè)屬性。其中就包含了__get__函數(shù)。但是卻沒有__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
可見,實(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是屬性名
一、主體不同
1、類:是面向?qū)ο蟪绦蛟O(shè)計(jì)實(shí)現(xiàn)信息封裝的基礎(chǔ)。
2、函數(shù):是指一段在一起的、可以做某一件事兒的程序。也叫做子程序、(OOP中)方法。
二、特點(diǎn)不同
1、類:是一種用戶定義的引用數(shù)據(jù)類型,也稱類類型。每個(gè)類包含數(shù)據(jù)說明和一組操作數(shù)據(jù)或傳遞消息的函數(shù)。類的實(shí)例稱為對象。
2、函數(shù):分為全局函數(shù)、全局靜態(tài)函數(shù);在類中還可以定義構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、成員函數(shù)、友元函數(shù)、運(yùn)算符重載函數(shù)、內(nèi)聯(lián)函數(shù)等。
三、規(guī)則不同
1、類:實(shí)質(zhì)是一種引用數(shù)據(jù)類型,類似于byte、short、int(char)、long、float、double等基本數(shù)據(jù)類型,不同的是它是一種復(fù)雜的數(shù)據(jù)類型。
2、函數(shù):函數(shù)必須聲明后才可以被調(diào)用。調(diào)用格式為:函數(shù)名(實(shí)參)調(diào)用時(shí)函數(shù)名后的小括號(hào)中的實(shí)參必須和聲明函數(shù)時(shí)的函數(shù)括號(hào)中的形參個(gè)數(shù)相同。
參考資料來源:百度百科-函數(shù)
參考資料來源:百度百科-類
python的一切數(shù)據(jù)類型都是對象。但是python的對象分為不可變對象和可變對象。python的變量是引用,對python變量的賦值是引用去綁定該對象。
可變對象的數(shù)據(jù)發(fā)生改變,例如列表和字典,引用不會(huì)更改綁定對象,畢竟本身就是用于增刪改查的,頻繁地產(chǎn)生新對象必然導(dǎo)致開銷巨大,只需要該對象內(nèi)部變化就行;但對于綁定了不可變對象的引用,對象一旦改變就會(huì)使引用綁定新的對象。
這一點(diǎn)也會(huì)反應(yīng)到函數(shù)的參數(shù)上。python的傳值方式是“傳對象”引用。python的函數(shù),形參實(shí)際上是引用,實(shí)參便是對象綁定到該引用上。本質(zhì)是形參會(huì)被作為函數(shù)的局部變量,在開辟的函數(shù)的棧內(nèi)存中被聲明。
簡要來講:
如果參數(shù)是數(shù),則類似值傳遞,
如果參數(shù)是列表和字典,則類似引用傳遞。
每個(gè)對象都會(huì)有個(gè)id, 可以用id()驗(yàn)證以上說法:
這個(gè)函數(shù)的參數(shù)是列表,是可變對象。
新聞標(biāo)題:包含函數(shù)是數(shù)據(jù)嗎python的詞條
本文URL:http://jinyejixie.com/article18/dosghdp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、做網(wǎng)站、企業(yè)網(wǎng)站制作、網(wǎng)站內(nèi)鏈、軟件開發(fā)、響應(yīng)式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)