日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

合工大python期末复习知识点汇总

發(fā)布時(shí)間:2024/9/30 71 豆豆
生活随笔 收集整理的這篇文章主要介紹了 合工大python期末复习知识点汇总 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • Python序列
    • map函數(shù)
    • eval函數(shù)
    • divmod
    • sort sorted
    • os與os.path模塊
  • 列表
    • 切片
    • 列表推導(dǎo)式
    • 編寫算法實(shí)現(xiàn)嵌套列表的平鋪
    • 列出當(dāng)前文件夾下所有Python源文件
  • 元組
    • 序列解包(sequence unpacking
    • 生成器推導(dǎo)式
  • 字典
  • 集合
  • 其他數(shù)據(jù)結(jié)構(gòu):隊(duì)列 堆棧 二叉樹
  • 程序的控制結(jié)構(gòu)
    • 應(yīng)用
    • 例:編寫程序,判斷今天是今年的第幾天?
    • 例:計(jì)算1+2+3+…+100 的值。
    • 例:輸出“水仙花數(shù)”。
    • 例:判斷一個(gè)數(shù)是否為素?cái)?shù)。
    • 例:生成一個(gè)含有20個(gè)隨機(jī)數(shù)的列表,
    • 計(jì)算百錢買百雞問題。
    • 例 編寫程序,實(shí)現(xiàn)十進(jìn)制整數(shù)到其他任意進(jìn)制的轉(zhuǎn)換。
    • 例 計(jì)算前n個(gè)自然數(shù)的階乘之和1!+2!+3!+...+n!的值。
    • 例 判斷一個(gè)數(shù)字是否為丑數(shù)。
  • 字符串和正則表達(dá)式
    • find()、rfind()、index()、rindex()、count()
    • split()
    • join
    • 格式化
    • 與字符串處理有關(guān)的標(biāo)準(zhǔn)庫
    • 編寫程序,把一個(gè)英文句子中的單詞倒置
    • 例: 編寫程序,查找一個(gè)字符串中最長的數(shù)字子串。
  • 面向?qū)ο蟪绦蛟O(shè)計(jì)
    • self參數(shù):
    • 私有成員和公有成員
    • 類中的方法
    • 屬性
    • 繼承

Python序列

列表元組字典集合
類型名稱listtupledictset
定界符方括號(hào)[]圓括號(hào)()大括號(hào){}大括號(hào){}
是否可變
是否有序
是否支持下標(biāo)是(序號(hào)作為下標(biāo))是(序號(hào)作為下標(biāo))是(“鍵”作為下標(biāo))
元素分隔符逗號(hào)逗號(hào)逗號(hào)逗號(hào)
對(duì)元素形式的要求鍵:值必須可哈希
對(duì)元素值的要求“鍵”必須可哈希必須可哈希
元素是否可重復(fù)“鍵”不允許重復(fù),“值”可以重復(fù)
元素查找速度非常慢很慢非???/td>非常快
新增和刪除元素速度尾部操作快 其他位置慢不允許

map函數(shù)

>>> def square(x) : # 計(jì)算平方數(shù) ... return x ** 2 ... >>> map(square, [1,2,3,4,5]) # 計(jì)算列表各個(gè)元素的平方 <map object at 0x100d3d550> # 返回迭代器 >>> list(map(square, [1,2,3,4,5])) # 使用 list() 轉(zhuǎn)換為列表 [1, 4, 9, 16, 25] >>> list(map(lambda x: x ** 2, [1, 2, 3, 4, 5])) # 使用 lambda 匿名函數(shù) [1, 4, 9, 16, 25]

eval函數(shù)

以下展示了使用 eval() 方法的實(shí)例:>>>x = 7 >>> eval( '3 * x' ) 21 >>> eval('pow(2,2)') 4 >>> eval('2 + 2') 4 >>> n=81 >>> eval("n + 4") 85

eval(input()如果輸入的是數(shù)字,則轉(zhuǎn)換為數(shù)字;如果不是數(shù)字,報(bào)錯(cuò)。
int(input())如果是數(shù)字,整數(shù)的話,沒為題,小數(shù)的話,丟失小數(shù)部分;如果不是數(shù)字,報(bào)錯(cuò)。

divmod

Python divmod() 函數(shù):
接收兩個(gè)數(shù)字類型(非復(fù)數(shù))參數(shù),返回一個(gè)包含商和余數(shù)的元組(a // b, a % b)

sort sorted

“sort()與sorted()的不同在于,sort是在原位重新排列列表,而sorted()是產(chǎn)生一個(gè)新的列表
??sort 是應(yīng)用在 list 上的方法,屬于列表的成員方法,sorted 可以對(duì)所有可迭代的對(duì)象進(jìn)行排序操作。
??list 的 sort 方法返回的是對(duì)已經(jīng)存在的列表進(jìn)行操作,而內(nèi)建函數(shù) sorted 方法返回的是一個(gè)新的 list,而不是在原來的基礎(chǔ)上進(jìn)行的操作。
??sort使用方法為ls.sort(),而sorted使用方法為sorted(ls)。

[('a', 1), ('b', 2), ('c', 3), ('d', 4)] sorted(L, key=lambda x:x[1]) l:[('a', 1), ('b', 2), ('e', 3), ('d', 4), ('c', 6)] l.sort(key=lambda x : x[1], reverse=True)

os與os.path模塊

方法功能說明
access(path, mode)測(cè)試是否可以按照mode指定的權(quán)限訪問文件
chdir(path)把path設(shè)為當(dāng)前工作目錄
chmod(path, mode, *, dir_fd=None, follow_symlinks=True)改變文件的訪問權(quán)限
curdir當(dāng)前文件夾
environ包含系統(tǒng)環(huán)境變量和值的字典
extsep當(dāng)前操作系統(tǒng)所使用的文件擴(kuò)展名分隔符
get_exec_path()返回可執(zhí)行文件的搜索路徑
getcwd()返回當(dāng)前工作目錄
listdir(path)返回path目錄下的文件和目錄列表
open(path, flags, mode=0o777, *, dir_fd=None)按照mode指定的權(quán)限打開文件,默認(rèn)權(quán)限為可讀、可寫、可執(zhí)行
popen(cmd, mode=‘r’, buffering=-1)創(chuàng)建進(jìn)程,啟動(dòng)外部程序

列表

??列表是Python中內(nèi)置有序、可變序列,列表的所有元素放在一對(duì)中括號(hào)“[]”中,并使用逗號(hào)分隔開;
??當(dāng)列表元素增加或刪除時(shí),列表對(duì)象自動(dòng)進(jìn)行擴(kuò)展或收縮內(nèi)存,保證元素之間沒有縫隙;
??在Python中,一個(gè)列表中的數(shù)據(jù)類型可以各不相同
可以同時(shí)分別為整數(shù)、浮點(diǎn)數(shù)、字符串等基本類型,甚至是列表、元組、字典、集合以及其他自定義類型的對(duì)象。

列表常用方法

方法說明
lst *= n更新列表lst, 其元素重復(fù)n次
lst.append(x)將元素x添加至列表lst尾部
lst.extend(L) 或lst += L將列表L中所有元素添加至列表lst尾部
lst.insert(index, x)在列表lst指定位置index處添加元素x,該位置后面的所有元素后移一個(gè)位置
lst.remove(x)在列表lst中刪除首次出現(xiàn)的指定元素,該元素之后的所有元素前移一個(gè)位置
lst.pop([index])刪除并返回列表lst中下標(biāo)為index(默認(rèn)為-1)的元素
lst.clear()刪除列表lst中所有元素,但保留列表對(duì)象
lst.index(x)返回列表lst中第一個(gè)值為x的元素的下標(biāo),若不存在值為x的元素則拋出異常
lst.count(x)返回指定元素x在列表lst中的出現(xiàn)次數(shù)
lst.reverse()對(duì)列表lst所有元素進(jìn)行逆序
lst.sort(key=None, reverse=False)對(duì)列表lst中的元素進(jìn)行排序,key用來指定排序依據(jù),reverse決定升序(False)還是降序(True)
lst.copy()返回列表lst的淺復(fù)制

(1)可以使用“+”運(yùn)算符將元素添加到列表中

>>> aList = [3,4,5]>>> aList = aList + [7]>>> aList[3, 4, 5, 7]

嚴(yán)格意義上來講,這并不是真的為列表添加元素,而是創(chuàng)建了一個(gè)新列表,并將原列表中的元素和新元素依次復(fù)制到新列表的內(nèi)存空間。
由于涉及大量元素的復(fù)制,該操作速度較慢,在涉及大量元素添加時(shí)不建議使用該方法。

(2)使用列表對(duì)象的append()方法在當(dāng)前列表尾部追加元素,原
地修改列表
所謂“原地”,是指不改變列表在內(nèi)存中的首地址。
是真正意義上的在列表尾部添加元素,速度較快。

>>> aList.append(9)>>> aList[3, 4, 5, 7, 9]

3)使用列表對(duì)象的extend()方法可以將另一個(gè)迭代對(duì)象的所有元素添加 至該列表對(duì)象尾部。
通過extend()方法來增加列表元素也不改變其內(nèi)存首地址,屬原地操作。

>>> a= [1,2,3]>>> id(a)46036232>>> a.extend([2,3,4])>>> id(a)46036232>>> print(a)[1, 2, 3, 2, 3, 4]

(4)使用列表對(duì)象的insert()方法將元素添加至列表的指定位置。

>>> a.insert(3, 6) #在下標(biāo)為3的位置插入元素6>>> print(a)[1, 2, 3, 6, 2, 3, 4]>>> id(a)46036232

(5)使用乘法來擴(kuò)展列表對(duì)象,將列表與整數(shù)相乘,生成一個(gè)新列表, 新列表是原列表中元素的重復(fù)

>>> aList = aList*3 >>> aList [3, 5, 7, 3, 5, 7, 3, 5, 7] >>> bList [3,5,7] >>> id(aList), id(bList) (57092680, 57091464)

??使用列表對(duì)象的count()方法統(tǒng)計(jì)指定元素在列表對(duì)象中出現(xiàn)的次數(shù)。
??使用in關(guān)鍵字來判斷一個(gè)值是否存在于列表中,返回結(jié)果為“True”或“False”。

>>> bList = [[1], [2], [3]] >>> 3 in bListFalse

切片

切片適用于列表、元組、字符串、range對(duì)象等類型,但作用于列表時(shí)功能最強(qiáng)大。
可以使用切片來截取列表中的任何部分,得到一個(gè)新列表,也可以通過切片來修改和刪除列表中部分元素,甚至可以通過切片操作為列表對(duì)象增加元素。
切片使用2個(gè)冒號(hào)分隔的3個(gè)數(shù)字來完成:
形式上,切片使用2個(gè)冒號(hào)分隔的3個(gè)數(shù)字來完成。

[start🔚step]
1
第一個(gè)數(shù)字start表示切片開始位置,默認(rèn)為0;
第二個(gè)數(shù)字end表示切片截止(但不包含)位置(默認(rèn)為列表長度);
第三個(gè)數(shù)字step表示切片的步長(默認(rèn)為1)。
當(dāng)start為0時(shí)可以省略,當(dāng)end為列表長度時(shí)可以省略,當(dāng)step為1時(shí)可以省略,省略步長時(shí)還可以同時(shí)省略最后一個(gè)冒號(hào)。
當(dāng)step為負(fù)整數(shù)時(shí),表示反向切片,這時(shí)start應(yīng)該在end的右側(cè)才行。

切片操作不會(huì)因?yàn)橄聵?biāo)越界而拋出異常,而是簡單地在列表尾部截?cái)嗷蛘叻祷匾粋€(gè)空列表,代碼具有更強(qiáng)的健壯性。

