5Python集合容器
數據結構數據結構 一般將數據結構分為兩大類: 線性數據結構和非線性數據結構。?
線性數據結構有: 線性表、棧、隊列、串、數組和文件; 非線性數據結構有: 散列表、樹和圖。
線性表:線性表的邏輯結構是n個數據元素的有限序列:(a1, a2 ,a3,…an)n為線性表的長度(n≥0),n=0的表稱為空表。數據元素呈線性關系。必存在唯一的稱為“第一個”的數據元素;必存在唯一的稱為“最后一個”的數據元素;除第一個元素外,每個元素都有且只有一個前驅元素; 除最后一個元素外,每個元素都有且只有一個后繼元素。所有數據元素在同一個線性表中必須是相同的數據類型。2/48線性表按其存儲結構可分為順序表和鏈表。用順序存儲結構存儲的線性表稱為順序表;用鏈式存儲結構存儲的線性表稱為鏈表。將線性表中的數據元素依次存放在某個存儲區域中,所形成的表稱為順序表。一維數組就是用順序方式存儲的線性表。鏈表(數據經常插入刪除用鏈表)棧(Stack)也是一種特殊的線性表,是一種后進先出(LIFO)的結構。棧是限定僅在表尾進行插入和刪除運算的線性表,表尾稱為棧頂(top),表頭稱為棧底(bottom)。棧的物理存儲可以用順序存儲結構,也可以用鏈式存儲結構。3/48隊列(Queue) 是限定所有的插入只能在表的一端進行,而所有的刪除都在表的另一端進行的線性表。表中允許插入的一端稱為隊尾(Rear),允許刪除的一端稱為隊頭(Front)。隊列的操作是按先進先出(FIFO)的原則進行的。隊列的物理存儲可以用順序存儲結構,也可以用鏈式存儲結構。散列表又稱為哈希表。散列表算法的基本思想是:4/48以結點的關鍵字為自變量,通過一定的函數關系(散列函數)計算出對應的函數值,以這個值作為該結點存儲在散列表中的地址。當散列表中的元素存放太滿,就必須進行再散列,將產生一個新的散列表,所有元素存放到新的散列表中,原先的散列表將被刪除。在C#語言中,通過負載因子(loadfactor)來決定何時對散列表進行再散列。例如:如果負載因子是0.75,當散列表中已經有75%的位置已經放滿,那 么將進行再散列。負載因子越高(越接近1.0),內存的使用效率越高,元素的尋找時間越長。負載因子越低(越接近0.0),元素的尋找時 間越短,內存浪費越多。列表List1. Python內置的一種數據類型是列表:list。2. list是一種有序的集合,可以隨時添加和刪除其中的元5/48素。3. 序列中的每個元素都分配一個數字 - 它的位置,或索引,第一個索引是0,第二個索引是1,依此類推。4. 列表可以存放各種類型的數據定義列表 語法: 變量名=[值1,值2,值3...值n]name=["唐僧","豬八戒","孫悟空","沙僧"]列表-查 值 = 列表[index] 根據索引下標查找值 index = 列表.index(值) 從列表中找出某個值第一個匹配項的索引位置 count = 列表.count(值) 統計某個元素在列表中出現的次數 lenth = len(列表) 查詢列表的長度,元素的個數 max(列表) ,min(列表) 查詢列表中的最大值,最小值列表-增 列表.append(值) 新增到末尾 列表.insert(下標,值) 6/48 插入到指定位置 列表.extend(列表) 列表末尾一次性追加另一個序列中的多個值(用新列表擴展原來的列表)。列表-改 列表[下標] = 值 根據下標修改其值列表-刪 列表.pop() 刪除末尾元素,并返回此元素 列表.pop(下標) 根據元素下標刪除,并返回次元素 del 列表[下標] 根據元素下標刪除 列表.remove(值) 根據元素的值刪除列表-判斷 in(存在) 如果存在那么結果為True,否則為False not in(不存在) 如果不存在那么結果為True,否則False列表-運算符 + * + 和 * 的操作符與字符串相似。 + 號用于組合列表,* 號用于重復列表。 7/48列表-排序 列表.reverse() 反向列表中元素 列表.sort() 對原列表進行排序,如果指定參數,則使用比較 函數指定的比較函數列表-切片 列表[num1:num2:num3] num1,num2都是列表的下標num3是間隔返回一個新的列表列表-遍歷 使用while循環遍歷 使用for循環遍歷元組TuplePython的元組與列表類似,不同之處在于元組的元素不能 修改。元組使用小括號,列表使用方括號。元組的功能 = 列表不修改的功能元組和列表轉化列表和元組相互轉換8/48 列表 = list(元組) 元組轉列表 元組 = tuple(列表) 列表轉元組 注意:這兩個方法都是得到一個新的,不會修改原來的字典DictPython內置了字典:dict的支持,dict全稱dictionary,在其他語言中也稱為map,使用鍵-值(key-value)存儲, 具有極快的查找速度。定義字典 格式: 字典 = {key1 : value1, key2 : value2 ......} 鍵必須是唯一的,但值則不必。 值可以取任何數據類型,如字符串,數字或元9/48組。 dict內部存放的順序和key放入的順序是沒有關系的。字典-增/改 字典[鍵] = 值 如果次key不存在,就是往字典里新增一個鍵值對; 否則,就是修改由于一個key只能對應一個value, 所以,多次對一個key放入value,后面的值會把 前面的值沖掉字典-刪 1.字典.pop(鍵) 根據鍵,刪除指定的值,并將此值返回 2.del 字典[鍵] 根據鍵,刪除指定的值 3.字典.popitem() 隨機刪除一個 4.字典.clear() 清空字典里的鍵值對字典-查 值 = 字典[鍵] 根據鍵查詢值 字典.get(鍵,[默認值]) 通過dict提供的get方法,如果key不存在,可以返回None,或者自己指定的值 len(字典)10/48 計算字典元素個數,即鍵的總數。 str(字典) 輸出字典可打印的字符串表示。 dict.keys() 以列表返回一個字典所有的鍵 dict.values() 以列表返回一個字典所有的值 dict.items() 以列表返回可遍歷的(鍵, 值) 元組數組字典-判斷 鍵 in 字典 如果鍵在字典中存在,返回True否則,返回False字典-遍歷 使用for循環遍歷的三種方式: for key in dict: print('%s:%s'%(key,dict[key]))for key in dict.keys(): print('%s:%s'%(key,dict[key]))for k,v in dict.items(): print('%s:%s'%(k,v)字典-其他方法 dict.copy() 返回一個新的字典,內容一樣,地址不同 dict.fromkeys(seq[, val])) 創建一個新字典,以序列 seq 中元素做字典的鍵,val 為字典所有鍵對應的初始值 dict.setdefault(key, default=None) 和get()類似, 但如果鍵不存在于字典中,將會添加鍵并將值設為default如果鍵在字典中,返回這個鍵所對應的值。如果鍵不在字典中,向字典中插入這個鍵,并且以default為這個鍵的值,并返回 default。default的默認值為None11/48 dict.update(dict2) 把字典dict2的鍵/值對更新到dict里字典與列表對比 和list比較,dict有以下幾個特點: 查找速度極快,不會隨著key的增加而變慢; 需要占用大量的內存,內存浪費多。 而list: 查找和插入的時間隨著元素的增加而增加; 占用空間小,浪費內存很少。 所以,dict是用空間來換取時間的一種方法。Set集合set集合是一個無序,不能重復的集合容器,所以可以用來過濾重復元素。定義Set集合 語法: 變量名 = {值1,值2,值3.......}names={"張三","李四","王五","趙六 12/48Set集合-增 set.add(值) 添加元素 set.update(值) 將一個可迭代的內容,一一加入Set集合-刪 set.remove(值) 移除指定的值 如果移除的值不存在 會報錯 set.discard(值) 移除指定的值 如果移除的值不存在 也不會報錯 set.pop() 隨機刪除一個元素 set.clear() 移除set中的所有的元素Set集合-其他操作 | 并集 & 交集 intersection 交集 - 差集 difference 差集 in 判斷 union 聯合 issubset 子集 issuperset 父集 13/48總結數據結構列表的使用元組的不可變性列表和元素相互轉換字典鍵值對set值唯一本章作業1.兩個列表進行合并操作2.使用列表判斷一個列表是否在另外一個列表中3.列表的反轉4.列表的排序14/485.實現對列表的增刪改查功能6.如何將0-10隨機存入列表中7.求出元組(90,34,-23,18,12)中的最大值和最小值8. 針對列表[90,34,-23,18,12]從小到大進行排序,然后 輸出排序后結果9. 編程輸出所有的三位水仙花數 水仙花數:各位數字的立方數相加等于該數本身 例如 153 1*1*1+5*5*5+3*3*3=153 153就是一個三位水仙花數10.為哈希表追加不重復的100個值,且每個值都是1-100之間的隨機數,問哪個數字重復的次數最多,重復了多少次?11.假定書籍的種類有5種,設計何種的數據結構可以達到 快速查詢某類所有書籍的功能(提示:用Dictionary)
思考題:
1.如何實現一個單向鏈表
2.解析用戶輸入的一個算數表達式 算出其結果(選作)
2-1.沒有括號和負號(中等難度)
2-2.帶括號和負號(高難度)
3.如何用隊列實現約瑟夫環
約瑟夫環:假設有n個人坐成一圈,從某個人開始報數,
數到m的人出圈,接著從出圈的下一個人開始重新報數,
數到m的人再次出圈,如此反復,直到所有人都出圈,請 列出出圈順序。
6日期時間
時間模塊
15/48
在我們平常的代碼中,經常需要和時間打交道。
在Python中,與時間處理相關的模塊有:
time、datetime以及calendar,這里講解time
模塊模塊的引入:import time
time中常用函數:
time.time()
返回當前時間的時間戳(1970紀元后經過的浮
點秒數)。
time.ctime()
獲取當前日期時間
time.localtime()
將一個時間戳轉換為當前時區的
struct_time,即時間數組格式的時間
time.sleep(secs)
線程推遲指定的時間運行
time.timezone
是當地時區(未啟動夏令時)距離格林威治的
偏移秒數(>0,美洲;<=0大部分歐洲,亞洲,非洲)。
time.tzname
包含一對根據情況的不同而不同的字符串,分 別是帶夏令時的本地時區名稱,和不帶的。
time.altzone
返回格林威治西部的夏令時地區的偏移秒數。
如果該地區在格林威治東部會返回負值(如西歐,包括英
國)。對夏令時啟用地區才能使用。
time.asctime([tupletime]) 接受時間元組并返
回一個可讀的形式為"Tue Dec 11 18:07:14 2008"(2008
16/48
年12月11日 周二18時07分14秒)的24個字符的字符串。
time.clock( ) 用以浮點數計算的秒數返回當前
的CPU時間。用來衡量不同程序的耗時,比time.time()更
有用。
time.gmtime([secs]) 接收時間戳(1970紀元
后經過的浮點秒數)并返回格林威治天文時間下的時間元
組t。注:t.tm_isdst始終為0
time.mktime(tupletime) 接受時間元組并返回
時間戳(1970紀元后經過的浮點秒數)。
time.strftime(fmt[,tupletime]) 接收以時間元
組,并返回以可讀字符串表示的當地時間,格式由fmt決
定。
time.strptime(str,fmt='%a %b %d %H:%M:
%S %Y') 根據fmt的格式把一個時間字符串解析為時間元
組。
time.tzset() 根據環境變量TZ重新初始化時間
相關設置。
時間元組:
Python函數用一個元組裝起來的9組數字表示時間:
t=(2018,1,2,3,4,5,1,22,0)
17/48
日期格式化
time.strftime(format[, tupletime]):
把一個代表時間的元組或者struct_time(如由
time.localtime()和time.gmtime()返回)轉化為格式化的
時間字符串。如果t未指定,將傳入time.localtime()。如果
元組中任何一個元素越界,ValueError的錯誤將會被拋
18/48
出。
19/48
20/48
日期時間模塊
日期時間——datetime
日期模塊的引入:from datetime import datetime
獲取當前日期對象
datetime.now()
設置日期獲取日期對象
datetime(year, month, day [,hour, minute, second])
日期時間字符串的轉換
日期時間<==>字符串
日期轉換字符串
datetime.strftime(“%Y-%m-%d %H:%M:%S”)
from datetime import datetime
dt=datetime.now()
t=dt.strftime("%Y{y}%m{m}%dnak837q %H:%M:%S").format(y="年",m="月",d="日")
print(t)
字符串轉換日期
datetime.strptime(“2017-10-01 00:00:00”,“%Y-%m-%s %H:%M:%S”)
日歷模塊
21/48
日歷(Calendar)模塊
此模塊的函數都是日歷相關的,例如打印某月的字符月
歷。
星期一是默認的每周第一天,星期天是默認的最后一天。
更改設置需調用calendar.setfirstweekday()函數。模塊包
含了以下內置函數:
calendar.calendar(year,w=2,l=1,c=6)
返回一個多行字符串格式的year年年歷,3個月一行,
間隔距離為c。 每日寬度間隔為w字符。每行長度為21*
W+18+2* C。l是每星期行數。
calendar.firstweekday( )
返回當前每周起始日期的設置。默認情況下,首次載入
caendar模塊時返回0,即星期一。
calendar.isleap(year)
是閏年返回True,否則為false。
calendar.leapdays(y1,y2)
返回在Y1,Y2兩年之間的閏年總數。
calendar.month(year,month,w=2,l=1)
返回一個多行字符串格式的year年month月日歷,兩行
標題,一周一行。每日寬度間隔為w字符。每行的長度為
7* w+6。l是每星期的行數。
calendar.monthcalendar(year,month)
返回一個整數的單層嵌套列表。每個子列表裝載代表一
個星期的整數。Year年month月外的日期都設為0;范圍內
22/48
的日子都由該月第幾日表示,從1開始。
calendar.monthrange(year,month)
返回兩個整數。第一個是該月的星期幾的日期碼,第二
個是該月的日期碼。日從0(星期一)到6(星期日);月
從1到12。
calendar.prcal(year,w=2,l=1,c=6)
相當于 print calendar.calendar(year,w,l,c).
calendar.prmonth(year,month,w=2,l=1)
相當于 print calendar.calendar(year,w,l,c)。
calendar.setfirstweekday(weekday)
設置每周的起始日期碼。0(星期一)到6(星期
日)。
calendar.timegm(tupletime)
和time.gmtime相反:接受一個時間元組形式,返回該
時刻的時間戳(1970紀元后經過的浮點秒數)。
calendar.weekday(year,month,day)
返回給定日期的日期碼。0(星期一)到6(星期日)。
月份為 1(一月) 到 12(12月)。
總結
時間模塊
日期時間模塊
日期時間字符串的轉換
日歷模塊
本章作業
1.輸入一個日期,格式如:2010 10 24 ,判斷這一天是這
23/48
一年中的第幾天。
2.已知2011年11月11日是星期五,輸入日期 ,問YYYY年
MM月DD日是星期幾
3.系統會隨機給你一個日期(yyyy-MM-dd)字符串,你需 要計算這個時間上一個月的最后一天的具體日期,最后以
yyyy年MM月dd日的字符形式返回
4.輸入兩個日期,獲得兩個日期相差幾天,幾小時,幾秒
7函數
掌握方法的聲明、定義,以及參數和返回值的含義;
函數的介紹
什么是方法?
廣義:一般是指為獲得某種東西或達到某種目的而采取的
手段與行為方式。
狹義:方法是指由一系列的程序語句組成的代碼塊
方法(method)也叫函數(function),就是將一堆代碼 進行重用的一種機制。函數就是一段代碼,這段代碼可能
有輸入的值(參數),可能會返回值。一個函數就像一個
專門做這件事的人,我們調用它來做一些事情,它可能需
要我們提供一些輸入信息給它,它執行完成后可能會有一
些執行結果給我們。要求的輸入的信息就叫參數,返回的
執行結果就是返回值。
str=input("請輸入名字")就是一個有返回結果的函數;
print("hello")就是一個有執行參數的函數,只有告訴print
被打印的數據它才知道如何打印;str2=str.find("a")則是
一個既有參數又有返回值的函數。
有了函數寫代碼就像拼積木,python中的各種各樣的技術
24/48
其實就是通過for、if等這些基礎的語法將不同的函數按照
一定的邏輯組織起來。
方法有什么好處?
重用
無論現實世界還是程序世界,都以方法來達到重用的目的
函數的定義與調用
定義語法:
def 函數名([參數]):
代碼塊
[return 表達式]
命名規則:方法名開頭大寫,參數名開頭小寫,方法名、
參數名、變量名要有意義;
方法的目的在于重用,所有的方法編寫完成后,都處于等
待調用狀態,被調用后方法開始執行,直到方法返回(有
無返回值均必須返回)
方法大多數會在其他方法內部被調用
def FirstMethod():
print("我是一個方法")
FirstMethod()
25/48
多級調用關系在程序中表現如下:
===>:調用
<===:返回
Method1()<===>Method2()<===>Method3
()<===>Method4()
棧:后進先出的一種存儲結構
執行過程如下:
1.Method1()執行到調用Method2()的調用點時 方法被阻
塞 Method1()進入調用堆棧
2.Method2()執行到調用Method3()的調用點時 方法被阻塞 Method2()進入調用堆棧
26/48
3.Method3()執行到調用Method4()的調用點時 方法被阻塞 Method3()進入調用堆棧
4.Method4()開始執行 執行完畢后 返回結果給調用堆棧
5.調用堆棧收到返回值后,將棧頂也就是Method3()出棧繼續執行并返回
27/48
6.調用堆棧收到返回值后,將棧頂也就是Method2()出棧繼續執行并返回
7.調用堆棧收到返回值后,將棧頂也就是Method1()出棧繼續執行并返回
28/48
8.堆棧為空 本次多級調用執行完畢
注意:所有的方法均需要返回?為什么有的方法沒有return?
無返回值的方法可以將return;省略
形式參數與實際參數
參數分為兩種:
形式參數:在編寫方法的時候 預定義的參數
實際參數:在實際調用(使用)方法的時候 傳入方法的參
數
參數的類型:
形式參數:任意的數據類型 由方法編寫者在預定義時限定
實際參數:任意的數據類型(和形式參數匹配)在方法的
調用者中定義賦值
簡單示意:
形式參數:
29/48
#radius即為形式參數
def Area(radius):
return 3.14*radius*radius
實際參數:
#r即為實際參數
r=1
area=Area(r)
print("面積為%s"area)
傳參的實質: radius = r;
將實際參數傳遞給形式參數
函數的返回值
返回值類型:任意的數據類型
方法有無返回值取決于方法的調用者是否需要返回值
1.讀取用戶輸入的整數,如果用戶輸入的是數字,則返回輸
入的值,否則提示用戶重新輸入。
2.查找兩個整數中的最大值
3.計算輸入列表所有元素的和:
思考:
寫一個方法,計算一個int類型list中每個元素的總和 、最大
值與最小值?
局部變量與全局變量
30/48
全局變量與局部變量
兩者的本質區別就是在于作用域;
用通俗的話來理解的話,
全局變量是在整個py文件中聲明,全局范圍內都可以訪問
局部變量是在某個函數中聲明的,只能在該函數中調用
它,如果試圖在超出范圍的地方調用,程序就掛掉了
如果在函數內部定義與某個全局變量一樣名稱的局部變
量,就可能會導致意外的效果,可能不是你期望的。因此
不建議這樣使用,這樣會使得程序很不健全
直接來看幾個例子來理解全局變量和局部變量的區別吧:
def fun(x):
y=2
print("乘法的運行結果:",x*y)
num1=1
print("初始num1=",num1)
fun(num1)
print("y的值是:",y)
報錯的原因是因為試圖訪問局部變量,但是訪問的地方不在該變量y的作用域中
def fun():
num1=2
print("函數內修改后num1=",num1)
num1=1
print("初始num1=",num1)
fun()
print("運行完函數后num1=",num1)
可以看到在函數內部對全局變量的修改后,在函數執行完
畢,修改的結果是無效的,全局變量并不會受到影響
31/48
global關鍵字
如果真的想要在函數體內修改全局變量的值,就要使用
global關鍵字
def fun():
global num1
num1=2
print("函數內修改后num1=",num1)
num1=1
print("初始num1=",num1)
fun()
print("運行完函數后num1=",num1)
使用global關鍵字就是告訴python編譯器這個變量不是局
部變量而是全局變量,其實有點像是"引用"的意思
32/48
可選參數
含義:可選參數,也成為默認參數,是指給方法的特定參
數指定默認值,在調用方法時可以省略掉這些參數。
注意事項:
(1)可選參數不能為參數列表的第1個參數,必須位于所 有的必選參數之后(除非沒有必選參數);
(2)可選參數必須指定一個默認值,且默認值必須是一 個常量表達式,不能為變量;
(3)所有可選參數以后的參數都必須是可選參數。
(4)若要為可選參數傳遞新的值 ,注意數據類型
示例:
def Add(a,b=2):
result = a + b
return result
a = 10
#省略b實際參數的傳遞
Add(a)
#也可以不省略 為b重新賦值
Add(a,5)
命名參數
命名參數,也可以叫關鍵字參數
對于關鍵字參數,函數的調用者可以傳入任意不受限制的
關鍵字參數。至于到底傳入了哪些,就需要在函數內部通
過kw檢查。
33/48
注意:如果要限制關鍵字參數的名字,就可以用命名關鍵
字參數
例:
def person(name, age, *, city="北京", job="程序猿"):
print(name, age, city, job)
person("托尼",15,city="鄭州",job="主播")
可變元組參數
在Python函數中,還可以定義可變參數。顧名思義,可變
參數就是傳入的參數個數是可變的,可以是1個、2個到任
意個,還可以是0個,調用時可以傳入個數不同的實參,具
備很好的靈活性。參數組裝成一個tuple
參數數組必須為參數列表的最后一個參數
參數列表之前可以設置其他的參數
示例:
def Add(*tuple):
sum=0
for i in tuple:
sum+=i
return sum
#調用使用了參數數組的方法
Add()
Add(1,3,5)
Add(1,3,5,7)
34/48
可變字典參數
可變參數允許你傳入0個或任意個參數,這些可變參數在
函數調用時自動組裝為一個tuple。
而關鍵字參數允許你傳入0個或任意個含參數名的參數,
這些關鍵字參數在函數內部自動組裝為一個dict。
例如
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
person("蔣昊",18,gender="男")
匿名函數
匿名函數
顧名思義就是指:是指一類無需定義標識符(函數名)
的函數或子程序。
定義
語法格式:lambda 參數:表達式
lambda語句中,開頭先寫關鍵字lambda,冒號前是 參數,可以有多個,用逗號隔開;冒號右邊的為表達式,
需要注意的是只能有一個表達式。由于lambda返回的是函
數對象(構建的是一個函數對象),所以需要定義一個變
量去接收。
注意點:lambda 函數可以接收任意多個參數 (包括可選
參數) 并且返回單個表達式的值。lambda 函數不能包含命
35/48
令,包含的表達式不能超過一個。
匿名函數優點:
使用Python寫一些腳本時,使用lambda可以省去定義
函數的過程,讓代碼更加精簡。
對于一些抽象的,不會被別的地方再重復使用的函
數,有時候函數起個名字也是個難題,使用lambda不需要
考慮命名的問題
使用lambda在某些時候然后代碼更容易理解
nums=(1,2,53,6,69)
a=lambda x: max(x)
print(a)
print(type(a))
print(a(nums))
遞歸函數
遞歸算法的思想
遞歸算法是把問題轉化為規模縮小了的同類問題的子問
題。然后遞歸調用函數(或過程)來表示問題的解。在C
語言中的運行堆棧為他的存在提供了很好的支持,過程一
般是通過函數或子過程來實現。
遞歸算法:在函數或子過程的內部,直接或者間接地調用
自己的算法。
遞歸算法的特點:
遞歸算法是一種直接或者間接地調用自身算法的過程。在
計算機編寫程序中,遞歸算法對解決一大類問題是十分有
效的,它往往使算法的描述簡潔而且易于理解。
遞歸算法解決問題的特點:
36/48
(1) 遞歸就是在過程或函數里調用自身。
(2) 在使用遞歸策略時,必須有一個明確的遞歸結束條 件,稱為遞歸出口。
(3) 遞歸算法解題通常顯得很簡潔,但遞歸算法解題的運 行效率較低。所以一般不提倡用遞歸算法設計程序。
(4) 在遞歸調用的過程當中系統為每一層的返回點、局部
量等開辟了棧來存儲。遞歸次數過多容易造成棧溢出等。
所以一般不提倡用遞歸算法設計程序。
遞歸算法的要求
遞歸算法所體現的“重復”一般有三個要求:
一是每次調用在規模上都有所縮小(通常是減半); 二是相鄰兩次重復之間有緊密的聯系,前一次要為后一次
做準備(通常前一次的輸出就作為后一次的輸入); 三是在問題的規模極小時必須用直接給出解答而不再進行
遞歸調用,因而每次遞歸調用都是有條件的(以規模未達到
直接解答的大小為條件),無條件遞歸調用將會成為死循環
而不能正常結束。
簡單步驟:
1.明確確定方法的功能含義
2.明確方法出口
3.在使用中遇到符合方法功能定義的地方調用方法
求階乘! n! = n*(n-1)!
f(n) = f(n-1)!*n
5! = 5*4*3*2*1
37/48
def Factorial(num):
print(num)
if num<2:
return num
else:
return Factorial(num-1)*num
print(Factorial(6))
斐波那契數列
迭代求法1 1 2 3 5 8 13 21 34 55
遞歸深度
獲得深度值:
import sys
sys.getrecursionlimit()
1000
當遞歸深度超過這個值的時候,就會引發這樣的一個異
常。
解決的方式是手工設置遞歸調用深度,
方式為
import sys
sys.setrecursionlimit(1000000) #例如這里設置為一百萬
38/48
總結
函數的介紹
函數的定義和調用
函數的4種類型
函數的參數
變量作用域
遞歸函數
匿名函數
函數式編程
本章作業
必做:
1、寫一個方法,在方法內依次打印出列表每個元素的
值。
2、寫一個方法,計算列表所有元素的和(注意返回值)。
3、寫一個方法,計算列表所有奇數下標元素的和(注意返
回值)。
4、寫一個方法,計算列表所有偶數下標元素的和(注意返
回值)。
5、寫一個方法可以計算兩個數的和,想想這個方法有哪
些參數,返回值。
39/48
6、寫一個方法可以計算兩個數的商(分母不能為0),想想 這個方法有哪些參數,返回值是什么。
7、寫一個方法將傳入的天、小時、分鐘、秒的總和轉換
為秒,比如0天、2小時、5分、7秒,他們代表的總秒數為
2*3600+5*60+7=7507秒。想想這個方法有哪些參數,
返回值是什么類型。
8、寫一個方法交換整型列表中兩個指定下標元素的值。
想想這個方法有哪些參數,返回值是什么類型。
9、寫一個方法計算整型列表中所有能被3整除元素的個
數。想想這個方法有哪些參數,返回值是什么類型。
10、寫一個方法將整型數字(int)轉換為格式化的字符串
(string),現要求如下:
a.可以指定轉換后[字符串的長度];
b.當數字的長度不足指定的長度,讓這個字符串右對齊,
指定[左邊補的字符(char)];
例如,假設現在將指定的數字轉換為固定長度為8的字符
串,如果長度不足,左邊補'0',那么27這個數字就會轉換
為字符串"00000027"。
根據要求,想想這個方法有哪些參數,返回值是什么類
型。
11.用方法實現找出一個int類型列表中最大值和最小值
12.判斷一個數是否是質數(素數)?該如何聲明方法?
13. 將指定的秒數轉變為幾小時幾分幾秒。
14.使用Random類給一個數組的所有元素賦隨機初值(不
重復)。
40/48
15.判斷一個整型數組是否是對稱的。所謂對稱就是第一
個元素等于最后一個元素,第二個元素等于倒數第二個元
素,依次類推,例如【7,3,1,3,7】就是對稱的。
16.打印一個元組的所有值。
17.查找一個元組中某個值是否存在,如果存在返回這個
值的索引,否則返回-1。
18.將一個列表反轉過來,比如【2,3,1,4,7】轉換為
【7,4,1,3,2】
19.求一個列表的最大值。
20.求一個列表的最小值。
21.寫一個方法,實現在列表中指定的的位置前插入一個
值。
22.寫一個方法,刪除列表中指定位置的元素。
23.猜數游戲
1.隨機出現一個數(范圍自定義) 作為答案
2.提示用戶輸入并根據答案和用戶輸入的大小關系輸出大
了? 小了?
3.5次機會
4.可以重復玩
5.根據猜對的次數進行評價
6.無論對錯 請告知答案
8系統模塊
模塊的概念
模塊的引入
系統模塊os
操作模塊sys
數學模塊math
41/48
模塊的概念
模塊 是一個設計術語,是指對詞條中部分內容進行格式化
整理的模板。
例如歌手類詞條中的“音樂作品”模塊,電視劇類詞條的“分
集劇情”模塊。
在程序設計中,為完成某一功能所需的一段程序或子程序;
或指能由編譯程序、裝配程序等處理的獨立程序單位; 或指大型軟件系統的一部分。
模塊,又稱構件,是能夠單獨命名并獨立地完成一定功能的
程序語句的集合(即程序代碼和數據結構的集合體)。
它具有兩個基本的特征:外部特征和內部特征。
外部特征是指模塊跟外部環境聯系的接口(即其他模塊或
程序調用該模塊的方式,包括有輸入輸出參數、引用的全
局變量)和模塊的功能;
內部特征是指模塊的內部環境具有的特點(即該模塊的局
部數據和程序代碼)。
Python 模塊(Module),是一個 Python 文件,以 .py 結
尾,包含了 Python 對象定義和Python語句。
模塊讓你能夠有邏輯地組織你的 Python 代碼段。
把相關的代碼分配到一個模塊里能讓你的代碼更好用,更
易懂。
模塊能定義函數,類和變量,模塊里也能包含可執行的代
碼。
模塊的引入
42/48
模塊的引入
import 語句
模塊定義好后,我們可以使用 import 語句來引入模塊
引入模塊的語法:
import Module[, module2[,... moduleN]
一次可以引入多個模塊,但是一般情況下 我們一次只引
入一個模塊.
當解釋器遇到import語句,如果模塊在當前的搜索路徑 就會被導入。
比如要引用模塊 math,就可以在文件最開始的地方用
import math 來引入。
在調用 math 模塊中的函數時,必須這樣引用:模塊
名.函數名一個模塊只會被導入一次,不管你執行了多少次
import。這樣可以防止導入模塊被一遍又一遍地執行。
有時候我們只需要用到模塊中的某個函數,只需要引入
該函數即可,此時可以用下面方法實現:
from 模塊名 import 函數名1,函數名2....
不僅可以引入函數,還可以引入一些全局變量、類等
通過這種方式引入的時候,調用函數時只能給出函數 名,不能給出模塊名,但是當兩個模塊中含有相同名稱函
數的時候,后面一次引入會覆蓋前一次引入。
也就是說假如模塊A中有函數function( ),在模塊B中
43/48
也有函數function( ),如果引入A中的function在先、B中
的function在后,那么當調用function函數的時候,是去執
行模塊B中的function函數。
如果想一次性引入math中所有的東西,還可以通過
from math import *來實現
系統模塊os
python編程時,經常和文件、目錄打交道,這是就離不了
os模塊,os模塊包含普遍的操作系統功能,與具體的平臺無
關.os 模塊提供了非常豐富的方法用來處理文件和目錄.
常用的如下:
os.path 獲取該模塊的路徑
os.name 獲取現在正在實用的平臺,Windows 返回 ‘nt';
Linux 返回’posix'
os.rename(originPath, targetPath) 重命名
os.remove(path) 刪除文件
os.mkdir(str) 創建文件夾
os.makedirs(path) 創建多個文件夾
os.getcwd() 獲得當前路徑
os.chdir("../") 改變默認目錄
os.listdir("./") 獲取目錄列表
os.rmdir(path) 刪除文件夾
獲取指定路徑下的文件
44/48
def f2(ph):
#獲取指定路徑下的文件夾和文件
file_list=os.listdir(ph)
#遍歷file_list集合
for f in file_list:
file=ph+os.sep+f
#如果是文件,直接打印文件名稱
if os.path.isfile(file):
print('這是一個文件:%s'%file)
#如果是文件夾
if os.path.isdir(file):
print('這是一個文件:%s'%file)
f2(file)
ph=input('請輸入路徑:')
f2(ph)
批量修改文件名
45/48
import os
import os.path
#得到完整路徑
path=input('請輸入完整的路徑:')
#獲取此路徑下的列表
all_file=os.listdir(path)
#改變當前的工作路徑
#遍歷
for file in all_file:
#拼接路徑 將多個路徑組合后返回
old_path=os.path.join(path,file)
#判斷是否是文件
if os.path.isfile(old_path):
index=file.rfind('.')
#處理名字
new_name=file[0:index]+'-new'+file[index:]
else:
new_name=file+"-new"
new_path=os.path.join(path,new_name)
#重命名
os.rename(old_path,new_path)
獲得所有文件
46/48
#獲得文件夾里的所有內容
#遞歸思路 在樹形結構目錄里經常使用
path=r"C:\Users\Administrator\Desktop"
def GetAllFile(path):
#不是目錄就跳出
if os.path.isdir(path):
pathList = os.listdir(path)
#是空目錄 也跳出來
if len(pathList) > 0:
for i in pathList:
tempPath = os.path.join(path, i)
print(tempPath)
#遞歸 調用自己
GetAllFile(tempPath)
GetAllFile(path)
操作模塊sys
sys模塊提供了一系列有關Python運行環境的變量和函數
sys模塊常用的功能:
sys.argv 獲取當前正在執行的命令行參數的參數列表(list)
sys.platform 獲取當前執行環境的平臺,如win32表示是
Windows 32bit操作系統,linux2表示是linusys.path 在
python啟動時,
sys.path根據內建規則、PYTHONPATH變量進行初始化。
sys.builtin_module_names 返回一個列表,包含內建模塊
47/48
的名字
sys.exit(n) 調用sys.exit(n)可以中途退出程序,當參數非
0時,會引發一個SystemExit異常,從而可以在主程序中 捕獲該異常。
數學模塊math
python中math模塊中提供的基本數學函數
sin(x):求x的正弦
cos(x):求x的余弦
asin(x):求x的反正弦
acos(x):求x的反余弦
tan(x):求x的正切
atan(x):求x的反正切
fmod(x,y):求x/y的余數
ceil(x):取不小于x的最小整數
floor(x):求不大于x的最大整數
fabs(x):求絕對值
pow(x,y):求x的y次冪
log10(x):求x的以10位底的對數
sqrt(x):求x的平方根
factorial(x) 求x的階乘
trunc(x) 求x的整數部分
總結
模塊的概念
模塊的引入
48/48
系統模塊os
操作模塊sys
數學模塊math
本章作業
必做:
1.當前程序目錄下創建py文件夾,目錄里創建十個子文件
夾,并且命名為1-10
2.在子文件夾1-10里,偶數文件夾下創建新文件夾,命名
end
3.將子文件夾中2,4,8里的end重命名為end2,end4,
end8
4.刪除子文件2
5.打印py文件夾中所有文件夾名稱
6.刪除py及其所有子文件夾
7.浮點數20.73,向上取整,向下取整,正弦值
8.弧度π/4,π/2,對應的度數