5Python集合容器
數(shù)據(jù)結構數(shù)據(jù)結構 一般將數(shù)據(jù)結構分為兩大類: 線性數(shù)據(jù)結構和非線性數(shù)據(jù)結構。?
線性數(shù)據(jù)結構有: 線性表睡蟋、棧踏幻、隊列傍菇、串渊鞋、數(shù)組和文件; 非線性數(shù)據(jù)結構有: 散列表爹袁、樹和圖守伸。
線性表:線性表的邏輯結構是n個數(shù)據(jù)元素的有限序列:(a1, a2 ,a3,…an)n為線性表的長度(n≥0)惠赫,n=0的表稱為空表诗轻。數(shù)據(jù)元素呈線性關系劝术。必存在唯一的稱為“第一個”的數(shù)據(jù)元素;必存在唯一的稱為“最后一個”的數(shù)據(jù)元素;除第一個元素外寨躁,每個元素都有且只有一個前驅元素; 除最后一個元素外颓屑,每個元素都有且只有一個后繼元素。所有數(shù)據(jù)元素在同一個線性表中必須是相同的數(shù)據(jù)類型。2/48線性表按其存儲結構可分為順序表和鏈表昔瞧。用順序存儲結構存儲的線性表稱為順序表;用鏈式存儲結構存儲的線性表稱為鏈表袜蚕。將線性表中的數(shù)據(jù)元素依次存放在某個存儲區(qū)域中,所形成的表稱為順序表。一維數(shù)組就是用順序方式存儲的線性表燎悍。鏈表(數(shù)據(jù)經(jīng)常插入刪除用鏈表)棧(Stack)也是一種特殊的線性表庐椒,是一種后進先出(LIFO)的結構椒舵。棧是限定僅在表尾進行插入和刪除運算的線性表,表尾稱為棧頂(top)约谈,表頭稱為棧底(bottom)笔宿。棧的物理存儲可以用順序存儲結構犁钟,也可以用鏈式存儲結構。3/48隊列(Queue) 是限定所有的插入只能在表的一端進行泼橘,而所有的刪除都在表的另一端進行的線性表涝动。表中允許插入的一端稱為隊尾(Rear),允許刪除的一端稱為隊頭(Front)炬灭。隊列的操作是按先進先出(FIFO)的原則進行的醋粟。隊列的物理存儲可以用順序存儲結構,也可以用鏈式存儲結構重归。散列表又稱為哈希表米愿。散列表算法的基本思想是:4/48以結點的關鍵字為自變量,通過一定的函數(shù)關系(散列函數(shù))計算出對應的函數(shù)值鼻吮,以這個值作為該結點存儲在散列表中的地址育苟。當散列表中的元素存放太滿,就必須進行再散列椎木,將產生一個新的散列表违柏,所有元素存放到新的散列表中,原先的散列表將被刪除拓哺。在C#語言中勇垛,通過負載因子(loadfactor)來決定何時對散列表進行再散列脖母。例如:如果負載因子是0.75士鸥,當散列表中已經(jīng)有75%的位置已經(jīng)放滿,那 么將進行再散列谆级。負載因子越高(越接近1.0)烤礁,內存的使用效率越高,元素的尋找時間越長肥照。負載因子越低(越接近0.0)脚仔,元素的尋找時 間越短,內存浪費越多舆绎。列表List1. Python內置的一種數(shù)據(jù)類型是列表:list鲤脏。2. list是一種有序的集合,可以隨時添加和刪除其中的元5/48素吕朵。3. 序列中的每個元素都分配一個數(shù)字 - 它的位置猎醇,或索引,第一個索引是0努溃,第二個索引是1硫嘶,依此類推。4. 列表可以存放各種類型的數(shù)據(jù)定義列表 語法: 變量名=[值1,值2,值3...值n]name=["唐僧","豬八戒","孫悟空","沙僧"]列表-查 值 = 列表[index] 根據(jù)索引下標查找值 index = 列表.index(值) 從列表中找出某個值第一個匹配項的索引位置 count = 列表.count(值) 統(tǒng)計某個元素在列表中出現(xiàn)的次數(shù) lenth = len(列表) 查詢列表的長度梧税,元素的個數(shù) max(列表) 沦疾,min(列表) 查詢列表中的最大值称近,最小值列表-增 列表.append(值) 新增到末尾 列表.insert(下標,值) 6/48 插入到指定位置 列表.extend(列表) 列表末尾一次性追加另一個序列中的多個值(用新列表擴展原來的列表)。列表-改 列表[下標] = 值 根據(jù)下標修改其值列表-刪 列表.pop() 刪除末尾元素哮塞,并返回此元素 列表.pop(下標) 根據(jù)元素下標刪除刨秆,并返回次元素 del 列表[下標] 根據(jù)元素下標刪除 列表.remove(值) 根據(jù)元素的值刪除列表-判斷 in(存在) 如果存在那么結果為True,否則為False not in(不存在) 如果不存在那么結果為True彻桃,否則False列表-運算符 + * + 和 * 的操作符與字符串相似坛善。 + 號用于組合列表,* 號用于重復列表邻眷。 7/48列表-排序 列表.reverse() 反向列表中元素 列表.sort() 對原列表進行排序眠屎,如果指定參數(shù),則使用比較 函數(shù)指定的比較函數(shù)列表-切片 列表[num1:num2:num3] num1,num2都是列表的下標num3是間隔返回一個新的列表列表-遍歷 使用while循環(huán)遍歷 使用for循環(huán)遍歷元組TuplePython的元組與列表類似肆饶,不同之處在于元組的元素不能 修改改衩。元組使用小括號,列表使用方括號驯镊。元組的功能 = 列表不修改的功能元組和列表轉化列表和元組相互轉換8/48 列表 = list(元組) 元組轉列表 元組 = tuple(列表) 列表轉元組 注意:這兩個方法都是得到一個新的葫督,不會修改原來的字典DictPython內置了字典:dict的支持,dict全稱dictionary板惑,在其他語言中也稱為map橄镜,使用鍵-值(key-value)存儲, 具有極快的查找速度冯乘。定義字典 格式: 字典 = {key1 : value1, key2 : value2 ......} 鍵必須是唯一的洽胶,但值則不必。 值可以取任何數(shù)據(jù)類型裆馒,如字符串姊氓,數(shù)字或元9/48組。 dict內部存放的順序和key放入的順序是沒有關系的喷好。字典-增/改 字典[鍵] = 值 如果次key不存在翔横,就是往字典里新增一個鍵值對; 否則梗搅,就是修改由于一個key只能對應一個value禾唁, 所以,多次對一個key放入value无切,后面的值會把 前面的值沖掉字典-刪 1.字典.pop(鍵) 根據(jù)鍵荡短,刪除指定的值,并將此值返回 2.del 字典[鍵] 根據(jù)鍵订雾,刪除指定的值 3.字典.popitem() 隨機刪除一個 4.字典.clear() 清空字典里的鍵值對字典-查 值 = 字典[鍵] 根據(jù)鍵查詢值 字典.get(鍵肢预,[默認值]) 通過dict提供的get方法,如果key不存在洼哎,可以返回None烫映,或者自己指定的值 len(字典)10/48 計算字典元素個數(shù)沼本,即鍵的總數(shù)。 str(字典) 輸出字典可打印的字符串表示锭沟。 dict.keys() 以列表返回一個字典所有的鍵 dict.values() 以列表返回一個字典所有的值 dict.items() 以列表返回可遍歷的(鍵, 值) 元組數(shù)組字典-判斷 鍵 in 字典 如果鍵在字典中存在抽兆,返回True否則,返回False字典-遍歷 使用for循環(huán)遍歷的三種方式: 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])) 創(chuàng)建一個新字典,以序列 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 聯(lián)合 issubset 子集 issuperset 父集 13/48總結數(shù)據(jù)結構列表的使用元組的不可變性列表和元素相互轉換字典鍵值對set值唯一本章作業(yè)1.兩個列表進行合并操作2.使用列表判斷一個列表是否在另外一個列表中3.列表的反轉4.列表的排序14/485.實現(xiàn)對列表的增刪改查功能6.如何將0-10隨機存入列表中7.求出元組(90,34,-23,18,12)中的最大值和最小值8. 針對列表[90,34,-23,18,12]從小到大進行排序糟趾,然后 輸出排序后結果9. 編程輸出所有的三位水仙花數(shù) 水仙花數(shù):各位數(shù)字的立方數(shù)相加等于該數(shù)本身 例如 153 1*1*1+5*5*5+3*3*3=153 153就是一個三位水仙花數(shù)10.為哈希表追加不重復的100個值,且每個值都是1-100之間的隨機數(shù)甚牲,問哪個數(shù)字重復的次數(shù)最多义郑,重復了多少次?11.假定書籍的種類有5種丈钙,設計何種的數(shù)據(jù)結構可以達到 快速查詢某類所有書籍的功能(提示:用Dictionary)
思考題:
1.如何實現(xiàn)一個單向鏈表
2.解析用戶輸入的一個算數(shù)表達式 算出其結果(選作)
2-1.沒有括號和負號(中等難度)
2-2.帶括號和負號(高難度)
3.如何用隊列實現(xiàn)約瑟夫環(huán)
約瑟夫環(huán):假設有n個人坐成一圈非驮,從某個人開始報數(shù),
數(shù)到m的人出圈雏赦,接著從出圈的下一個人開始重新報數(shù)劫笙,
數(shù)到m的人再次出圈芙扎,如此反復,直到所有人都出圈填大,請 列出出圈順序戒洼。
6日期時間
時間模塊
15/48
在我們平常的代碼中,經(jīng)常需要和時間打交道允华。
在Python中圈浇,與時間處理相關的模塊有:
time、datetime以及calendar,這里講解time
模塊模塊的引入:import time
time中常用函數(shù):
time.time()
返回當前時間的時間戳(1970紀元后經(jīng)過的浮
點秒數(shù))靴寂。
time.ctime()
獲取當前日期時間
time.localtime()
將一個時間戳轉換為當前時區(qū)的
struct_time磷蜀,即時間數(shù)組格式的時間
time.sleep(secs)
線程推遲指定的時間運行
time.timezone
是當?shù)貢r區(qū)(未啟動夏令時)距離格林威治的
偏移秒數(shù)(>0,美洲;<=0大部分歐洲百炬,亞洲蠕搜,非洲)。
time.tzname
包含一對根據(jù)情況的不同而不同的字符串收壕,分 別是帶夏令時的本地時區(qū)名稱妓灌,和不帶的。
time.altzone
返回格林威治西部的夏令時地區(qū)的偏移秒數(shù)蜜宪。
如果該地區(qū)在格林威治東部會返回負值(如西歐虫埂,包括英
國)。對夏令時啟用地區(qū)才能使用圃验。
time.asctime([tupletime]) 接受時間元組并返
回一個可讀的形式為"Tue Dec 11 18:07:14 2008"(2008
16/48
年12月11日 周二18時07分14秒)的24個字符的字符串掉伏。
time.clock( ) 用以浮點數(shù)計算的秒數(shù)返回當前
的CPU時間。用來衡量不同程序的耗時澳窑,比time.time()更
有用斧散。
time.gmtime([secs]) 接收時間戳(1970紀元
后經(jīng)過的浮點秒數(shù))并返回格林威治天文時間下的時間元
組t。注:t.tm_isdst始終為0
time.mktime(tupletime) 接受時間元組并返回
時間戳(1970紀元后經(jīng)過的浮點秒數(shù))摊聋。
time.strftime(fmt[,tupletime]) 接收以時間元
組鸡捐,并返回以可讀字符串表示的當?shù)貢r間,格式由fmt決
定麻裁。
time.strptime(str,fmt='%a %b %d %H:%M:
%S %Y') 根據(jù)fmt的格式把一個時間字符串解析為時間元
組箍镜。
time.tzset() 根據(jù)環(huán)境變量TZ重新初始化時間
相關設置。
時間元組:
Python函數(shù)用一個元組裝起來的9組數(shù)字表示時間:
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}%dlh5jxlh %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)模塊
此模塊的函數(shù)都是日歷相關的,例如打印某月的字符月
歷锋拖。
星期一是默認的每周第一天诈悍,星期天是默認的最后一天埂淮。
更改設置需調用calendar.setfirstweekday()函數(shù)。模塊包
含了以下內置函數(shù):
calendar.calendar(year,w=2,l=1,c=6)
返回一個多行字符串格式的year年年歷写隶,3個月一行倔撞,
間隔距離為c。 每日寬度間隔為w字符慕趴。每行長度為21*
W+18+2* C痪蝇。l是每星期行數(shù)。
calendar.firstweekday( )
返回當前每周起始日期的設置冕房。默認情況下躏啰,首次載入
caendar模塊時返回0,即星期一耙册。
calendar.isleap(year)
是閏年返回True给僵,否則為false。
calendar.leapdays(y1,y2)
返回在Y1详拙,Y2兩年之間的閏年總數(shù)帝际。
calendar.month(year,month,w=2,l=1)
返回一個多行字符串格式的year年month月日歷,兩行
標題饶辙,一周一行蹲诀。每日寬度間隔為w字符。每行的長度為
7* w+6弃揽。l是每星期的行數(shù)脯爪。
calendar.monthcalendar(year,month)
返回一個整數(shù)的單層嵌套列表。每個子列表裝載代表一
個星期的整數(shù)矿微。Year年month月外的日期都設為0;范圍內
22/48
的日子都由該月第幾日表示痕慢,從1開始。
calendar.monthrange(year,month)
返回兩個整數(shù)涌矢。第一個是該月的星期幾的日期碼掖举,第二
個是該月的日期碼。日從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紀元后經(jīng)過的浮點秒數(shù))蜈垮。
calendar.weekday(year,month,day)
返回給定日期的日期碼耗跛。0(星期一)到6(星期日)裕照。
月份為 1(一月) 到 12(12月)。
總結
時間模塊
日期時間模塊
日期時間字符串的轉換
日歷模塊
本章作業(yè)
1.輸入一個日期调塌,格式如:2010 10 24 晋南,判斷這一天是這
23/48
一年中的第幾天。
2.已知2011年11月11日是星期五羔砾,輸入日期 负间,問YYYY年
MM月DD日是星期幾
3.系統(tǒng)會隨機給你一個日期(yyyy-MM-dd)字符串,你需 要計算這個時間上一個月的最后一天的具體日期姜凄,最后以
yyyy年MM月dd日的字符形式返回
4.輸入兩個日期,獲得兩個日期相差幾天政溃,幾小時,幾秒
7函數(shù)
掌握方法的聲明态秧、定義董虱,以及參數(shù)和返回值的含義;
函數(shù)的介紹
什么是方法申鱼?
廣義:一般是指為獲得某種東西或達到某種目的而采取的
手段與行為方式愤诱。
狹義:方法是指由一系列的程序語句組成的代碼塊
方法(method)也叫函數(shù)(function),就是將一堆代碼 進行重用的一種機制捐友。函數(shù)就是一段代碼转锈,這段代碼可能
有輸入的值(參數(shù)),可能會返回值楚殿。一個函數(shù)就像一個
專門做這件事的人撮慨,我們調用它來做一些事情,它可能需
要我們提供一些輸入信息給它脆粥,它執(zhí)行完成后可能會有一
些執(zhí)行結果給我們砌溺。要求的輸入的信息就叫參數(shù),返回的
執(zhí)行結果就是返回值变隔。
str=input("請輸入名字")就是一個有返回結果的函數(shù)规伐;
print("hello")就是一個有執(zhí)行參數(shù)的函數(shù),只有告訴print
被打印的數(shù)據(jù)它才知道如何打酉辉怠猖闪;str2=str.find("a")則是
一個既有參數(shù)又有返回值的函數(shù)。
有了函數(shù)寫代碼就像拼積木肌厨,python中的各種各樣的技術
24/48
其實就是通過for培慌、if等這些基礎的語法將不同的函數(shù)按照
一定的邏輯組織起來握侧。
方法有什么好處镐牺?
重用
無論現(xiàn)實世界還是程序世界,都以方法來達到重用的目的
函數(shù)的定義與調用
定義語法:
def 函數(shù)名([參數(shù)]):
代碼塊
[return 表達式]
命名規(guī)則:方法名開頭大寫达布,參數(shù)名開頭小寫,方法名馅而、
參數(shù)名祥诽、變量名要有意義;
方法的目的在于重用瓮恭,所有的方法編寫完成后雄坪,都處于等
待調用狀態(tài),被調用后方法開始執(zhí)行屯蹦,直到方法返回(有
無返回值均必須返回)
方法大多數(shù)會在其他方法內部被調用
def FirstMethod():
print("我是一個方法")
FirstMethod()
25/48
多級調用關系在程序中表現(xiàn)如下:
===>:調用
<===:返回
Method1()<===>Method2()<===>Method3
()<===>Method4()
棧:后進先出的一種存儲結構
執(zhí)行過程如下:
1.Method1()執(zhí)行到調用Method2()的調用點時 方法被阻
塞 Method1()進入調用堆棧
2.Method2()執(zhí)行到調用Method3()的調用點時 方法被阻塞 Method2()進入調用堆棧
26/48
3.Method3()執(zhí)行到調用Method4()的調用點時 方法被阻塞 Method3()進入調用堆棧
4.Method4()開始執(zhí)行 執(zhí)行完畢后 返回結果給調用堆棧
5.調用堆棧收到返回值后诸衔,將棧頂也就是Method3()出棧繼續(xù)執(zhí)行并返回
27/48
6.調用堆棧收到返回值后,將棧頂也就是Method2()出棧繼續(xù)執(zhí)行并返回
7.調用堆棧收到返回值后颇玷,將棧頂也就是Method1()出棧繼續(xù)執(zhí)行并返回
28/48
8.堆棧為空 本次多級調用執(zhí)行完畢
注意:所有的方法均需要返回笨农?為什么有的方法沒有return?
無返回值的方法可以將return;省略
形式參數(shù)與實際參數(shù)
參數(shù)分為兩種:
形式參數(shù):在編寫方法的時候 預定義的參數(shù)
實際參數(shù):在實際調用(使用)方法的時候 傳入方法的參
數(shù)
參數(shù)的類型:
形式參數(shù):任意的數(shù)據(jù)類型 由方法編寫者在預定義時限定
實際參數(shù):任意的數(shù)據(jù)類型(和形式參數(shù)匹配)在方法的
調用者中定義賦值
簡單示意:
形式參數(shù):
29/48
#radius即為形式參數(shù)
def Area(radius):
return 3.14*radius*radius
實際參數(shù):
#r即為實際參數(shù)
r=1
area=Area(r)
print("面積為%s"area)
傳參的實質: radius = r;
將實際參數(shù)傳遞給形式參數(shù)
函數(shù)的返回值
返回值類型:任意的數(shù)據(jù)類型
方法有無返回值取決于方法的調用者是否需要返回值
1.讀取用戶輸入的整數(shù)帖渠,如果用戶輸入的是數(shù)字,則返回輸
入的值,否則提示用戶重新輸入谒亦。
2.查找兩個整數(shù)中的最大值
3.計算輸入列表所有元素的和:
思考:
寫一個方法,計算一個int類型list中每個元素的總和 、最大
值與最小值?
局部變量與全局變量
30/48
全局變量與局部變量
兩者的本質區(qū)別就是在于作用域空郊;
用通俗的話來理解的話份招,
全局變量是在整個py文件中聲明,全局范圍內都可以訪問
局部變量是在某個函數(shù)中聲明的狞甚,只能在該函數(shù)中調用
它锁摔,如果試圖在超出范圍的地方調用,程序就掛掉了
如果在函數(shù)內部定義與某個全局變量一樣名稱的局部變
量哼审,就可能會導致意外的效果谐腰,可能不是你期望的。因此
不建議這樣使用涩盾,這樣會使得程序很不健全
直接來看幾個例子來理解全局變量和局部變量的區(qū)別吧:
def fun(x):
y=2
print("乘法的運行結果:",x*y)
num1=1
print("初始num1=",num1)
fun(num1)
print("y的值是:",y)
報錯的原因是因為試圖訪問局部變量十气,但是訪問的地方不在該變量y的作用域中
def fun():
num1=2
print("函數(shù)內修改后num1=",num1)
num1=1
print("初始num1=",num1)
fun()
print("運行完函數(shù)后num1=",num1)
可以看到在函數(shù)內部對全局變量的修改后,在函數(shù)執(zhí)行完
畢春霍,修改的結果是無效的砸西,全局變量并不會受到影響
31/48
global關鍵字
如果真的想要在函數(shù)體內修改全局變量的值,就要使用
global關鍵字
def fun():
global num1
num1=2
print("函數(shù)內修改后num1=",num1)
num1=1
print("初始num1=",num1)
fun()
print("運行完函數(shù)后num1=",num1)
使用global關鍵字就是告訴python編譯器這個變量不是局
部變量而是全局變量址儒,其實有點像是"引用"的意思
32/48
可選參數(shù)
含義:可選參數(shù)芹枷,也成為默認參數(shù),是指給方法的特定參
數(shù)指定默認值莲趣,在調用方法時可以省略掉這些參數(shù)鸳慈。
注意事項:
(1)可選參數(shù)不能為參數(shù)列表的第1個參數(shù),必須位于所 有的必選參數(shù)之后(除非沒有必選參數(shù))妖爷;
(2)可選參數(shù)必須指定一個默認值蝶涩,且默認值必須是一 個常量表達式理朋,不能為變量絮识;
(3)所有可選參數(shù)以后的參數(shù)都必須是可選參數(shù)绿聘。
(4)若要為可選參數(shù)傳遞新的值 ,注意數(shù)據(jù)類型
示例:
def Add(a,b=2):
result = a + b
return result
a = 10
#省略b實際參數(shù)的傳遞
Add(a)
#也可以不省略 為b重新賦值
Add(a,5)
命名參數(shù)
命名參數(shù)次舌,也可以叫關鍵字參數(shù)
對于關鍵字參數(shù)熄攘,函數(shù)的調用者可以傳入任意不受限制的
關鍵字參數(shù)。至于到底傳入了哪些彼念,就需要在函數(shù)內部通
過kw檢查挪圾。
33/48
注意:如果要限制關鍵字參數(shù)的名字,就可以用命名關鍵
字參數(shù)
例:
def person(name, age, *, city="北京", job="程序猿"):
print(name, age, city, job)
person("托尼",15,city="鄭州",job="主播")
可變元組參數(shù)
在Python函數(shù)中逐沙,還可以定義可變參數(shù)哲思。顧名思義,可變
參數(shù)就是傳入的參數(shù)個數(shù)是可變的吩案,可以是1個棚赔、2個到任
意個,還可以是0個,調用時可以傳入個數(shù)不同的實參徘郭,具
備很好的靈活性靠益。參數(shù)組裝成一個tuple
參數(shù)數(shù)組必須為參數(shù)列表的最后一個參數(shù)
參數(shù)列表之前可以設置其他的參數(shù)
示例:
def Add(*tuple):
sum=0
for i in tuple:
sum+=i
return sum
#調用使用了參數(shù)數(shù)組的方法
Add()
Add(1,3,5)
Add(1,3,5,7)
34/48
可變字典參數(shù)
可變參數(shù)允許你傳入0個或任意個參數(shù),這些可變參數(shù)在
函數(shù)調用時自動組裝為一個tuple残揉。
而關鍵字參數(shù)允許你傳入0個或任意個含參數(shù)名的參數(shù)胧后,
這些關鍵字參數(shù)在函數(shù)內部自動組裝為一個dict。
例如
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
person("蔣昊",18,gender="男")
匿名函數(shù)
匿名函數(shù)
顧名思義就是指:是指一類無需定義標識符(函數(shù)名)
的函數(shù)或子程序抱环。
定義
語法格式:lambda 參數(shù):表達式
lambda語句中壳快,開頭先寫關鍵字lambda,冒號前是 參數(shù)镇草,可以有多個濒憋,用逗號隔開;冒號右邊的為表達式陶夜,
需要注意的是只能有一個表達式凛驮。由于lambda返回的是函
數(shù)對象(構建的是一個函數(shù)對象),所以需要定義一個變
量去接收条辟。
注意點:lambda 函數(shù)可以接收任意多個參數(shù) (包括可選
參數(shù)) 并且返回單個表達式的值黔夭。lambda 函數(shù)不能包含命
35/48
令,包含的表達式不能超過一個羽嫡。
匿名函數(shù)優(yōu)點:
使用Python寫一些腳本時本姥,使用lambda可以省去定義
函數(shù)的過程,讓代碼更加精簡杭棵。
對于一些抽象的婚惫,不會被別的地方再重復使用的函
數(shù)氛赐,有時候函數(shù)起個名字也是個難題,使用lambda不需要
考慮命名的問題
使用lambda在某些時候然后代碼更容易理解
nums=(1,2,53,6,69)
a=lambda x: max(x)
print(a)
print(type(a))
print(a(nums))
遞歸函數(shù)
遞歸算法的思想
遞歸算法是把問題轉化為規(guī)南认希縮小了的同類問題的子問
題艰管。然后遞歸調用函數(shù)(或過程)來表示問題的解。在C
語言中的運行堆棧為他的存在提供了很好的支持蒋川,過程一
般是通過函數(shù)或子過程來實現(xiàn)牲芋。
遞歸算法:在函數(shù)或子過程的內部,直接或者間接地調用
自己的算法捺球。
遞歸算法的特點:
遞歸算法是一種直接或者間接地調用自身算法的過程缸浦。在
計算機編寫程序中,遞歸算法對解決一大類問題是十分有
效的氮兵,它往往使算法的描述簡潔而且易于理解裂逐。
遞歸算法解決問題的特點:
36/48
(1) 遞歸就是在過程或函數(shù)里調用自身。
(2) 在使用遞歸策略時泣栈,必須有一個明確的遞歸結束條 件卜高,稱為遞歸出口。
(3) 遞歸算法解題通常顯得很簡潔秩霍,但遞歸算法解題的運 行效率較低篙悯。所以一般不提倡用遞歸算法設計程序。
(4) 在遞歸調用的過程當中系統(tǒng)為每一層的返回點铃绒、局部
量等開辟了棧來存儲鸽照。遞歸次數(shù)過多容易造成棧溢出等。
所以一般不提倡用遞歸算法設計程序颠悬。
遞歸算法的要求
遞歸算法所體現(xiàn)的“重復”一般有三個要求:
一是每次調用在規(guī)模上都有所縮小(通常是減半)矮燎; 二是相鄰兩次重復之間有緊密的聯(lián)系,前一次要為后一次
做準備(通常前一次的輸出就作為后一次的輸入)赔癌; 三是在問題的規(guī)模極小時必須用直接給出解答而不再進行
遞歸調用诞外,因而每次遞歸調用都是有條件的(以規(guī)模未達到
直接解答的大小為條件),無條件遞歸調用將會成為死循環(huán)
而不能正常結束灾票。
簡單步驟:
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))
斐波那契數(shù)列
迭代求法1 1 2 3 5 8 13 21 34 55
遞歸深度
獲得深度值:
import sys
sys.getrecursionlimit()
1000
當遞歸深度超過這個值的時候,就會引發(fā)這樣的一個異
常刊苍。
解決的方式是手工設置遞歸調用深度既们,
方式為
import sys
sys.setrecursionlimit(1000000) #例如這里設置為一百萬
38/48
總結
函數(shù)的介紹
函數(shù)的定義和調用
函數(shù)的4種類型
函數(shù)的參數(shù)
變量作用域
遞歸函數(shù)
匿名函數(shù)
函數(shù)式編程
本章作業(yè)
必做:
1、寫一個方法正什,在方法內依次打印出列表每個元素的
值啥纸。
2、寫一個方法婴氮,計算列表所有元素的和(注意返回值)斯棒。
3盾致、寫一個方法,計算列表所有奇數(shù)下標元素的和(注意返
回值)荣暮。
4庭惜、寫一個方法,計算列表所有偶數(shù)下標元素的和(注意返
回值)渠驼。
5蜈块、寫一個方法可以計算兩個數(shù)的和鉴腻,想想這個方法有哪
些參數(shù)迷扇,返回值。
39/48
6爽哎、寫一個方法可以計算兩個數(shù)的商(分母不能為0)蜓席,想想 這個方法有哪些參數(shù),返回值是什么课锌。
7厨内、寫一個方法將傳入的天、小時渺贤、分鐘雏胃、秒的總和轉換
為秒,比如0天志鞍、2小時瞭亮、5分、7秒固棚,他們代表的總秒數(shù)為
2*3600+5*60+7=7507秒统翩。想想這個方法有哪些參數(shù),
返回值是什么類型此洲。
8厂汗、寫一個方法交換整型列表中兩個指定下標元素的值。
想想這個方法有哪些參數(shù)呜师,返回值是什么類型娶桦。
9、寫一個方法計算整型列表中所有能被3整除元素的個
數(shù)汁汗。想想這個方法有哪些參數(shù)衷畦,返回值是什么類型。
10碰酝、寫一個方法將整型數(shù)字(int)轉換為格式化的字符串
(string)霎匈,現(xiàn)要求如下:
a.可以指定轉換后[字符串的長度];
b.當數(shù)字的長度不足指定的長度,讓這個字符串右對齊送爸,
指定[左邊補的字符(char)];
例如铛嘱,假設現(xiàn)在將指定的數(shù)字轉換為固定長度為8的字符
串暖释,如果長度不足,左邊補'0'墨吓,那么27這個數(shù)字就會轉換
為字符串"00000027"球匕。
根據(jù)要求,想想這個方法有哪些參數(shù)帖烘,返回值是什么類
型亮曹。
11.用方法實現(xiàn)找出一個int類型列表中最大值和最小值
12.判斷一個數(shù)是否是質數(shù)(素數(shù))?該如何聲明方法秘症?
13. 將指定的秒數(shù)轉變?yōu)閹仔r幾分幾秒照卦。
14.使用Random類給一個數(shù)組的所有元素賦隨機初值(不
重復)。
40/48
15.判斷一個整型數(shù)組是否是對稱的乡摹。所謂對稱就是第一
個元素等于最后一個元素役耕,第二個元素等于倒數(shù)第二個元
素,依次類推聪廉,例如【7瞬痘,3,1板熊,3框全,7】就是對稱的。
16.打印一個元組的所有值干签。
17.查找一個元組中某個值是否存在津辩,如果存在返回這個
值的索引,否則返回-1筒严。
18.將一個列表反轉過來丹泉,比如【2,3鸭蛙,1摹恨,4,7】轉換為
【7娶视,4晒哄,1,3肪获,2】
19.求一個列表的最大值寝凌。
20.求一個列表的最小值。
21.寫一個方法孝赫,實現(xiàn)在列表中指定的的位置前插入一個
值较木。
22.寫一個方法,刪除列表中指定位置的元素青柄。
23.猜數(shù)游戲
1.隨機出現(xiàn)一個數(shù)(范圍自定義) 作為答案
2.提示用戶輸入并根據(jù)答案和用戶輸入的大小關系輸出大
了? 小了?
3.5次機會
4.可以重復玩
5.根據(jù)猜對的次數(shù)進行評價
6.無論對錯 請告知答案
8系統(tǒng)模塊
模塊的概念
模塊的引入
系統(tǒng)模塊os
操作模塊sys
數(shù)學模塊math
41/48
模塊的概念
模塊 是一個設計術語伐债,是指對詞條中部分內容進行格式化
整理的模板预侯。
例如歌手類詞條中的“音樂作品”模塊,電視劇類詞條的“分
集劇情”模塊峰锁。
在程序設計中萎馅,為完成某一功能所需的一段程序或子程序;
或指能由編譯程序、裝配程序等處理的獨立程序單位; 或指大型軟件系統(tǒng)的一部分虹蒋。
模塊,又稱構件,是能夠單獨命名并獨立地完成一定功能的
程序語句的集合(即程序代碼和數(shù)據(jù)結構的集合體)糜芳。
它具有兩個基本的特征:外部特征和內部特征。
外部特征是指模塊跟外部環(huán)境聯(lián)系的接口(即其他模塊或
程序調用該模塊的方式魄衅,包括有輸入輸出參數(shù)峭竣、引用的全
局變量)和模塊的功能;
內部特征是指模塊的內部環(huán)境具有的特點(即該模塊的局
部數(shù)據(jù)和程序代碼)徐绑。
Python 模塊(Module)邪驮,是一個 Python 文件莫辨,以 .py 結
尾傲茄,包含了 Python 對象定義和Python語句。
模塊讓你能夠有邏輯地組織你的 Python 代碼段沮榜。
把相關的代碼分配到一個模塊里能讓你的代碼更好用盘榨,更
易懂。
模塊能定義函數(shù)蟆融,類和變量草巡,模塊里也能包含可執(zhí)行的代
碼。
模塊的引入
42/48
模塊的引入
import 語句
模塊定義好后型酥,我們可以使用 import 語句來引入模塊
引入模塊的語法:
import Module[, module2[,... moduleN]
一次可以引入多個模塊,但是一般情況下 我們一次只引
入一個模塊.
當解釋器遇到import語句山憨,如果模塊在當前的搜索路徑 就會被導入。
比如要引用模塊 math弥喉,就可以在文件最開始的地方用
import math 來引入郁竟。
在調用 math 模塊中的函數(shù)時,必須這樣引用:模塊
名.函數(shù)名一個模塊只會被導入一次由境,不管你執(zhí)行了多少次
import棚亩。這樣可以防止導入模塊被一遍又一遍地執(zhí)行。
有時候我們只需要用到模塊中的某個函數(shù)虏杰,只需要引入
該函數(shù)即可讥蟆,此時可以用下面方法實現(xiàn):
from 模塊名 import 函數(shù)名1,函數(shù)名2....
不僅可以引入函數(shù),還可以引入一些全局變量纺阔、類等
通過這種方式引入的時候瘸彤,調用函數(shù)時只能給出函數(shù) 名,不能給出模塊名笛钝,但是當兩個模塊中含有相同名稱函
數(shù)的時候质况,后面一次引入會覆蓋前一次引入低零。
也就是說假如模塊A中有函數(shù)function( ),在模塊B中
43/48
也有函數(shù)function( )拯杠,如果引入A中的function在先掏婶、B中
的function在后,那么當調用function函數(shù)的時候潭陪,是去執(zhí)
行模塊B中的function函數(shù)雄妥。
如果想一次性引入math中所有的東西,還可以通過
from math import *來實現(xiàn)
系統(tǒng)模塊os
python編程時依溯,經(jīng)常和文件老厌、目錄打交道,這是就離不了
os模塊,os模塊包含普遍的操作系統(tǒng)功能,與具體的平臺無
關.os 模塊提供了非常豐富的方法用來處理文件和目錄.
常用的如下:
os.path 獲取該模塊的路徑
os.name 獲取現(xiàn)在正在實用的平臺黎炉,Windows 返回 ‘nt';
Linux 返回’posix'
os.rename(originPath, targetPath) 重命名
os.remove(path) 刪除文件
os.mkdir(str) 創(chuàng)建文件夾
os.makedirs(path) 創(chuàng)建多個文件夾
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
#獲得文件夾里的所有內容
#遞歸思路 在樹形結構目錄里經(jīng)常使用
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運行環(huán)境的變量和函數(shù)
sys模塊常用的功能:
sys.argv 獲取當前正在執(zhí)行的命令行參數(shù)的參數(shù)列表(list)
sys.platform 獲取當前執(zhí)行環(huán)境的平臺枝秤,如win32表示是
Windows 32bit操作系統(tǒng),linux2表示是linusys.path 在
python啟動時慷嗜,
sys.path根據(jù)內建規(guī)則淀弹、PYTHONPATH變量進行初始化。
sys.builtin_module_names 返回一個列表庆械,包含內建模塊
47/48
的名字
sys.exit(n) 調用sys.exit(n)可以中途退出程序薇溃,當參數(shù)非
0時,會引發(fā)一個SystemExit異常缭乘,從而可以在主程序中 捕獲該異常沐序。
數(shù)學模塊math
python中math模塊中提供的基本數(shù)學函數(shù)
sin(x):求x的正弦
cos(x):求x的余弦
asin(x):求x的反正弦
acos(x):求x的反余弦
tan(x):求x的正切
atan(x):求x的反正切
fmod(x,y):求x/y的余數(shù)
ceil(x):取不小于x的最小整數(shù)
floor(x):求不大于x的最大整數(shù)
fabs(x):求絕對值
pow(x,y):求x的y次冪
log10(x):求x的以10位底的對數(shù)
sqrt(x):求x的平方根
factorial(x) 求x的階乘
trunc(x) 求x的整數(shù)部分
總結
模塊的概念
模塊的引入
48/48
系統(tǒng)模塊os
操作模塊sys
數(shù)學模塊math
本章作業(yè)
必做:
1.當前程序目錄下創(chuàng)建py文件夾,目錄里創(chuàng)建十個子文件
夾,并且命名為1-10
2.在子文件夾1-10里堕绩,偶數(shù)文件夾下創(chuàng)建新文件夾策幼,命名
end
3.將子文件夾中2,4,8里的end重命名為end2,end4奴紧,
end8
4.刪除子文件2
5.打印py文件夾中所有文件夾名稱
6.刪除py及其所有子文件夾
7.浮點數(shù)20.73特姐,向上取整,向下取整绰寞,正弦值
8.弧度π/4到逊,π/2,對應的度數(shù)