>>> aList = [3, 4, 5, 6, 7, 9, 11, 13, 15, 17] >>> aList[::] #返回包含所有元素的新列表 [3, 4, 5, 6, 7, 9, 11, 13, 15, 17] >>> aList[::-1] #逆序的所有元素 [17, 15, 13, 11, 9, 7, 6, 5, 4, 3] >>> aList[::2] #偶數(shù)位置,隔一個(gè)取一個(gè) [3, 5, 7, 11, 15] >>> aList[1::2] #奇數(shù)位置,隔一個(gè)取一個(gè) [4, 6, 9, 13, 17] >>> aList[3::] #從下標(biāo)3開始的所有元素 [6, 7, 9, 11, 13, 15, 17] >>> aList[3:6] #下標(biāo)在[3, 6)之間的所有元素 [6, 7, 9] >>> aList[0:100:1] #前100個(gè)元素,自動(dòng)截?cái)? 切片開始位置大于列表長度時(shí),返回空列表 [3, 4, 5, 6, 7, 9, 11, 13, 15, 17] >>> aList[100:] #下標(biāo)100之后的所有元素,自動(dòng)截?cái)?/span> [] >>> aList[100] #直接使用下標(biāo)訪問會(huì)發(fā)生越界 IndexError: list index out of range >>> aList = [3, 5, 7] >>> aList[:2] = [1, 2] #替換前2個(gè)元素 >>> aList [1, 2, 7] >>> aList = list(range(10)) >>> aList [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> aList[::2] = [0]*5 #替換偶數(shù)位置上的元素 >>> aList [0, 1, 0, 3, 0, 5, 0, 7, 0, 9] >>> aList[::2] = [0]*3

列表推導(dǎo)式

列表推導(dǎo)式(又稱列表解析式)提供了一種簡明扼要的方法來創(chuàng)建列表。
它的結(jié)構(gòu)是在一個(gè)中括號(hào)里包含一個(gè)表達(dá)式,然后是一個(gè)for語句,然后是 0 個(gè)或多個(gè) for 或者 if 語句。那個(gè)表達(dá)式可以是任意的,意思是你可以在列表中放入任意類型的對(duì)象。返回結(jié)果將是一個(gè)新的列表,在這個(gè)以 if 和 for 語句為上下文的表達(dá)式運(yùn)行完成之后產(chǎn)生。
列表推導(dǎo)式的執(zhí)行順序:
各語句之間是嵌套關(guān)系,左邊第二個(gè)語句是最外層,依次往右進(jìn)一層,左邊第一條語句是最后一層。
[x*y for x in range(1,5) if x > 2 for y in range(1,4) if y < 3]
即:

for x in range(1,5) if x > 2 for y in range(1,4) if y < 3 x*y

編寫算法實(shí)現(xiàn)嵌套列表的平鋪

[[1,2,3], [4,5,6]] -> [1, 2, 3, 4, 5, 6] 解答一: >>> vec = [[1, 2, 3], [4, 5, 6]] >>> result = [] >>> for elem in vec:for num in elem:result.append(num)>>> result [1, 2, 3, 4, 5, 6] 解答二: >>> vec = [[1, 2, 3], [4, 5, 6]] >>> sum(vec, []) [1, 2, 3, 4, 5, 6, 7, 8, 9]解答三:使用列表推導(dǎo)式實(shí)現(xiàn) >>> vec = [[1,2,3], [4,5,6]] >>> [num for elem in vec for num in elem] [1, 2, 3, 4, 5, 6, 7, 8, 9]

列出當(dāng)前文件夾下所有Python源文件

>>> import os >>> [filename for filename in os.listdir('.')if filename.endswith(('.py', '.pyw'))]過濾不符合條件的元素>>> aList = [-1,-4,6,7.5,-2.3,9,-11] >>> [i for i in aList if i>0] [6, 7.5, 9]

元組

