選單

60 個 Python 闖關小例子,建議收藏!

60 個 Python 闖關小例子,建議收藏!

一、 數字

1 求絕對值

絕對值或複數的模

In[1]:abs(-6)

Out[1]:6

2 進位制轉化

十進位制轉換為二進位制:

In[2]:bin(10)

Out[2]:‘0b1010’

十進位制轉換為八進位制:

In[3]:oct(9)

Out[3]:‘0o11’

十進位制轉換為十六進位制:

In[4]:hex(15)

Out[4]:‘0xf’

3 整數和ASCII互轉

十進位制整數對應的

In[1]:chr(65)

Out[1]:‘A’

檢視某個對應的十進位制數

In[1]:ord(‘A’)

Out[1]:65

4 元素都為真檢查

所有元素都為真,返回 ,否則為

In[5]:all([1,,3,6])

Out[5]:False

In[6]:all([1,2,3])

Out[6]:True

5 元素至少一個為真檢查

至少有一個元素為真返回,否則

In[7]:any([,,,[]])

Out[7]:False

In[8]:any([,,1])

Out[8]:True

6 判斷是真是假

測試一個物件是True, 還是False

In[9]:bool([,,])

Out[9]:True

In[10]:bool([])

Out[10]:False

In[11]:bool([1,,1])

Out[11]:True

7 建立複數

建立一個複數

In[1]:complex(1,2)

Out[1]: (1+2j)

8 取商和餘數

分別取商和餘數

In[1]:divmod(10,3)

Out[1]: (3,1)

9 轉為浮點型別

In[1]:float(3)

Out[1]:3。0

如果不能轉化為浮點數,則會報:

In[2]:float(‘a’)

# ValueError: could not convert string to float: ‘a’

10 轉為整型

In[1]:int(‘12’,16)

Out[1]:18

11 次冪

base為底的exp次冪,如果mod給出,取餘

In[1]:pow(3,2,4)

Out[1]:1

12 四捨五入

四捨五入,代表小數點後保留幾位:

In[11]:round(10。0222222,3)

Out[11]:10。022

In[12]:round(10。05,1)

Out[12]:10。1

13 鏈式比較

i=3

