60 個 Python 小例子,拿來即用!

一、 數(shù)字
1 求絕對值
絕對值或復(fù)數(shù)的模
#?公眾號:快學(xué)Python
In?[1]:?abs(-6)??
Out[1]:?6
2 進(jìn)制轉(zhuǎn)化
十進(jìn)制轉(zhuǎn)換為二進(jìn)制:
In?[2]:?bin(10)??
Out[2]:?'0b1010'
十進(jìn)制轉(zhuǎn)換為八進(jìn)制:
In?[3]:?oct(9)??
Out[3]:?'0o11'
十進(jìn)制轉(zhuǎn)換為十六進(jìn)制:
In?[4]:?hex(15)??
Out[4]:?'0xf'
3 整數(shù)和ASCII互轉(zhuǎn)
十進(jìn)制整數(shù)對應(yīng)的ASCII字符
In?[1]:?chr(65)??
Out[1]:?'A'
查看某個ASCII字符對應(yīng)的十進(jìn)制數(shù)
In?[1]:?ord('A')??
Out[1]:?65
4 元素都為真檢查
所有元素都為真,返回?True,否則為False
In?[5]:?all([1,0,3,6])??
Out[5]:?False
In?[6]:?all([1,2,3])??
Out[6]:?True
5 元素至少一個為真檢查
至少有一個元素為真返回True,否則False
In?[7]:?any([0,0,0,[]])??
Out[7]:?False
In?[8]:?any([0,0,1])??
Out[8]:?True
6 判斷是真是假
測試一個對象是True, 還是False.
In?[9]:?bool([0,0,0])??
Out[9]:?True??
??
In?[10]:?bool([])??
Out[10]:?False??
??
In?[11]:?bool([1,0,1])??
Out[11]:?True
7 創(chuàng)建復(fù)數(shù)
創(chuàng)建一個復(fù)數(shù)
In?[1]:?complex(1,2)??
Out[1]:?(1+2j)
8 取商和余數(shù)
分別取商和余數(shù)
In?[1]:?divmod(10,3)??
Out[1]:?(3,?1)
9 轉(zhuǎn)為浮點(diǎn)類型
將一個整數(shù)或數(shù)值型字符串轉(zhuǎn)換為浮點(diǎn)數(shù)
In?[1]:?float(3)??
Out[1]:?3.0
如果不能轉(zhuǎn)化為浮點(diǎn)數(shù),則會報ValueError:
In?[2]:?float('a')??
#?ValueError:?could?not?convert?string?to?float:?'a'
10 轉(zhuǎn)為整型
int(x, base =10) , x可能為字符串或數(shù)值,將x 轉(zhuǎn)換為一個普通整數(shù)。如果參數(shù)是字符串,那么它可能包含符號和小數(shù)點(diǎn)。如果超出了普通整數(shù)的表示范圍,一個長整數(shù)被返回。
In?[1]:?int('12',16)??
Out[1]:?18
11 次冪
base為底的exp次冪,如果mod給出,取余
In?[1]:?pow(3,?2,?4)??
Out[1]:?1
12 四舍五入
四舍五入,ndigits代表小數(shù)點(diǎn)后保留幾位:
In?[11]:?round(10.0222222,?3)??
Out[11]:?10.022??
??
In?[12]:?round(10.05,1)??
Out[12]:?10.1
13 鏈?zhǔn)奖容^
i?=?3??
print(1?#?False??
print(1?#?True
二、 字符串
14 字符串轉(zhuǎn)字節(jié)
字符串轉(zhuǎn)換為字節(jié)類型
In?[12]:?s?=?"apple"??????????????????????????????????????????????????????????????
??
In?[13]:?bytes(s,encoding='utf-8')??
Out[13]:?b'apple'
15 任意對象轉(zhuǎn)為字符串
In?[14]:?i?=?100??????????????????????????????????????????????????????????????????
??
In?[15]:?str(i)??
Out[15]:?'100'??
??
In?[16]:?str([])??
Out[16]:?'[]'??
??
In?[17]:?str(tuple())??
Out[17]:?'()'
16 執(zhí)行字符串表示的代碼
將字符串編譯成python能識別或可執(zhí)行的代碼,也可以將文字讀成字符串再編譯。
In?[1]:?s??=?"print('helloworld')"??
??????
In?[2]:?r?=?compile(s,"" ,?"exec")??
??????
In?[3]:?r??
Out[3]:??at?0x0000000005DE75D0,?file?"" ,?line?1>??
??????
In?[4]:?exec(r)??
helloworld
17 計算表達(dá)式
將字符串str 當(dāng)成有效的表達(dá)式來求值并返回計算結(jié)果取出字符串中內(nèi)容
In?[1]:?s?=?"1?+?3?+5"??
????...:?eval(s)??
????...:??
Out[1]:?9
18 字符串格式化
格式化輸出字符串,format(value, format_spec)實(shí)質(zhì)上是調(diào)用了value的__format__(format_spec)方法。
In?[1]:?print("i?am?{0},age{1}".format("tom",18))??
Out[1]:i?am?tom,age18??


三、 函數(shù)
19 拿來就用的排序函數(shù)
排序:
In?[1]:?a?=?[1,4,2,3,1]??
??
In?[2]:?sorted(a,reverse=True)??
Out[2]:?[4,?3,?2,?1,?1]??
??
In?[3]:?a?=?[{'name':'xiaoming','age':18,'gender':'male'},{'name':'??
?????...:?xiaohong','age':20,'gender':'female'}]??
In?[4]:?sorted(a,key=lambda?x:?x['age'],reverse=False)??
Out[4]:??
[{'name':?'xiaoming',?'age':?18,?'gender':?'male'},??
?{'name':?'xiaohong',?'age':?20,?'gender':?'female'}]
20 求和函數(shù)
求和:
In?[181]:?a?=?[1,4,2,3,1]??
??
In?[182]:?sum(a)??
Out[182]:?11??
#?公眾號:快學(xué)Python
In?[185]:?sum(a,10)?#求和的初始值為10??
Out[185]:?21
21 nonlocal用于內(nèi)嵌函數(shù)中
關(guān)鍵詞nonlocal常用于函數(shù)嵌套中,聲明變量i為非局部變量;如果不聲明,i+=1表明i為函數(shù)wrapper內(nèi)的局部變量,因?yàn)樵?code style="overflow-wrap: break-word;font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(30, 107, 184);background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">i+=1引用(reference)時,i未被聲明,所以會報unreferenced variable的錯誤。
def?excepter(f):??
????i?=?0??
????t1?=?time.time()??
????def?wrapper():??
????????try:??
????????????f()??
????????except?Exception?as?e:??
????????????nonlocal?i??
????????????i?+=?1??
????????????print(f'{e.args[0]}:?{i}')??
????????????t2?=?time.time()??
????????????if?i?==?n:??
????????????????print(f'spending?time:{round(t2-t1,2)}')??
????return?wrapper
22 global 聲明全局變量
先回答為什么要有global,一個變量被多個函數(shù)引用,想讓全局變量被所有函數(shù)共享。有的伙伴可能會想這還不簡單,這樣寫:
i?=?5??
def?f():??
????print(i)??
??
def?g():??
????print(i)??
????pass??
??
f()??
g()
f和g兩個函數(shù)都能共享變量i,程序沒有報錯,所以他們依然不明白為什么要用global.
但是,如果我想要有個函數(shù)對i遞增,這樣:
def?h():??
????i?+=?1??
??
h()
此時執(zhí)行程序,bang, 出錯了!拋出異常:UnboundLocalError,原來編譯器在解釋i+=1時會把i解析為函數(shù)h()內(nèi)的局部變量,很顯然在此函數(shù)內(nèi),編譯器找不到對變量i的定義,所以會報錯。
global就是為解決此問題而被提出,在函數(shù)h內(nèi),顯式地告訴編譯器i為全局變量,然后編譯器會在函數(shù)外面尋找i的定義,執(zhí)行完i+=1后,i還為全局變量,值加1:
i?=?0??
def?h():??
????global?i??
????i?+=?1??
??
h()??
print(i)
23 交換兩元素
def?swap(a,?b):??
????return?b,?a??
print(swap(1,?0))
輸出:

24 操作函數(shù)對象
In?[31]:?def?f():??
????...:?????print('i'm?f')??
????...:??
??
In?[32]:?def?g():??
????...:?????print('i'm?g')??
????...:??
??
In?[33]:?[f,g][1]()??
i'm?g
創(chuàng)建函數(shù)對象的list,根據(jù)想要調(diào)用的index,方便統(tǒng)一調(diào)用。
25 生成逆序序列
list(range(10,-1,-1))?#?[10,?9,?8,?7,?6,?5,?4,?3,?2,?1,?0]
第三個參數(shù)為負(fù)時,表示從第一個參數(shù)開始遞減,終止到第二個參數(shù)(不包括此邊界)
26 函數(shù)的五類參數(shù)使用例子
python五類參數(shù):位置參數(shù),關(guān)鍵字參數(shù),默認(rèn)參數(shù),可變位置或關(guān)鍵字參數(shù)的使用。
def?f(a,*b,c=10,**d):??
??print(f'a:{a},b:{b},c:{c},d:go7utgvlrp')
默認(rèn)參數(shù)c不能位于可變關(guān)鍵字參數(shù)d后.
調(diào)用f:
In?[10]:?f(1,2,5,width=10,height=20)??
a:1,b:(2,?5),c:10,d:{'width':?10,?'height':?20}
可變位置參數(shù)b實(shí)參后被解析為元組(2,5);而c取得默認(rèn)值10; d被解析為字典.
再次調(diào)用f:
In?[11]:?f(a=1,c=12)??
a:1,b:(),c:12,d:{}
a=1傳入時a就是關(guān)鍵字參數(shù),b,d都未傳值,c被傳入12,而非默認(rèn)值。
注意觀察參數(shù)a, 既可以f(1),也可以f(a=1)?其可讀性比第一種更好,建議使用f(a=1)。如果要強(qiáng)制使用f(a=1),需要在前面添加一個星號:
def?f(*,a,**b):?
????print(f'a:{a},b:{b}')
此時f(1)調(diào)用,將會報錯:TypeError: f() takes 0 positional arguments but 1 was given
只能f(a=1)才能OK.
說明前面的*發(fā)揮作用,它變?yōu)橹荒軅魅腙P(guān)鍵字參數(shù),那么如何查看這個參數(shù)的類型呢?借助python的inspect模塊:
In?[22]:?for?name,val?in?signature(f).parameters.items():??
????...:?????print(name,val.kind)??
????...:??
a?KEYWORD_ONLY??
b?VAR_KEYWORD
可看到參數(shù)a的類型為KEYWORD_ONLY,也就是僅僅為關(guān)鍵字參數(shù)。
但是,如果f定義為:
def?f(a,*b):??
????print(f'a:{a},b:{b}')
查看參數(shù)類型:
In?[24]:?for?name,val?in?signature(f).parameters.items():??
????...:?????print(name,val.kind)??
????...:??
a?POSITIONAL_OR_KEYWORD??
b?VAR_POSITIONAL
可以看到參數(shù)a既可以是位置參數(shù)也可是關(guān)鍵字參數(shù)。
27 使用slice對象
生成關(guān)于蛋糕的序列cake1:
In?[1]:?cake1?=?list(range(5,0,-1))??
??
In?[2]:?b?=?cake1[1:10:2]??
??
In?[3]:?b??
Out[3]:?[4,?2]??
??
In?[4]:?cake1??
Out[4]:?[5,?4,?3,?2,?1]
再生成一個序列:
In?[5]:?from?random?import?randint??
???...:?cake2?=?[randint(1,100)?for?_?in?range(100)]??
???...:?#?同樣以間隔為2切前10個元素,得到切片d??
???...:?d?=?cake2[1:10:2]??
In?[6]:?d??
Out[6]:?[75,?33,?63,?93,?15]
你看,我們使用同一種切法,分別切開兩個蛋糕cake1,cake2. 后來發(fā)現(xiàn)這種切法極為經(jīng)典,又拿它去切更多的容器對象。
那么,為什么不把這種切法封裝為一個對象呢?于是就有了slice對象。
定義slice對象極為簡單,如把上面的切法定義成slice對象:
perfect_cake_slice_way?=?slice(1,10,2)??
#去切cake1??
cake1_slice?=?cake1[perfect_cake_slice_way]??
cake2_slice?=?cake2[perfect_cake_slice_way]??
??
In?[11]:?cake1_slice??
Out[11]:?[4,?2]??
??
In?[12]:?cake2_slice??
Out[12]:?[75,?33,?63,?93,?15]
與上面的結(jié)果一致。
對于逆向序列切片,slice對象一樣可行:
a?=?[1,3,5,7,9,0,3,5,7]??
a_?=?a[5:1:-1]??
??
named_slice?=?slice(5,1,-1)??
a_slice?=?a[named_slice]??
??
In?[14]:?a_??
Out[14]:?[0,?9,?7,?5]??
??
In?[15]:?a_slice??
Out[15]:?[0,?9,?7,?5]
頻繁使用同一切片的操作可使用slice對象抽出來,復(fù)用的同時還能提高代碼可讀性。
28 lambda 函數(shù)的動畫演示
有些讀者反映,lambda函數(shù)不太會用,問我能不能解釋一下。
比如,下面求這個?lambda函數(shù):
def?max_len(*lists):??
????return?max(*lists,?key=lambda?v:?len(v))
有兩點(diǎn)疑惑:
參數(shù) v的取值?lambda函數(shù)有返回值嗎?如果有,返回值是多少?
調(diào)用上面函數(shù),求出以下三個最長的列表:
r?=?max_len([1,?2,?3],?[4,?5,?6,?7],?[8])??
print(f'更長的列表是{r}')
程序完整運(yùn)行過程,動畫演示如下:

結(jié)論:
參數(shù)v的可能取值為 *lists,也就是?tuple?的一個元素。lambda函數(shù)返回值,等于lambda v冒號后表達(dá)式的返回值。
四、 數(shù)據(jù)結(jié)構(gòu)
29 轉(zhuǎn)為字典
創(chuàng)建數(shù)據(jù)字典
In?[1]:?dict()??
Out[1]:?{}??
??
In?[2]:?dict(a='a',b='b')??
Out[2]:?{'a':?'a',?'b':?'b'}??
??
In?[3]:?dict(zip(['a','b'],[1,2]))??
Out[3]:?{'a':?1,?'b':?2}??
??
In?[4]:?dict([('a',1),('b',2)])??
Out[4]:?{'a':?1,?'b':?2}
30 凍結(jié)集合
創(chuàng)建一個不可修改的集合。
In?[1]:?frozenset([1,1,3,2,3])??
Out[1]:?frozenset({1,?2,?3})
因?yàn)椴豢尚薷模詻]有像set那樣的add和pop方法
31 轉(zhuǎn)為集合類型
返回一個set對象,集合內(nèi)不允許有重復(fù)元素:
In?[159]:?a?=?[1,4,2,3,1]??
??
In?[160]:?set(a)??
Out[160]:?{1,?2,?3,?4}
32 轉(zhuǎn)為切片對象
class?slice(start,?stop[,?step])
返回一個表示由 range(start, stop, step) 所指定索引集的 slice對象,它讓代碼可讀性、可維護(hù)性變好。
In?[1]:?a?=?[1,4,2,3,1]??
??
In?[2]:?my_slice_meaning?=?slice(0,5,2)??
??
In?[3]:?a[my_slice_meaning]??
Out[3]:?[1,?2,?1]
33 轉(zhuǎn)元組
tuple()?將對象轉(zhuǎn)為一個不可變的序列類型
In?[16]:?i_am_list?=?[1,3,5]??
In?[17]:?i_am_tuple?=?tuple(i_am_list)??
In?[18]:?i_am_tuple??
Out[18]:?(1,?3,?5)

五、 類和對象
34 是否可調(diào)用
檢查對象是否可被調(diào)用
In?[1]:?callable(str)??
Out[1]:?True??
??
In?[2]:?callable(int)??
Out[2]:?True
In?[18]:?class?Student():??
????...:?????def?__init__(self,id,name):??
????...:?????????self.id?=?id???
????...:?????????self.name?=?name???
????...:?????def?__repr__(self):??
????...:?????????return?'id?=?'+self.id?+',?name?=?'+self.name???
????...??
??
In?[19]:?xiaoming?=?Student('001','xiaoming')??
??
In?[20]:?callable(xiaoming)??
Out[20]:?False
如果能調(diào)用xiaoming(), 需要重寫Student類的__call__方法:
In?[1]:?class?Student():??
????...:?????def?__init__(self,id,name):??
????...:?????????self.id?=?id??
????...:?????????self.name?=?name??
????...:?????def?__repr__(self):??
????...:?????????return?'id?=?'+self.id?+',?name?=?'+self.name??
????...:?????def?__call__(self):??
????...:?????????print('I?can?be?called')??
????...:?????????print(f'my?name?is?{self.name}')??
????...:??
??
In?[2]:?t?=?Student('001','xiaoming')??
??
In?[3]:?t()??
I?can?be?called??
my?name?is?xiaoming
35 ascii 展示對象
調(diào)用對象的?__repr__?方法,獲得該方法的返回值,如下例子返回值為字符串
>>>?class?Student():??
????def?__init__(self,id,name):??
????????self.id?=?id??
????????self.name?=?name??
????def?__repr__(self):??
????????return?'id?=?'+self.id?+',?name?=?'+self.name
調(diào)用:
>>>?xiaoming?=?Student(id='1',name='xiaoming')??
>>>?xiaoming??
id?=?1,?name?=?xiaoming??
>>>?ascii(xiaoming)??
'id?=?1,?name?=?xiaoming'
36 類方法
classmethod?裝飾器對應(yīng)的函數(shù)不需要實(shí)例化,不需要?self?參數(shù),但第一個參數(shù)需要是表示自身類的 cls 參數(shù),可以來調(diào)用類的屬性,類的方法,實(shí)例化對象等。
In?[1]:?class?Student():??
????...:?????def?__init__(self,id,name):??
????...:?????????self.id?=?id??
????...:?????????self.name?=?name??
????...:?????def?__repr__(self):??
????...:?????????return?'id?=?'+self.id?+',?name?=?'+self.name??
????...:?????@classmethod??
????...:?????def?f(cls):??
????...:?????????print(cls)
37 動態(tài)刪除屬性
刪除對象的屬性
In?[1]:?delattr(xiaoming,'id')??
??
In?[2]:?hasattr(xiaoming,'id')??
Out[2]:?False
38 一鍵查看對象所有方法
不帶參數(shù)時返回當(dāng)前范圍內(nèi)的變量、方法和定義的類型列表;帶參數(shù)時返回參數(shù)的屬性,方法列表。
In?[96]:?dir(xiaoming)??
Out[96]:??
['__class__',??
?'__delattr__',??
?'__dict__',??
?'__dir__',??
?'__doc__',??
?'__eq__',??
?'__format__',??
?'__ge__',??
?'__getattribute__',??
?'__gt__',??
?'__hash__',??
?'__init__',??
?'__init_subclass__',??
?'__le__',??
?'__lt__',??
?'__module__',??
?'__ne__',??
?'__new__',??
?'__reduce__',??
?'__reduce_ex__',??
?'__repr__',??
?'__setattr__',??
?'__sizeof__',??
?'__str__',??
?'__subclasshook__',??
?'__weakref__',??
???
?'name']
39 動態(tài)獲取對象屬性
獲取對象的屬性
In?[1]:?class?Student():??
???...:?????def?__init__(self,id,name):??
???...:?????????self.id?=?id??
???...:?????????self.name?=?name??
???...:?????def?__repr__(self):??
???...:?????????return?'id?=?'+self.id?+',?name?=?'+self.name??
??
In?[2]:?xiaoming?=?Student(id='001',name='xiaoming')??
In?[3]:?getattr(xiaoming,'name')?#?獲取xiaoming這個實(shí)例的name屬性值??
Out[3]:?'xiaoming'
40 對象是否有這個屬性
In?[1]:?class?Student():??
???...:?????def?__init__(self,id,name):??
???...:?????????self.id?=?id??
???...:?????????self.name?=?name??
???...:?????def?__repr__(self):??
???...:?????????return?'id?=?'+self.id?+',?name?=?'+self.name??
??
In?[2]:?xiaoming?=?Student(id='001',name='xiaoming')??
In?[3]:?hasattr(xiaoming,'name')??
Out[3]:?True??
??
In?[4]:?hasattr(xiaoming,'address')??
Out[4]:?False
41 對象門牌號
返回對象的內(nèi)存地址
In?[1]:?id(xiaoming)??
Out[1]:?98234208
42 isinstance
判斷_object_是否為類_classinfo_的實(shí)例,是返回true
In?[1]:?class?Student():??
???...:?????def?__init__(self,id,name):??
???...:?????????self.id?=?id??
???...:?????????self.name?=?name??
???...:?????def?__repr__(self):??
???...:?????????return?'id?=?'+self.id?+',?name?=?'+self.name??
??
In?[2]:?xiaoming?=?Student(id='001',name='xiaoming')??
??
In?[3]:?isinstance(xiaoming,Student)??
Out[3]:?True
43 父子關(guān)系鑒定
In?[1]:?class?undergraduate(Student):??
????...:?????def?studyClass(self):??
????...:?????????pass??
????...:?????def?attendActivity(self):??
????...:?????????pass??
??
In?[2]:?issubclass(undergraduate,Student)??
Out[2]:?True??
??
In?[3]:?issubclass(object,Student)??
Out[3]:?False??
??
In?[4]:?issubclass(Student,object)??
Out[4]:?True
如果class是classinfo元組中某個元素的子類,也會返回True
In?[1]:?issubclass(int,(int,float))??
Out[1]:?True
44 所有對象之根
object 是所有類的基類
In?[1]:?o?=?object()??
??
In?[2]:?type(o)??
Out[2]:?object
45 創(chuàng)建屬性的兩種方式
返回 property 屬性,典型的用法:
class?C:??
????def?__init__(self):??
????????self._x?=?None??
??
????def?getx(self):??
????????return?self._x??
??
????def?setx(self,?value):??
????????self._x?=?value??
??
????def?delx(self):??
????????del?self._x??
????#?使用property類創(chuàng)建?property?屬性??
????x?=?property(getx,?setx,?delx,?"I'm?the?'x'?property.")
使用python裝飾器,實(shí)現(xiàn)與上完全一樣的效果代碼:
class?C:??
????def?__init__(self):??
????????self._x?=?None??
??
????@property??
????def?x(self):??
????????return?self._x??
??
[email protected]??
????def?x(self,?value):??
????????self._x?=?value??
??
[email protected]??
????def?x(self):??
????????del?self._x
46 查看對象類型
class?type(name,?bases,?dict)
傳入一個參數(shù)時,返回?object?的類型:
In?[1]:?class?Student():??
???...:?????def?__init__(self,id,name):??
???...:?????????self.id?=?id??
???...:?????????self.name?=?name??
???...:?????def?__repr__(self):??
???...:?????????return?'id?=?'+self.id?+',?name?=?'+self.name??
???...:??
??
In?[2]:?xiaoming?=?Student(id='001',name='xiaoming')??
In?[3]:?type(xiaoming)??
Out[3]:?__main__.Student??
??
In?[4]:?type(tuple())??
Out[4]:?tuple
47 元類
xiaoming,?xiaohong,?xiaozhang?都是學(xué)生,這類群體叫做?Student.
Python 定義類的常見方法,使用關(guān)鍵字?class
In?[36]:?class?Student(object):??
????...:?????pass
xiaoming,?xiaohong,?xiaozhang?是類的實(shí)例,則:
xiaoming?=?Student()??
xiaohong?=?Student()??
xiaozhang?=?Student()
創(chuàng)建后,xiaoming 的?__class__?屬性,返回的便是?Student類
In?[38]:?xiaoming.__class__??
Out[38]:?__main__.Student
問題在于,Student?類有?__class__屬性,如果有,返回的又是什么?
In?[39]:?xiaoming.__class__.__class__??
Out[39]:?type
哇,程序沒報錯,返回?type
那么,我們不妨猜測:Student?類,類型就是?type
換句話說,Student類就是一個對象,它的類型就是?type
所以,Python 中一切皆對象,類也是對象
Python 中,將描述?Student?類的類被稱為:元類。
按照此邏輯延伸,描述元類的類被稱為:_元元類_,開玩笑了~ 描述元類的類也被稱為元類。
聰明的朋友會問了,既然?Student?類可創(chuàng)建實(shí)例,那么?type?類可創(chuàng)建實(shí)例嗎?如果能,它創(chuàng)建的實(shí)例就叫:類 了。你們真聰明!
說對了,type?類一定能創(chuàng)建實(shí)例,比如?Student?類了。
In?[40]:?Student?=?type('Student',(),{})??
??
In?[41]:?Student??
Out[41]:?__main__.Student
它與使用?class?關(guān)鍵字創(chuàng)建的?Student?類一模一樣。
Python 的類,因?yàn)橛质菍ο螅院?xiaoming,xiaohong?對象操作相似。支持:
賦值 拷貝 添加屬性 作為函數(shù)參數(shù)
In?[43]:?StudentMirror?=?Student?#?類直接賦值?#?類直接賦值??
In?[44]:?Student.class_property?=?'class_property'?#?添加類屬性??
In?[46]:?hasattr(Student,?'class_property')??
Out[46]:?True
元類,確實(shí)使用不是那么多,也許先了解這些,就能應(yīng)付一些場合。就連 Python 界的領(lǐng)袖?Tim Peters?都說:
“元類就是深度的魔法,99%的用戶應(yīng)該根本不必為此操心。
六、工具
48 枚舉對象
返回一個可以枚舉的對象,該對象的next()方法將返回一個元組。
In?[1]:?s?=?["a","b","c"]??
????...:?for?i?,v?in?enumerate(s,1):??
????...:?????print(i,v)??
????...:??
1?a??
2?b??
3?c
49 查看變量所占字節(jié)數(shù)
In?[1]:?import?sys??
??
In?[2]:?a?=?{'a':1,'b':2.0}??
??
In?[3]:?sys.getsizeof(a)?#?占用240個字節(jié)??
Out[3]:?240
50 過濾器
在函數(shù)中設(shè)定過濾條件,迭代元素,保留返回值為True的元素:
In?[1]:?fil?=?filter(lambda?x:?x>10,[1,11,2,45,7,6,13])??
??
In?[2]:?list(fil)??
Out[2]:?[11,?45,?13]
51 返回對象的哈希值
返回對象的哈希值,值得注意的是自定義的實(shí)例都是可哈希的,list,?dict,?set等可變對象都是不可哈希的(unhashable)
In?[1]:?hash(xiaoming)??
Out[1]:?6139638??
??
In?[2]:?hash([1,2,3])??
#?TypeError:?unhashable?type:?'list'
52 一鍵幫助
返回對象的幫助文檔
In?[1]:?help(xiaoming)??
Help?on?Student?in?module?__main__?object:??
??
class?Student(builtins.object)??
?|??Methods?defined?here:??
?|??
?|??__init__(self,?id,?name)??
?|??
?|??__repr__(self)??
?|??
?|??Data?descriptors?defined?here:??
?|??
?|??__dict__??
?|??????dictionary?for?instance?variables?(if?defined)??
?|??
?|??__weakref__??
?|??????list?of?weak?references?to?the?object?(if?defined)
53 獲取用戶輸入
獲取用戶輸入內(nèi)容
In?[1]:?input()??
aa??
Out[1]:?'aa'
54 創(chuàng)建迭代器類型
使用iter(obj, sentinel), 返回一個可迭代對象, sentinel可省略(一旦迭代到此元素,立即終止)
In?[1]:?lst?=?[1,3,5]??
??
In?[2]:?for?i?in?iter(lst):??
????...:?????print(i)??
????...:??
1??
3??
5
In?[1]:?class?TestIter(object):??
????...:?????def?__init__(self):??
????...:?????????self.l=[1,3,2,3,4,5]??
????...:?????????self.i=iter(self.l)??
????...:?????def?__call__(self):??#定義了__call__方法的類的實(shí)例是可調(diào)用的??
????...:?????????item?=?next(self.i)??
????...:?????????print?("__call__?is?called,fowhich?would?return",item)??
????...:?????????return?item??
????...:?????def?__iter__(self):?#支持迭代協(xié)議(即定義有__iter__()函數(shù))??
????...:?????????print?("__iter__?is?called!!")??
????...:?????????return?iter(self.l)??
In?[2]:?t?=?TestIter()??
In?[3]:?t()?#?因?yàn)閷?shí)現(xiàn)了__call__,所以t實(shí)例能被調(diào)用??
__call__?is?called,which?would?return?1??
Out[3]:?1??
??
In?[4]:?for?e?in?TestIter():?#?因?yàn)閷?shí)現(xiàn)了__iter__方法,所以t能被迭代??
????...:?????print(e)??
????...:??
__iter__?is?called!!??
1??
3??
2??
3??
4??
5
55 打開文件
返回文件對象
In?[1]:?fo?=?open('D:/a.txt',mode='r',?encoding='utf-8')??
??
In?[2]:?fo.read()??
Out[2]:?'\ufefflife?is?not?so?long,\nI?use?Python?to?play.'
mode取值表:

56 創(chuàng)建range序列
range(stop)
range(start, stop[,step])
生成一個不可變序列:
In?[1]:?range(11)??
Out[1]:?range(0,?11)??
??
In?[2]:?range(0,11,1)??
Out[2]:?range(0,?11)
57 反向迭代器
In?[1]:?rev?=?reversed([1,4,2,3,1])??
??
In?[2]:?for?i?in?rev:??
?????...:?????print(i)??
?????...:??
1??
3??
2??
4??
1
58 聚合迭代器
創(chuàng)建一個聚合了來自每個可迭代對象中的元素的迭代器:
In?[1]:?x?=?[3,2,1]??
In?[2]:?y?=?[4,5,6]??
In?[3]:?list(zip(y,x))??
Out[3]:?[(4,?3),?(5,?2),?(6,?1)]??
??
In?[4]:?a?=?range(5)??
In?[5]:?b?=?list('abcde')??
In?[6]:?b??
Out[6]:?['a',?'b',?'c',?'d',?'e']??
In?[7]:?[str(y)?+?str(x)?for?x,y?in?zip(a,b)]??
Out[7]:?['a0',?'b1',?'c2',?'d3',?'e4']
59 鏈?zhǔn)讲僮?/span>
from?operator?import?(add,?sub)??
??
??
def?add_or_sub(a,?b,?oper):??
????return?(add?if?oper?==?'+'?else?sub)(a,?b)??
??
??
add_or_sub(1,?2,?'-')??#?-1
60 對象序列化
對象序列化,是指將內(nèi)存中的對象轉(zhuǎn)化為可存儲或傳輸?shù)倪^程。很多場景,直接一個類對象,傳輸不方便。
但是,當(dāng)對象序列化后,就會更加方便,因?yàn)榧s定俗成的,接口間的調(diào)用或者發(fā)起的 web 請求,一般使用 json 串傳輸。
實(shí)際使用中,一般對類對象序列化。先創(chuàng)建一個 Student 類型,并創(chuàng)建兩個實(shí)例。
class?Student():??
????def?__init__(self,**args):??
????????self.ids?=?args['ids']??
????????self.name?=?args['name']??
????????self.address?=?args['address']??
xiaoming?=?Student(ids?=?1,name?=?'xiaoming',address?=?'北京')??
xiaohong?=?Student(ids?=?2,name?=?'xiaohong',address?=?'南京')
導(dǎo)入 json 模塊,調(diào)用 dump 方法,就會將列表對象 [xiaoming,xiaohong],序列化到文件 json.txt 中。
import?json??
??
with?open('json.txt',?'w')?as?f:??
????json.dump([xiaoming,xiaohong],?f,?default=lambda?obj:?obj.__dict__,?ensure_ascii=False,?indent=2,?sort_keys=True)
生成的文件內(nèi)容,如下:
[??
????{??
????????"address":"北京",??
????????"ids":1,??
????????"name":"xiaoming"??
????},??
????{??
????????"address":"南京",??
????????"ids":2,??
????????"name":"xiaohong"??
????}??
]鏈接:https://github.com/jackzhenguo/python-small-examples
(版權(quán)歸原作者所有,侵刪)