??元組一旦定義就不允許更改。
??元組沒有append()、extend()和insert()等方法,無法向元組中添加元素。
??元組沒有remove()或pop()方法,也無法對(duì)元組元素進(jìn)行del操作,不能從元組中刪除元素。
??使用tuple函數(shù)將其他序列轉(zhuǎn)換為元組
??元組的定義方式和列表相同,但定義時(shí)所有元素是放在一對(duì)圓括號(hào)“()”中,而不是方括號(hào)中。

zip() 函數(shù):用于將可迭代的對(duì)象作為參數(shù),將對(duì)象中對(duì)應(yīng)的元素打包成一個(gè)個(gè)元組,然后返回由這些元組組成的列表

>>>a = [1,2,3] >>> b = [4,5,6] >>> c = [4,5,6,7,8] >>> zipped = zip(a,b) # 打包為元組的列表 [(1, 4), (2, 5), (3, 6)] >>> zip(a,c) # 元素個(gè)數(shù)與最短的列表一致 [(1, 4), (2, 5), (3, 6)] >>> zip(*zipped) # 與 zip 相反,*zipped 可理解為解壓,返回二維矩陣式 [(1, 2, 3), (4, 5, 6)]

tuple函數(shù)的使用:

>>> tuple('abcdefg') #把字符串轉(zhuǎn)換為元組 ('a', 'b', 'c', 'd', 'e', 'f', 'g') >>> aList [-1, -4, 6, 7.5, -2.3, 9, -11] >>> tuple(aList) #把列表轉(zhuǎn)換為元組 (-1, -4, 6, 7.5, -2.3, 9, -11) >>> s = tuple() #空元組 >>> s ()

使用del可以刪除元組對(duì)象,不能刪除元組中的元素

元組的優(yōu)點(diǎn)
元組的速度比列表更快。如果定義了一系列常量值,而所需做的僅是對(duì)它進(jìn)行遍歷,那么一般使用元組而不用列表。
元組對(duì)不需要改變的數(shù)據(jù)進(jìn)行“寫保護(hù)”將使得代碼更加安全。
元組可用作字典的“鍵”,也可以作為集合的元素。列表永遠(yuǎn)不能當(dāng)做字典鍵使用,也不能作為集合的元素,因?yàn)榱斜聿皇遣豢勺兊摹?/p>