print(1

print(1

二、 字串

14 字串轉位元組

字串轉換為位元組型別

In[12]: s=“apple”

In[13]:bytes(s,encoding=‘utf-8’)

Out[13]:b‘apple’

15 任意物件轉為字串

In[14]: i=100

In[15]:str(i)

Out[15]:‘100’

In[16]:str([])

Out[16]:‘[]’

In[17]:str(tuple())

Out[17]:‘()’

16 執行字串表示的程式碼

將字串編譯成python能識別或可執行的程式碼,也可以將文字讀成字串再編譯。

In[1]: s=“print(‘helloworld’)”

In[2]: r=compile(s,“”,“exec”)

In[3]: r

Out[3]:

In[4]:exec(r)

helloworld

17 計算表示式

將字串str 當成有效的表示式來求值並返回計算結果取出字串中內容

In[1]: s=“1 + 3 +5”

。。。:eval(s)

。。。:

Out[1]:9

18 字串格式化

三、 函式

19 拿來就用的排序函式

排序:

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=lambdax: x[‘age’],reverse=False)

Out[4]:

[{‘name’:‘xiaoming’,‘age’:18,‘gender’:‘male’},

{‘name’:‘xiaohong’,‘age’:20,‘gender’:‘female’}]

20 求和函式

求和:

In[181]: a=[1,4,2,3,1]

In[182]:sum(a)

Out[182]:11

In[185]:sum(a,10)#求和的初始值為10

Out[185]:21

21 nonlocal用於內嵌函式中

關鍵詞常用於函式巢狀中,宣告變數i為非區域性變數;如果不宣告,表明i為函式內的區域性變數,因為在引用時,未被宣告,所以會報的錯誤。

defexcepter(f):

i=

t1=time。time()

defwrapper():

try:

f()

exceptExceptionase:

nonlocali

i+=1

print(f‘:’)

t2=time。time()

ifi==n:

print(f‘spending time:{round(t2-t1,2)}’)

returnwrapper

22 global 宣告全域性變數

先回答為什麼要有,一個變數被多個函式引用,想讓全域性變數被所有函式共享。有的夥伴可能會想這還不簡單,這樣寫:

i=5

deff():

print(i)

defg():

print(i)

pass

f()

g()

f和g兩個函式都能共享變數,程式沒有報錯,所以他們依然不明白為什麼要用。

但是,如果我想要有個函式對遞增,這樣:

defh():

i+=1

h()

此時執行程式,bang, 出錯了!丟擲異常:,原來編譯器在解釋時會把i解析為函式內的區域性變數,很顯然在此函式內,編譯器找不到對變數i的定義,所以會報錯。

就是為解決此問題而被提出,在函式h內,顯式地告訴編譯器i為全域性變數,然後編譯器會在函式外面尋找i的定義,執行完後,i還為全域性變數,值加1:

i=

defh():

globali

i+=1

h()

print(i)

23 交換兩元素

defswap(a, b):

returnb, a

print(swap(1,))# (0,1)

24 操作函式物件

In[31]: deff():

。。。:print(‘i\’m f‘)

。。。:

In[32]:defg():

。。。:print(’i\‘m g’)

。。。:

In[33]: [f,g][1]()

i‘m g

建立函式物件的list,根據想要呼叫的index,方便統一呼叫。

25 生成逆序序列

list(range(10,-1,-1))# [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

第三個引數為負時,表示從第一個引數開始遞減,終止到第二個引數(不包括此邊界)

26 函式的五類引數使用例子

python五類引數:位置引數,關鍵字引數,預設引數,可變位置或關鍵字引數的使用。

deff(a,*b,c=10,**d):

print(f’a:,b:,c:,d:‘)

預設引數不能位於可變關鍵字引數後。

呼叫f:

In[10]:f(1,2,5,width=10,height=20)

a:1,b:(2,5),c:10,d:{’width‘:10,’height‘:20}

可變位置引數實參後被解析為元組;而c取得預設值10; d被解析為字典。

再次呼叫f:

In[11]:f(a=1,c=12)

a:1,b:(),c:12,d:{}

a=1傳入時a就是關鍵字引數,b,d都未傳值,c被傳入12,而非預設值。

注意觀察引數a, 既可以,也可以其可讀性比第一種更好,建議使用。如果要強制使用,需要在前面新增一個

星號

deff(*,a,**b):

print(f’a:,b:‘)

此時f(1)呼叫,將會報錯:

只能才能OK。

說明前面的發揮作用,它變為只能傳入關鍵字引數,那麼如何檢視這個引數的型別呢?藉助python的模組:

In[22]: for name,valinsignature(f)。parameters。items():

。。。:print(name,val。kind)

。。。:

aKEYWORD_ONLY

bVAR_KEYWORD

可看到引數的型別為,也就是僅僅為關鍵字引數。

但是,如果f定義為:

deff(a,*b):

print(f’a:,b:‘)

檢視引數型別:

In[24]: for name,valinsignature(f)。parameters。items():

。。。:print(name,val。kind)

。。。:

aPOSITIONAL_OR_KEYWORD

bVAR_POSITIONAL

可以看到引數a既可以是位置引數也可是關鍵字引數。

27 使用slice物件

生成關於蛋糕的序列cake1:

In[1]: cake1=list(range(5,,-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 randomimportrandint

。。。: cake2=[randint(1,100)for_inrange(100)]

。。。:# 同樣以間隔為2切前10個元素,得到切片d

。。。: d=cake2[1:10:2]

In[6]: d

Out[6]: [75,33,63,93,15]

你看,我們使用同一種切法,分別切開兩個蛋糕cake1,cake2。 後來發現這種切法極為經典,又拿它去切更多的容器物件。

那麼,為什麼不把這種切法封裝為一個物件呢?於是就有了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]

與上面的結果一致。

對於逆向序列切片,slice物件一樣可行:

a=[1,3,5,7,9,,3,5,7]

a_=a[5:1:-1]

named_slice=slice(5,1,-1)

a_slice=a[named_slice]

In[14]: a_

Out[14]: [,9,7,5]

In[15]: a_slice

Out[15]: [,9,7,5]

頻繁使用同一切片的操作可使用slice物件抽出來,複用的同時還能提高程式碼可讀性。

28 lambda 函式的動畫演示

有些讀者反映,函式不太會用,問我能不能解釋一下。

比如,下面求這個 函式:

defmax_len(*lists):

returnmax(*lists, key=lambdav:len(v))

有兩點疑惑:

引數的取值?

函式有返回值嗎?如果有,返回值是多少?

呼叫上面函式,求出以下三個最長的列表:

r=max_len([1,2,3], [4,5,6,7], [8])

print(f’更長的列表是‘)

程式完整執行過程,動畫演示如下:

結論:

引數v的可能取值為,也就是  的一個元素。

函式返回值,等於冒號後表示式的返回值。

四、 資料結構

29 轉為字典

建立資料字典

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 凍結集合

建立一個不可修改的集合。

In[1]:frozenset([1,1,3,2,3])

Out[1]:frozenset({1,2,3})

因為不可修改,所以沒有像那樣的和方法

31 轉為集合型別

返回一個set物件,集合內不允許有重複元素:

In[159]: a=[1,4,2,3,1]

In[160]:set(a)

Out[160]: {1,2,3,4}

32 轉為切片物件

classslice(start,stop[,step])

返回一個表示由 range(start, stop, step) 所指定索引集的 slice物件,它讓程式碼可讀性、可維護性變好。

In[1]: a=[1,4,2,3,1]

In[2]: my_slice_meaning=slice(,5,2)

In[3]: a[my_slice_meaning]

Out[3]: [1,2,1]

33 轉元組

將物件轉為一個不可變的序列型別

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 是否可呼叫

檢查物件是否可被呼叫

In[1]:callable(str)

Out[1]:True

In[2]:callable(int)

Out[2]:True

In[18]: classStudent():

。。。: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

如果能呼叫, 需要重寫類的方法:

In[1]: classStudent():

。。。: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‘)

。。。:

In[2]: t=Student(’001‘,’xiaoming‘)

In[3]:t()

Ican be called

my nameisxiaoming

35 ascii 展示物件

呼叫物件的  方法,獲得該方法的返回值,如下例子返回值為字串

>>>classStudent():

def__init__(self,id,name):

self。id=id

self。name=name

def__repr__(self):

return’id = ‘+self。id+’, name = ‘+self。name

呼叫:

>>>xiaoming=Student(id=’1‘,name=’xiaoming‘)

>>>xiaoming

id=1, name=xiaoming

>>>ascii(xiaoming)

’id = 1, name = xiaoming‘

36 類方法

裝飾器對應的函式不需要例項化,不需要 引數,但第一個引數需要是表示自身類的 cls 引數,可以來呼叫類的屬性,類的方法,例項化物件等。

In[1]: classStudent():

。。。:def__init__(self,id,name):

。。。: self。id=id

。。。: self。name=name

。。。: def__repr__(self):

。。。:return’id = ‘+self。id+’, name = ‘+self。name

。。。: @classmethod

。。。: deff(cls):

。。。:print(cls)

37 動態刪除屬性

刪除物件的屬性

In[1]:delattr(xiaoming,’id‘)

In[2]:hasattr(xiaoming,’id‘)

Out[2]:False

38 一鍵檢視物件所有方法

不帶引數時返回當前範圍內的變數、方法和定義的型別列表;帶引數時返回引數的屬性,方法列表。

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 動態獲取物件屬性

獲取物件的屬性

In[1]: classStudent():

。。。: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這個例項的name屬性值

Out[3]:’xiaoming‘

40 物件是否有這個屬性

In[1]: classStudent():

。。。: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 物件門牌號

返回物件的記憶體地址

In[1]:id(xiaoming)

Out[1]:98234208

42 isinstance

判斷object是否為類classinfo的例項,是返回true

In[1]: classStudent():

。。。: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 父子關係鑑定

In[1]: classundergraduate(Student):

。。。:defstudyClass(self):

。。。: pass

。。。: defattendActivity(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 建立屬性的兩種方式

返回 property 屬性,典型的用法:

classC:

def__init__(self):

self。_x=None

defgetx(self):

returnself。_x

defsetx(self, value):

self。_x=value

defdelx(self):

delself。_x

# 使用property類建立 property 屬性

x=property(getx, setx, delx,“I’m the ‘x’ property。”)

使用python裝飾器,實現與上完全一樣的效果程式碼:

46 檢視物件型別

class type(name, bases, dict)

傳入一個引數時,返回 object 的型別:

In[1]: classStudent():

。。。: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 元類

, ,  都是學生,這類群體叫做 。

Python 定義類的常見方法,使用關鍵字

In[36]: classStudent(object):

。。。: pass

, ,  是類的例項,則:

xiaoming=Student()

xiaohong=Student()

xiaozhang=Student()

建立後,xiaoming 的  屬性,返回的便是 類

In[38]: xiaoming。__class__

Out[38]: __main__。Student

問題在於, 類有 屬性,如果有,返回的又是什麼?

In[39]: xiaoming。__class__。__class__

Out[39]: type

哇,程式沒報錯,返回

那麼,我們不妨猜測: 類,型別就是

換句話說,類就是一個物件,它的型別就是

所以,Python 中一切皆物件,類也是物件

Python 中,將描述  類的類被稱為:元類。

按照此邏輯延伸,描述元類的類被稱為:元元類,開玩笑了~ 描述元類的類也被稱為元類。

聰明的朋友會問了,既然  類可建立例項,那麼  類可建立例項嗎?如果能,它建立的例項就叫:類 了。你們真聰明!

說對了, 類一定能建立例項,比如  類了。

In[40]:Student=type(‘Student’,(),{})

In[41]:Student

Out[41]: __main__。Student

它與使用  關鍵字建立的  類一模一樣。

Python 的類,因為又是物件,所以和 , 物件操作相似。支援:

賦值

複製

新增屬性

作為函式引數

In[43]:StudentMirror=Student# 類直接賦值 # 類直接賦值

In[44]:Student。class_property=‘class_property’# 新增類屬性

In[46]:hasattr(Student,‘class_property’)

Out[46]:True

元類,確實使用不是那麼多,也許先了解這些,就能應付一些場合。就連 Python 界的領袖  都說:

“元類就是深度的魔法,99%的使用者應該根本不必為此操心。

六、工具

48 列舉物件

返回一個可以列舉的物件,該物件的方法將返回一個元組。

In[1]: s=[“a”,“b”,“c”]

。。。: for i ,vinenumerate(s,1):

。。。:print(i,v)

。。。:

1a

2b

3c

49 檢視變數所佔位元組數

In[1]: import sys

In[2]: a={‘a’:1,‘b’:2。0}

In[3]: sys。getsizeof(a)# 佔用240個位元組

Out[3]:240

50 過濾器

在函式中設定過濾條件,迭代元素,保留返回值為的元素:

In[1]: fil=filter(lambdax: x>10,[1,11,2,45,7,6,13])

In[2]:list(fil)

Out[2]: [11,45,13]

51 返回物件的雜湊值

返回物件的雜湊值,值得注意的是自定義的例項都是可雜湊的,, , 等可變物件都是不可雜湊的(unhashable)

In[1]:hash(xiaoming)

Out[1]:6139638

In[2]:hash([1,2,3])

# TypeError: unhashable type: ‘list’

52 一鍵幫助

返回物件的幫助文件

In[1]:help(xiaoming)

HelponStudentinmodule __main__ object:

classStudent(builtins。object)

|Methodsdefined here:

|

|__init__(self, id, name)

|

|__repr__(self)

|

|Datadescriptors defined here:

|

|__dict__

|dictionaryforinstancevariables(if defined)

|

|__weakref__

|list of weak references to theobject(if defined)

53 獲取使用者輸入

獲取使用者輸入內容

In[1]:input()

aa

Out[1]:‘aa’

54 建立迭代器型別

使用, 返回一個可迭代物件, sentinel可省略(一旦迭代到此元素,立即終止)

In[1]: lst=[1,3,5]

In[2]: for iiniter(lst):

。。。:print(i)

。。。:

1

3

5

In[1]: classTestIter(object):

。。。:def__init__(self):

。。。: self。l=[1,3,2,3,4,5]

。。。: self。i=iter(self。l)

。。。: def__call__(self):#定義了__call__方法的類的例項是可呼叫的

。。。: item=next(self。i)

。。。:print(“__call__ is called,fowhich would return”,item)

。。。: return item

。。。: def__iter__(self):#支援迭代協議(即定義有__iter__()函式)

。。。:print(“__iter__ is called!!”)

。。。:returniter(self。l)

In[2]: t=TestIter()

In[3]:t()# 因為實現了__call__,所以t例項能被呼叫

__call__iscalled,which wouldreturn1

Out[3]:1

In[4]: for einTestIter():# 因為實現了__iter__方法,所以t能被迭代

。。。:print(e)

。。。:

__iter__iscalled!!

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 建立range序列

range(stop)

range(start, stop[,step])

生成一個不可變序列:

In[1]:range(11)

Out[1]:range(,11)

In[2]:range(,11,1)

Out[2]:range(,11)

57 反向迭代器

In[1]: rev=reversed([1,4,2,3,1])

In[2]: for iinrev:

。。。:print(i)

。。。:

1

3

2

4

1

58 聚合迭代器

建立一個聚合了來自每個可迭代物件中的元素的迭代器:

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)forx,yinzip(a,b)]

Out[7]: [‘a0’,‘b1’,‘c2’,‘d3’,‘e4’]

59 鏈式操作

fromoperatorimport(add, sub)

defadd_or_sub(a, b, oper):

return(addifoper==‘+’elsesub)(a, b)

add_or_sub(1,2,‘-’)# -1

60 物件序列化

物件序列化,是指將記憶體中的物件轉化為可儲存或傳輸的過程。很多場景,直接一個類物件,傳輸不方便。

但是,當物件序列化後,就會更加方便,因為約定俗成的,介面間的呼叫或者發起的 web 請求,一般使用 json 串傳輸。

實際使用中,一般對類物件序列化。先建立一個 Student 型別,並建立兩個例項。

classStudent():

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=‘南京’)

匯入 json 模組,呼叫 dump 方法,就會將列表物件 [xiaoming,xiaohong],序列化到檔案 json。txt 中。

importjson

withopen(‘json。txt’,‘w’)asf:

json。dump([xiaoming,xiaohong], f, default=lambdaobj: obj。__dict__, ensure_ascii=False, indent=2, sort_keys=True)

生成的檔案內容,如下:

加入知識星球

【我們談論資料科學】

400+

小夥伴一起學習!