序列解包(sequence unpacking

當(dāng)函數(shù)或方法返回元組時(shí),將元組中值賦給變量序列中的變量,這個(gè)過程就叫做序列解包。
可以使用序列解包功能對(duì)多個(gè)變量同時(shí)賦值

>>> x, y, z = 1, 2, 3 #多個(gè)變量同時(shí)賦值 >>> v_tuple = (False, 3.5, 'exp') >>> (x, y, z) = v_tuple >>> x, y, z = v_tuple >>> x, y, z = range(3) #可以對(duì)range對(duì)象進(jìn)行序列解包 >>> x, y, z = iter([1, 2, 3]) #使用迭代器對(duì)象進(jìn)行序列解包 >>> x, y, z = map(str, range(3)) #使用可迭代的map對(duì)象進(jìn)行序列解包 >>> a, b = b, a #交換兩個(gè)變量的值 >>> x, y, z = sorted([1, 3, 2]) #sorted()函數(shù)返回排序后的列表 >>> a, b, c = 'ABC' #字符串也支持序列解包 >>> x = [1, 2, 3, 4, 5, 6] >>> x[:3] = map(str, range(5)) #切片也支持序列解包

序列解包遍歷多個(gè)序列

>>> keys = ['a', 'b', 'c', 'd']>>> values = [1, 2, 3, 4]>>> for k, v in zip(keys, values):print((k, v), end=' ')('a', 1) ('b', 2) ('c', 3) ('d', 4)

使用序列解包遍歷enumerate對(duì)象

>>> x = ['a', 'b', 'c'] >>> for i, v in enumerate(x): print('The value on position {0} is {1}'.format(i,v))The value on position 0 is aThe value on position 1 is bThe value on position 2 is c >>> aList = [1,2,3]>>> bList = [4,5,6]>>> cList = [7,8,9]>>> dList = zip(aList, bList, cList)>>> for index, value in enumerate(dList):print(index, ':', value)0 : (1, 4, 7)1 : (2, 5, 8)2 : (3, 6, 9)

生成器推導(dǎo)式

生成器推導(dǎo)式的結(jié)果是一個(gè)生成器對(duì)象。
使用生成器對(duì)象的元素時(shí),可以根據(jù)需要將其轉(zhuǎn)化為列表或元組,也可以使用生成器對(duì)象__next__()方法或內(nèi)置函數(shù)next()進(jìn)行遍歷,或者直接將其作為迭代器對(duì)象來使用。
生成器對(duì)象具有惰性求值的特點(diǎn),只在需要時(shí)生成新元素,比列表推導(dǎo)式具有更高的效率,空間占用非常少,尤其適合大數(shù)據(jù)處理的場(chǎng)合。
不管用哪種方法訪問生成器對(duì)象,都無法再次訪問已訪問過的元素。

>>> g = ((i+2)**2 for i in range(10)) #創(chuàng)建生成器對(duì)象>>> g<generator object <genexpr> at 0x0000000003095200>>>> tuple(g) #轉(zhuǎn)換為元組(4, 9, 16, 25, 36, 49, 64, 81, 100, 121)>>> list(g)[] >>> g = ((i+2)**2 for i in range(10)) #重新創(chuàng)建生成器對(duì)象>>> g.__next__() #使用生成器對(duì)象的__next__()方法獲取元素4>>> next(g) #使用函數(shù)next()獲取生成器對(duì)象中的元素16# 使用for循環(huán)直接迭代生成器對(duì)象中的元素>>> g = ((i+2)**2 for i in range(10)) >>> for item in g: #使用循環(huán)直接遍歷生成器對(duì)象中的元素print(item, end=' ')4 9 16 25 36 49 64 81 100 121

字典

字典是無序、可變序列。
定義字典時(shí),每個(gè)元素的鍵和值用冒號(hào)分隔,元素之間用逗號(hào)分隔,所有的元素放在一對(duì)大括號(hào)“{}”中。
字典中的鍵可以為任意不可變數(shù)據(jù),比如整數(shù)、實(shí)數(shù)、復(fù)數(shù)、字符串、元組等等。
globals()返回包含當(dāng)前作用域內(nèi)所有全局變量和值的字典
locals()返回包含當(dāng)前作用域內(nèi)所有局部變量和值的字典

使用=將一個(gè)字典賦值給一個(gè)變量

>>> a_dict = {'server': 'db.diveintopython3.org', 'database': 'mysql'}>>> a_dict{'database': 'mysql', 'server': 'db.diveintopython3.org'}>>> x = {} #空字典>>> x{} 使用dict利用已有數(shù)據(jù)創(chuàng)建字典>>> keys = ['a', 'b', 'c', 'd']>>> values = [1, 2, 3, 4]>>> dictionary = dict(zip(keys, values))>>> dictionary{'a': 1, 'c': 3, 'b': 2, 'd': 4}>>> x = dict() #空字典>>> x{}

集合

集合是無序、可變序列,使用一對(duì)大括號(hào)界定,元素不可重復(fù),同一個(gè)集合中每個(gè)元素都是唯一的。

集合中只能包含數(shù)字、字符串、元組等不可變類型(或者說可哈希)的數(shù)據(jù),而不能包含列表、字典、集合等可變類型的數(shù)據(jù)。

使用set將其他類型數(shù)據(jù)轉(zhuǎn)換為集合

>>> a_set = set(range(8,14))

>>> a_set

{8, 9, 10, 11, 12, 13}

>>> b_set = set([0, 1, 2, 3, 0, 1, 2, 3, 7, 8]) #自動(dòng)去除重復(fù)

>>> b_set

{0, 1, 2, 3, 7, 8}

>>> c_set = set() #空集合

>>> c_set

set()

>>> e={}

>>> type(e)

<class 'dict’>

>>> f={4,}

>>> type(f)

<class ‘set’>

當(dāng)不再使用某個(gè)集合時(shí),刪除方法包括:

?可以使用del命令刪除整個(gè)集合;

?集合對(duì)象的pop()方法彈出并刪除其中一個(gè)元素;

?remove()方法直接刪除指定元素;

?clear()方法清空集合。

S.add(x)如果數(shù)據(jù)項(xiàng)x不在集合S中,將x增加到s
S.clear()移除S中所有數(shù)據(jù)項(xiàng)
S.copy()返回集合S的一個(gè)拷貝
S.pop()隨機(jī)返回集合S中的一個(gè)元素,如果S為空,產(chǎn)生KeyError異常
S.discard(x)如果x在集合S中,移除該元素;如果x不在,不報(bào)錯(cuò)
S.remove(x)如果x在集合S中,移除該元素;不在產(chǎn)生KeyError異常
S.isdisjoint(T)如果集合S與T沒有相同元素(不相交的),返回True
len(S)返回集合S元素個(gè)數(shù)
x in S如果x是S的元素,返回True,否則返回False
x not in S如果x不是S的元素,返回True,否則返回False
操作符描述
S – T 或 S.difference(T)返回一個(gè)新集合,包括在集合S中但不在集合T中的元素
S-=T或S.difference_update(T)更新集合S,包括在集合S中但不在集合T中的元素
S & T或S.intersection(T)返回一個(gè)新集合,包括同時(shí)在集合S和T中的元素
S&=T或S.intersection_update(T)更新集合S,包括同時(shí)在集合S和T中的元素。
S^T或s.symmetric_difference(T)返回一個(gè)新集合,包括集合S和T中元素,但不包括同時(shí)在其中的元素
S=^T或s.symmetric_difference_update(T)更新集合S,包括集合S和T中元素,但不包括同時(shí)在其中的元素
S|T或S.union(T)返回一個(gè)新集合,包括集合S和T中所有元素
S=|T或S.update(T)更新集合S,包括集合S和T中所有元素
S<=T或S.issubset(T)如果S與T相同或S是T的子集,返回True,否則返回False,可以用S<T判斷S是否是T的真子集
S>=T或S.issuperset(T)如果S與T相同或S是T的超集,返回True,否則返回False,可以用S>T判斷S是否是T的真超集

生成不重復(fù)隨機(jī)數(shù)

def RandomNumbersBySet(number, start, end):data = set()while True:data.add(random.randint(start, end))if len(data) == number:breakreturn data


使用sorted排序:

>>> persons = [{‘name’:‘Li’, ‘a(chǎn)ge’:40}, {‘name’:‘Li’, ‘a(chǎn)ge’:37}, {‘name’:‘Dong’, ‘a(chǎn)ge’:43}]

>>> print(persons)

[{‘name’: ‘Li’, ‘a(chǎn)ge’: 40}, {‘name’: ‘Li’, ‘a(chǎn)ge’: 37}, {‘name’: ‘Dong’, ‘a(chǎn)ge’: 43}]

#使用key來指定排序依據(jù),先按姓名升序排序,姓名相同的按年齡降序排序

>>> print(sorted(persons, key=lambda x:(x[‘name’], -x[‘a(chǎn)ge’])))

[{‘name’: ‘Dong’, ‘a(chǎn)ge’: 43}, {‘name’: ‘Li’, ‘a(chǎn)ge’: 40}, {‘name’: ‘Li’, ‘a(chǎn)ge’: 37}]


其他數(shù)據(jù)結(jié)構(gòu):隊(duì)列 堆棧 二叉樹


堆是非線性的樹形的數(shù)據(jù)結(jié)構(gòu),包括:最大堆與最小堆。
heapq庫中的堆默認(rèn)是最小堆。

>>> import heapq #heapq和random是Python標(biāo)準(zhǔn)庫 >>> import random >>> data = list(range(10)) >>> data [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> random.shuffle(data) #隨機(jī)打亂順序 >>> data [6, 1, 3, 4, 9, 0, 5, 2, 8, 7] >>> heap=[] >>> for n in data: #建堆heapq.heappush(heap,n)>>> heap [0, 2, 1, 4, 7, 3, 5, 6, 8, 9] >>> heapq.heappop(heap) >>> myheap = [1,2,3,5,7,8,9,4,10,333] >>> heapq.heapify(myheap) #建堆 >>> myheap [1, 2, 3, 4, 7, 8, 9, 5, 10, 333] >>> heapq.heapreplace(myheap,6) #彈出最小元素, #同時(shí)插入新元素 1 >>> myheap [2, 4, 3, 5, 7, 8, 9, 6, 10, 333] >>> heapq.nlargest(3, myheap) #返回前3個(gè)最大的元素 [333, 10, 9] >>> heapq.nsmallest(3, myheap) #返回前3個(gè)最小的元素 [2, 3, 4]

棧是一種“后進(jìn)先出(LIFO)”或“先進(jìn)后出(FILO)”的數(shù)據(jù)結(jié)構(gòu)。

自定義棧的用法>>> import Stack >>> x = Stack.Stack() >>> x.push(1) >>> x.push(2) >>> x.show() [1, 2] >>> x.pop() 2 >>> x.show() [1] >>> x.showRemainderSpace() Stack can still PUSH 9 elements. >>> x.isEmpty() False >>> x.isFull() False

Python列表本身就可以實(shí)現(xiàn)棧結(jié)構(gòu)的基本操作。例如,列表對(duì)象的append()方法是在列表尾部追加元素,類似于入棧操作;pop()方法默認(rèn)是彈出并返回列表的最后一個(gè)元素,類似于出棧操作。

可以直接使用列表來實(shí)現(xiàn)棧結(jié)構(gòu)>>> myStack = [] >>> myStack.append(3) >>> myStack.append(5) >>> myStack.append(7) >>> myStack [3, 5, 7] >>> myStack.pop() 7 >>> myStack.pop() 5 >>> myStack.pop() 3 >>> myStack.pop() 出錯(cuò)

但是直接使用Python列表對(duì)象模擬棧操作并不是很方便,例如當(dāng)列表為空時(shí)再執(zhí)行pop()出棧操作時(shí)則會(huì)拋出一個(gè)不很友好的異常;另外,也無法限制棧的大小。
列表模擬隊(duì)列:
(將上面的pop改為pop(0)即可)

使用列表來模擬隊(duì)列結(jié)構(gòu)>>> x = [1, 2, 3, 4] >>> x.pop(0) 1 >>> x.pop(0) 2 >>> x.append(5) >>> x.pop(0) 3 >>> x.pop(0) 4 >>> x.pop(0) 5 >>> x.pop(0)

也可以使用標(biāo)準(zhǔn)庫中的Queue

>>> import queue >>> q = queue.Queue() >>> q.put(0) #入隊(duì) >>> q.put(1) >>> q.put(2) >>> q.queue deque([0, 1, 2]) >>> q.get() #出隊(duì) 0 >>> q.queue deque([1, 2]) >>> q.get() 1 >>> q.queue

優(yōu)先隊(duì)列(Priority Queue)

>>> from queue import PriorityQueue #優(yōu)先級(jí)隊(duì)列 >>> q = PriorityQueue() #創(chuàng)建優(yōu)先級(jí)隊(duì)列對(duì)象 >>> q.put(3) #插入元素 >>> q.put(8) #插入元素 >>> q.put(100) >>> q.queue #查看優(yōu)先級(jí)隊(duì)列中所有元素 [3, 8, 100] >>> q.put(1) #插入元素,自動(dòng)調(diào)整優(yōu)先級(jí)隊(duì)列 >>> q.put(2) >>> q.queue [1, 2, 100, 8, 3] >>> q.get() #返回并刪除優(yōu)先級(jí)最低的元素 1 >>> q.get() #請(qǐng)多執(zhí)行幾次該語句并觀察返回的數(shù)據(jù) 2 >>> q.get() 3 >>> q.get() 8 >>> q.get() 100

二叉樹:

使用代碼中的類BinaryTree創(chuàng)建的對(duì)象不僅支持二叉樹的創(chuàng)建以及前序遍歷、中序遍歷與后序遍歷等三種常用的二叉樹節(jié)點(diǎn)遍歷方式,還支持二叉樹中任意“子樹”的遍歷。

class BinaryTree:def __init__(self, value):self.__left = Noneself.__right = Noneself.__data = valuedef insertLeftChild(self, value): #創(chuàng)建左子樹if self.__left:print('__left child tree already exists.')else:self.__left = BinaryTree(value)return self.__left def preOrder(self): #前序遍歷print(self.__data) #輸出根節(jié)點(diǎn)的值if self.__left:self.__left.preOrder() #遍歷左子樹if self.__right:self.__right.preOrder() #遍歷右子樹def postOrder(self): #后序遍歷if self.__left:self.__left.postOrder()if self.__right:self.__right.postOrder()print(self.__data)def insertRightChild(self, value): #創(chuàng)建右子樹if self.__right:print('Right child tree already exists.')else:self.__right = BinaryTree(value)return self.__rightdef show(self):print(self.__data)

程序的控制結(jié)構(gòu)

分支與循環(huán)結(jié)構(gòu): 例子: 一年365天,一周5個(gè)工作日,如果每個(gè)工作日都很努力,可以提高r%,僅在周末放任一下,能力值每天下降r%,效果如何呢?

dayup, r = 1.0, 0.01 for i in range(365):if i % 7 in [6, 0]:#周六周日dayup = dayup * (1 - r)else:dayup = dayup * (1 + r) print("向上5天向下2天的力量: {:.2f}.".format(dayup))

在選擇和循環(huán)結(jié)構(gòu)中,都要使用條件表達(dá)式來確定下一步的執(zhí)行流程。
???條件表達(dá)式的值只要不是False、0(或0.0、0j等)、空值None、空列表、空元組、空集合、空字典、空字符串、空range對(duì)象或其他空迭代對(duì)象,Python解釋器均認(rèn)為與True等價(jià)。
???從這個(gè)意義上來講,幾乎所有的Python合法表達(dá)式都可以作為條件表達(dá)式,包括含有函數(shù)調(diào)用的表達(dá)式。

算術(shù)運(yùn)算符:+、-、*、/、//、%、**
關(guān)系運(yùn)算符:>、<、==、<=、>=、!=
測(cè)試運(yùn)算符:in、not in、is、is not
邏輯運(yùn)算符:and、or、not
位運(yùn)算符:~、&、|、 ^、 <<、>>
矩陣乘法運(yùn)算符:@

邏輯運(yùn)算符and和or以及關(guān)系運(yùn)算符具有惰性求值特點(diǎn),只計(jì)算必須計(jì)算的表達(dá)式。
以“and”為例,對(duì)于表達(dá)式“表達(dá)式1 and 表達(dá)式2”而言,如果“表達(dá)式1”的值為“False”或其他等價(jià)值時(shí),不論“表達(dá)式2”的值是什么,整個(gè)表達(dá)式的值都是“False”,此時(shí)“表達(dá)式2”的值無論是什么都不影響整個(gè)表達(dá)式的值,因此將不會(huì)被計(jì)算,從而減少不必要的計(jì)算和判斷。

應(yīng)用

用戶輸入若干個(gè)分?jǐn)?shù),求所有分?jǐn)?shù)的平均分。每輸入一個(gè)分?jǐn)?shù)后詢問是否繼續(xù)輸入下一個(gè)分?jǐn)?shù),回答“yes”就繼續(xù)輸入下一個(gè)
分?jǐn)?shù),回答“no”就停止輸入分?jǐn)?shù)。

numbers = [] #使用列表存放臨時(shí)數(shù)據(jù) while True:x = input('請(qǐng)輸入一個(gè)成績:')try: #異常處理結(jié)構(gòu)numbers.append(float(x))except:print('不是合法成績')while True:flag = input('繼續(xù)輸入嗎?(yes/no)').lower()if flag not in ('yes', 'no'): #限定用戶輸入內(nèi)容必須為yes或noprint('只能輸入yes或no')else:breakif flag=='no':break

例:編寫程序,判斷今天是今年的第幾天?

>>>import time>>> date = time.localtime() #獲取當(dāng)前日期時(shí)間 time.struct_time(tm_year=2020, tm_mon=12, tm_mday=10, tm_hour=7, tm_min=27, tm_sec=36, tm_wday=3, tm_yday=345, tm_isdst=0) >>> year, month, day = date[:3] >>> day_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]>>> if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0): #判斷是否為閏年day_month[1] = 29>>> if month==1:print(day) else:print(sum(day_month[:month-1])+day)

例:計(jì)算1+2+3+…+100 的值。

#解法一: s=0 for i in range(1,101):s = s + i print('1+2+3+…+100 = ', s) #解法二: print('1+2+3+…+100 = ', sum(range(1,101)))

例:輸出“水仙花數(shù)”。

所謂水仙花數(shù)是指1個(gè)3位的十進(jìn)制數(shù),其各位數(shù)字的立方和等于該數(shù)本身。例如:153是水仙花數(shù),因?yàn)?53 = 13 + 53 + 33 。

#解法一: for i in range(100, 1000):bai, shi, ge = map(int, str(i))if ge**3 + shi**3 + bai**3 == i:print(i)

例:判斷一個(gè)數(shù)是否為素?cái)?shù)。

import mathn = input('Input an integer:') n = int(n) m = math.ceil(math.sqrt(n)+1) for i in range(2, m):if n%i == 0 and i<n:print('No')break else:print('Yes')

“ceil函數(shù)定義:將給定的數(shù)值轉(zhuǎn)換成大于或等于它的最小整數(shù)(取不小于給定值的最小整數(shù))”

例:生成一個(gè)含有20個(gè)隨機(jī)數(shù)的列表,

要求所有元素不相同,并且每個(gè)元素的值介于1到100之間。

import randomx = [] while True:if len(x)==20:breakn = random.randint(1, 100)if n not in x:x.append(n) print(x) print(len(x)) print(sorted(x))

計(jì)算百錢買百雞問題。

假設(shè)公雞5元一只,母雞3元一只,小雞1元三只,現(xiàn)在有100塊錢,想買100只雞,問有多少種買法?

#假設(shè)能買x只公雞 for x in range(21):#假設(shè)能買y只母雞for y in range(34):#假設(shè)能買z只小雞z = 100-x-yif z%3==0 and 5*x + 3*y + z//3 == 100:print(x,y,z)

例 編寫程序,實(shí)現(xiàn)十進(jìn)制整數(shù)到其他任意進(jìn)制的轉(zhuǎn)換。

編程要點(diǎn):除基取余,逆序排列
十進(jìn)制數(shù)668轉(zhuǎn)換為八進(jìn)制數(shù)字的過程如下圖所示,其中橫著向右的箭頭表示左邊的數(shù)字除以8得到的商,而向下的箭頭表示上面的數(shù)字除以8得到的余數(shù)。當(dāng)商為0時(shí),算法結(jié)束,最后把得到的余數(shù)4321逆序得到1234。

n, base = eval(input(“n:)),eval(input(“base:))result = []div = nwhile div != 0:div, mod = divmod(div, base)result.append(mod)result.reverse() result = ''.join(map(str, result))print(eval(result))

例 計(jì)算前n個(gè)自然數(shù)的階乘之和1!+2!+3!+…+n!的值。

n = evl(input(“n:)) result, t = 1, 1 for i in range(2, n+1):t *= iresult += t

例 判斷一個(gè)數(shù)字是否為丑數(shù)。

一個(gè)數(shù)的因數(shù)如果只包含2、3、5,那么這個(gè)數(shù)是丑數(shù)。

n = eval(input(“n:))for i in (2, 3, 5):while True:m, r = divmod(n, i)if r != 0:breakelse:print(m)n = mprint(n==1)

字符串和正則表達(dá)式

多種不同的編碼格式,常見的主要有UTF-8、UTF-16、UTF-32、GB2312、GBK、CP936、base64、CP437等;
GB2312是我國制定的中文編碼,使用1個(gè)字節(jié)表示英語,2個(gè)字節(jié)表示中文;GBK是GB2312的擴(kuò)充,而CP936是微軟在GBK基礎(chǔ)上開發(fā)的編碼方式。GB2312、GBK和CP936都是使用2個(gè)字節(jié)表示中文;
UTF-8對(duì)全世界所有國家需要用到的字符進(jìn)行了編碼,以1個(gè)字節(jié)表示英語字符(兼容ASCII),以3個(gè)字節(jié)表示常見漢字,還有些語言的符號(hào)使用2個(gè)字節(jié)(例如俄語和希臘語符號(hào))或4個(gè)字節(jié)。
Python 3.x完全支持中文字符,默認(rèn)使用UTF8編碼格式,無論是一個(gè)數(shù)字、英文字母,還是一個(gè)漢字,在統(tǒng)計(jì)字符串長度時(shí)都按一個(gè)字符對(duì)待和處理。

>>> s = '合肥工業(yè)大學(xué)' >>> len(s) #字符串長度,或者包含的字符個(gè)數(shù) 6>>> s = '合肥工業(yè)大學(xué)HFUT' #中文與英文字符同樣對(duì)待,都算一個(gè)字符 >>> len(s) 10>>> 姓名 = '張三' #使用中文作為變量名 >>> print(姓名) #輸出變量的值 張三

字符串常用方法、

find()、rfind()、index()、rindex()、count()

find()和rfind方法分別用來查找一個(gè)字符串在另一個(gè)字符串指定范圍(默認(rèn)是整個(gè)字符串)中首次和最后一次出現(xiàn)的位置,如果不存在則返回-1;
Python find() 方法檢測(cè)字符串中是否包含子字符串 str ,如果指定 beg(開始) 和 end(結(jié)束) 范圍,則檢查是否包含在指定范圍內(nèi),如果包含子字符串返回開始的索引值,否則返回-1。

語法
find()方法語法:

str.find(str, beg=0, end=len(string))
index()和rindex()方法用來返回一個(gè)字符串在另一個(gè)字符串指定范圍中首次和最后一次出現(xiàn)的位置,如果不存在則拋出異常;
count()方法用來返回一個(gè)字符串在當(dāng)前字符串中出現(xiàn)的次數(shù)。

s="apple,peach,banana,peach,pear" >>> s.find("peach") 6 >>> s.find("peach",7) 19 >>> s.find("peach",7,20) -1 >>> s.rfind('p') 25 >>> s.index('p') 1 >>> s.index('pe') 6

split()

split()和rsplit()方法如果不指定分隔符,則字符串中的任何空白符號(hào)(包括空格、換行符、制表符等)都被認(rèn)為是分隔符,返回包含最終分隔符的列表
split()和rsplit()方法還允許指定最大分割次數(shù)。

>>> s = '\n\nhello\t\t world \n\n\n My name is Python ' >>> s.split(None, 1) ['hello', 'world \n\n\n My name is Python '] >>> s.rsplit(None, 1) ['\n\nhello\t\t world \n\n\n My name is', 'Python'] >>> s.split(None, 2) ['hello', 'world', 'My name is Python '] >>> s.rsplit(None, 2) ['\n\nhello\t\t world \n\n\n My name', 'is', 'Python'] >>> s.split(maxsplit=6) ['hello', 'world', 'My', 'name', 'is', 'Python'] >>> s.split(maxsplit=100) #最大分隔次數(shù)大于可分隔次數(shù)時(shí)無效 ['hello', 'world', 'My', 'name', 'is', 'Python']

join

字符串連接join()

>>> li = ["apple", "peach", "banana", "pear"] >>> ','.join(li) 'apple,peach,banana,pear' >>> '::'.join(li) 'apple::peach::banana::pear'

查找替換replace(),類似于Word中的“全部替換”功能。

>>> s = "中國,中國" >>> print(s) 中國,中國 >>> s2 = s.replace("中國", "中華人民共和國") #兩個(gè)參數(shù)都作為一個(gè)整體 >>> print(s2) 中華人民共和國,中華人民共和國

應(yīng)用:測(cè)試用戶輸入中是否有敏感詞,如果有的話就把敏感詞替換為3個(gè)星號(hào)***。

>>> words = ('測(cè)試', '非法', '暴力', '話') >>> text = '這句話里含有非法內(nèi)容' >>> for word in words:if word in text:text = text.replace(word, '***') >>> text

strip()、rstrip()、lstrip()

>>> '\n\nhello world \n\n'.strip() #刪除空白字符 'hello world' >>> "aaaassddf".strip("a") #刪除指定字符 'ssddf' >>> "aaaassddfaaa".rstrip("a") #刪除字符串右端指定字符 'aaaassddf' >>> "aaaassddfaaa".lstrip("a") #刪除字符串左端指定字符 'ssddfaaa'

Python字符串支持與整數(shù)的乘法運(yùn)算,表示序列重復(fù),也就是字符串內(nèi)容的重復(fù),得到新字符串。

>>> 'abcd' * 3 'abcdabcdabcd'

s.startswith(t)、s.endswith(t),判斷字符串是否以指定字符串開始或結(jié)束
isalnum()【用來判斷一個(gè)字符是否為英文字母或數(shù)字,相當(dāng)于 isalpha? || isdigit?】、isalpha()、isdigit()、isdecimal()【isdecimal() 方法檢查字符串是否只包含十進(jìn)制字符?!?、isnumeric()、isspace()、isupper()、islower(),用來測(cè)試字符串是否為數(shù)字或字母、是否為字母、是否為數(shù)字字符、是否為空白字符、是否為大寫字母以及是否為小寫字母。

注意:定義一個(gè)十進(jìn)制字符串,只需要在字符串前添加 ‘u’ 前綴即可。
str = u"this2009";
print str.isdecimal();

str = u"23443434";
print str.isdecimal();
以上實(shí)例輸出結(jié)果如下:

False
True

格式化

在Python中,字符串屬于不可變序列類型,除了支持序列通用方法(包括分片操作)以外,還支持特有的字符串操作方法。

格式字符說明
%s字符串 (采用str()的顯示)
%r字符串 (采用repr()的顯示)詳細(xì) 見倒數(shù)第2頁P(yáng)PT
%c單個(gè)字符
%d十進(jìn)制整數(shù)
%i十進(jìn)制整數(shù)
%o八進(jìn)制整數(shù)
%x十六進(jìn)制整數(shù)
%e指數(shù) (基底寫為e)
%E指數(shù) (基底寫為E)
%f、%F浮點(diǎn)數(shù)
%g指數(shù)(e)或浮點(diǎn)數(shù) (根據(jù)顯示長度)
%G指數(shù)(E)或浮點(diǎn)數(shù) (根據(jù)顯示長度)
%%一個(gè)字符"%"

例子

>>> int('555') 555 >>> '%s'%[1, 2, 3] #直接把對(duì)象轉(zhuǎn)換成字符串 '[1, 2, 3]' >>> str((1,2,3)) #直接把對(duì)象轉(zhuǎn)換成字符串 '(1, 2, 3)' >>> str([1,2,3]) '[1, 2, 3]' >>> list(str([1, 2, 3])) #字符串中的每個(gè)字符都成為列表的元素(特別注意空格哦,英文規(guī)范) ['[', '1', ',', ' ', '2', ',', ' ', '3', ']'] >>> eval(str([1, 2, 3])) #eval() 函數(shù)用來執(zhí)行一個(gè)字符串表達(dá)式,并返回表達(dá)式的值。 [1, 2, 3] >>>x = 7 >>> eval('3 * x') 21 >>> eval('pow(2,2)') 4 >>> eval('2 + 2') 4 >>> n=81 >>> eval("n + 4") 85

.format:

基本語法是通過 {}: 來代替以前的 % 。 format 函數(shù)可以接受不限個(gè)參數(shù),位置可以不按順序。 >>>"{} {}".format("hello", "world") # 不設(shè)置指定位置,按默認(rèn)順序 'hello world’ >>> "{0} {1}".format("hello", "world") # 設(shè)置指定位置 'hello world’ >>> "{1} {0} {1}".format("hello", "world") # 設(shè)置指定位置 'world hello world’ 數(shù)字格式化: >>> print("{:.2f}".format(3.1415926)); 3.14

一些內(nèi)置函數(shù)也可以操作字符串:

>>> x = 'Hello world.' >>> len(x) #字符串長度 12 >>> max(x) #最大字符 'w' >>> min(x) ' ' >>> list(zip(x,x)) #zip()也可以作用于字符串 [('H', 'H'), ('e', 'e'), ('l', 'l'), ('l', 'l'), ('o', 'o'), (' ', ' '), ('w', 'w'), ('o', 'o'), ('r', 'r'), ('l', 'l'), ('d', 'd'), ('.', '.')] >>> max(['abc', 'ABD'], key=str.upper) #忽略大小寫 'ABD'

切片也適用于字符串,但僅限于讀取其中的元素,不支持字符串修改。

>>> 'Explicit is better than implicit.'[:8] 'Explicit' >>> 'Explicit is better than implicit.'[9:23] 'is better than

與字符串處理有關(guān)的標(biāo)準(zhǔn)庫

#Python標(biāo)準(zhǔn)庫string中定義數(shù)字字符、標(biāo)點(diǎn)符號(hào)、英文字母、大寫字母、小寫字母等常量。>>> import string >>> string.digits '0123456789' >>> string.punctuation '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~' >>> string.ascii_letters 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' >>> string.ascii_lowercase 'abcdefghijklmnopqrstuvwxyz' >>> string.ascii_uppercase 'ABCDEFGHIJKLMNOPQRSTUVWXYZ

應(yīng)用:隨機(jī)密碼生成原理。
string.ascii_uppercase 所有大寫字母

string.ascii_lowercase 所有小寫字母

string.ascii_letters 所有字母

>>> import string >>> characters = string.digits + string.ascii_letters >>> import random >>> ''.join([random.choice(characters) for i in range(8)]) 'J5Cuofhy' >>> ''.join([random.choice(characters) for i in range(10)]) 'RkHA3K3tNl' >>> ''.join([random.choice(characters) for i in range(16)]) 'zSabpGltJ0X4CCjh'

編寫程序,把一個(gè)英文句子中的單詞倒置

標(biāo)點(diǎn)符號(hào)不倒置,例如 I like python. 經(jīng)過函數(shù)后變?yōu)?#xff1a;python. like I

def rev1(s):
return ’ '.join(reversed(s.split()))

def rev2(s):
t = s.split()
t.reverse()
return ’ '.join(t)

def rev5(s):
‘’‘字符串整體逆序,分隔,再各單詞逆序’’’
t = ‘’.join(reversed(s)).split()
t = map(lambda x:’’.join(reversed(x)), t)
return ’ '.join(t)

例: 編寫程序,查找一個(gè)字符串中最長的數(shù)字子串。

result = [] temp = [] str = input("請(qǐng)輸入字符串") for character in str:if '0' <= character <='9':temp.append(character)elif temp:result.append(''.join(temp))temp = [] if temp: # 用于處理結(jié)尾為數(shù)字的字符串的情況result.append(''.join(temp)) if result:print(result)print(max(result,key=len)) # 取列表中最大的元素,以元素的長度為條件 else:print("no")

面向?qū)ο蟪绦蛟O(shè)計(jì)

Python完全采用了面向?qū)ο蟪绦蛟O(shè)計(jì)的思想,是真正面向?qū)ο蟮母呒?jí)動(dòng)態(tài)編程語言,完全支持面向?qū)ο蟮幕竟δ?#xff0c;如封裝、繼承、多態(tài)以及對(duì)基類方法的覆蓋或重寫。
Python中對(duì)象的概念很廣泛,Python中的一切內(nèi)容都可以稱為對(duì)象,除了數(shù)字、字符串、列表、元組、字典、集合、range對(duì)象、zip對(duì)象等等,函數(shù)也是對(duì)象,類也是對(duì)象。
創(chuàng)建類時(shí)用變量形式表示的對(duì)象屬性稱為數(shù)據(jù)成員,用函數(shù)形式表示的對(duì)象行為稱為成員方法,成員屬性和成員方法統(tǒng)稱為類的成員。

Python使用class關(guān)鍵字來定義類
class關(guān)鍵字之后是一個(gè)空格,然后是類的名字,再然后是一個(gè)冒號(hào),最后換行并定義類的內(nèi)部實(shí)現(xiàn)。
類名的首字母一般要大寫
當(dāng)然也可以按照自己的習(xí)慣定義類名,但一般推薦參考慣例來命名,并在整個(gè)系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)中保持風(fēng)格一致。

class Car: def infor(self):print(" This is a car ")

類定義后,可以用來實(shí)例化對(duì)象,并通過“對(duì)象名.成員”的方式來訪問其中的數(shù)據(jù)成員或成員方法
car = Car()
car.infor()
This is a car

self參數(shù):

???類的所有實(shí)例方法都必須至少有一個(gè)名為self的參數(shù),且必須是方法的第一個(gè)形參(如果有多個(gè)形參的話),self參數(shù)代表將來要?jiǎng)?chuàng)建的對(duì)象本身。
???在類的實(shí)例方法中訪問實(shí)例屬性時(shí)需以self為前綴。
???在外部通過對(duì)象調(diào)用對(duì)象方法時(shí)并不需要傳遞這個(gè)參數(shù),如果在外部通過類調(diào)用對(duì)象方法則需要顯式為self參數(shù)傳值。
???在類中定義實(shí)例方法時(shí)將第一個(gè)參數(shù)定義為“self”只是一個(gè)習(xí)慣,雖不必須使用,仍建議編寫代碼時(shí)仍以self作為方法的第一個(gè)參數(shù)名字。

???屬于實(shí)例的數(shù)據(jù)成員一般是指在構(gòu)造函數(shù)__init__()中定義的,定義和使用時(shí)必須以self作為前綴;屬于類的數(shù)據(jù)成員是在類中所有方法之外定義的。
???在主程序中(或類的外部),實(shí)例屬性屬于實(shí)例(對(duì)象),只能通過對(duì)象名訪問;而類屬性屬于類,可以通過類名或?qū)ο竺伎梢栽L問。
???在實(shí)例方法中可以調(diào)用該實(shí)例的其他方法,也可以訪問類屬性以及實(shí)例屬性。

例子:

class Person(object):def __init__(self, name): # 構(gòu)造函數(shù)assert isinstance(name, str), 'name must be string'self.name = namedef walk(self):print(self.name + ' can walk.')def eat(self):print(self.name + ' can eat.') zhang = Person('zhang')def sing(self):print(self.name + ' can sing.') # zhang.sing = types.MethodType(sing, zhang) #動(dòng)態(tài)增加一個(gè)新行為 zhang.sing()


在Python中,函數(shù)和方法是有區(qū)別的。
方法一般指與特定實(shí)例綁定的函數(shù),通過對(duì)象調(diào)用方法時(shí),對(duì)象本身將被作為第一個(gè)參數(shù)隱式傳遞過去,普通函數(shù)并不具備這個(gè)特點(diǎn)。

私有成員和公有成員

Python并沒有對(duì)私有成員提供嚴(yán)格的訪問保護(hù)機(jī)制。
在定義類的成員時(shí),如果成員名以兩個(gè)下劃線“__”或更多下劃線開頭而不以兩個(gè)或更多下劃線結(jié)束則表示是私有成員。
私有成員在類的外部不能直接訪問,需要通過調(diào)用對(duì)象的公開成員方法來訪問,也可以通過Python支持的特殊方式來訪問。
公開成員既可以在類的內(nèi)部進(jìn)行訪問,也可以在外部程序中使用。

class A:def __init__(self, value1 = 0, value2 = 0):self._value1 = value1self.__value2 = value2def setValue(self, value1, value2):self._value1 = value1self.__value2 = value2def show(self):print(self._value1)print(self.__value2)a = A() print(a._value1)print(a._A__value2) #在外部訪問對(duì)象的私有數(shù)據(jù)成員

Python中以下劃線開頭的變量名和方法名有特殊含義,尤其是在類的定義中。
_xxx:受保護(hù)成員,不能用’from module import *'導(dǎo)入;
xxx:系統(tǒng)定義的特殊成員;
__xxx:私有成員,只有類對(duì)象自己能訪問,子類對(duì)象不能直接訪問到這個(gè)成員,但在對(duì)象外部可以通過“對(duì)象名._類名__xxx”這樣的特殊方式來訪問

注意:Python中不存在嚴(yán)格意義上的私有成員。

>>> class Fruit:def __init__(self):self.__color = 'Red'self.price = 1>>> apple = Fruit() >>> apple.price #顯示對(duì)象公開數(shù)據(jù)成員的值 1 >>> apple.price = 2 #修改對(duì)象公開數(shù)據(jù)成員的值 >>> apple.price 2 >>> print(apple.price, apple._Fruit__color) #顯示對(duì)象私有數(shù)據(jù)成員的值 2 Red >>> apple._Fruit__color = "Blue" #修改對(duì)象私有數(shù)據(jù)成員的值 >>> print(apple.price, apple._Fruit__color) 2 Blue >>> print(apple.__color) AttributeError: Fruit instance has no attribute '__color'

類中的方法

在類中定義的方法可以粗略分為四大類:
公有方法、私有方法、靜態(tài)方法和類方法。
???私有方法的名字以兩個(gè)下劃線“__”開始,每個(gè)對(duì)象都有自己的公有方法和私有方法,在這兩類方法中可以訪問屬于類和對(duì)象的成員;
???公有方法通過對(duì)象名直接調(diào)用,私有方法不能通過對(duì)象名直接調(diào)用,只能在屬于對(duì)象的方法中通過self調(diào)用或在外部通過Python支持的特殊方式來調(diào)用。
???如果通過類名來調(diào)用屬于對(duì)象的公有方法,需要顯式為該方法的self參數(shù)傳遞一個(gè)對(duì)象名,用來明確指定訪問哪個(gè)對(duì)象的數(shù)據(jù)成員。

class Root:__total = 0def __init__(self, v): #構(gòu)造方法self.__value = vRoot.__total += 1def show(self): #普通實(shí)例方法print('self.__value:', self.__value)print('Root.__total:', Root.__total)@classmethod #修飾器,聲明類方法def classShowTotal(cls): #類方法print(cls.__total)@staticmethod #修飾器,聲明靜態(tài)方法def staticShowTotal(): #靜態(tài)方法print(Root.__total)a = Root(8) a.show()b= Root(5) b.show() Root.show() #試圖通過類名直接調(diào)用實(shí)例方法,失敗 r = Root(3) Root.show(r) #但是可以通過這種方法來調(diào)用方法并訪問實(shí)例成員

self.__value: 8
Root.__total: 1
self.__value: 5
Root.__total: 2

???Python中類的構(gòu)造函數(shù)是__init__(),一般用來為數(shù)據(jù)成員設(shè)置初值或進(jìn)行其他必要的初始化工作,在創(chuàng)建對(duì)象時(shí)被自動(dòng)調(diào)用和執(zhí)行。如果用戶沒有設(shè)計(jì)構(gòu)造函數(shù),Python將提供一個(gè)默認(rèn)的構(gòu)造函數(shù)用來進(jìn)行必要的初始化工作。
???Python中類的析構(gòu)函數(shù)是__del__(),一般用來釋放對(duì)象占用的資源,在Python刪除對(duì)象和收回對(duì)象空間時(shí)被自動(dòng)調(diào)用和執(zhí)行。如果用戶沒有編寫析構(gòu)函數(shù),Python將提供一個(gè)默認(rèn)的析構(gòu)函數(shù)進(jìn)行必要的清理工作。

屬性

類屬性是在類中方法(也就是類中的函數(shù))之外但又在類之中定義的屬性;而實(shí)例屬性是在構(gòu)造函數(shù)中定義的(init),定義時(shí)候以self作為前綴。類屬性在所有實(shí)例之間共享。在類內(nèi)部和類外部都可以通過“類.類屬性” 來訪問。
只讀屬性

class Test:def __init__(self, value):self.__value = value@propertydef value(self): #只讀,無法修改和刪除return self.__value

可讀、可寫屬性

>>> class Test:def __init__(self, value):self.__value = value def __get(self):return self.__valuedef __set(self, v):self.__value = vvalue = property(__get, __set)def show(self):print(self.__value)

繼承

構(gòu)造函數(shù)、私有方法以及普通公開方法的繼承原理。
父類:

>>> class A(object):def __init__(self): #構(gòu)造方法可能會(huì)被派生類繼承self.__private()self.public()def __private(self): #私有方法在派生類中不能直接訪問print('__private() method in A') def public(self): #公開方法在派生類中可以直接訪問,也可以被覆蓋print('public() method in A')

繼承類1:

class B(A): #類B沒有構(gòu)造方法,會(huì)繼承基類的構(gòu)造方法def __private(self): #這不會(huì)覆蓋基類的私有方法print('__private() method in B')def public(self): #覆蓋了繼承自A類的公開方法publicprint('public() method in B')>>> b = B() #自動(dòng)調(diào)用基類構(gòu)造方法 __private() method in A public() method in B>>> dir(b) #基類和派生類的私有方法訪問方式不一樣 ['_A__private', '_B__private', '__class__', ...]

繼承類2:

class C(A):def __init__(self): #顯式定義構(gòu)造函數(shù)self.__private() #這里調(diào)用的是類C的私有方法self.public()def __private(self):print('__private() method in C')def public(self):print('public() method in C') >>> c = C() #調(diào)用類C的構(gòu)造方法 __private() method in C public() method in C>>> dir(c) ['_A__private', '_C__private', '__class__', ...]

Python支持多繼承(Multiple Inheritance)
多繼承下的Method Resolution Order(MRO):
如果父類中有相同的方法名,而在子類中使用時(shí)沒有指定父類名,則Python解釋器將從左向右按順序進(jìn)行搜索。

所謂多態(tài)(polymorphism),是指基類的同一個(gè)方法在不同派生類對(duì)象中具有不同的表現(xiàn)和行為。派生類繼承了基類行為和屬性之后,還會(huì)增加某些特定的行為和屬性,同時(shí)還可能會(huì)對(duì)繼承來的某些行為進(jìn)行一定的改變,這都是多態(tài)的表現(xiàn)形式。
Python大多數(shù)運(yùn)算符可以作用于多種不同類型的操作數(shù),并且對(duì)于不同類型的操作數(shù)往往有不同的表現(xiàn),這本身就是多態(tài),是通過特殊方法與運(yùn)算符重載實(shí)現(xiàn)的。

總結(jié)

以上是生活随笔為你收集整理的合工大python期末复习知识点汇总的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。