py基礎

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ù)

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市滤钱,隨后出現(xiàn)的幾起案子觉壶,更是在濱河造成了極大的恐慌,老刑警劉巖件缸,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铜靶,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機争剿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門已艰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蚕苇,你說我怎么就攤上這事哩掺。” “怎么了涩笤?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵嚼吞,是天一觀的道長。 經(jīng)常有香客問我蹬碧,道長舱禽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任恩沽,我火速辦了婚禮誊稚,結果婚禮上,老公的妹妹穿的比我還像新娘罗心。我一直安慰自己里伯,他們只是感情好,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布协屡。 她就那樣靜靜地躺著俏脊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪肤晓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天认然,我揣著相機與錄音补憾,去河邊找鬼。 笑死卷员,一個胖子當著我的面吹牛盈匾,可吹牛的內容都是我干的。 我是一名探鬼主播毕骡,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼削饵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了未巫?” 一聲冷哼從身側響起窿撬,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎叙凡,沒想到半個月后劈伴,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡握爷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年跛璧,在試婚紗的時候發(fā)現(xiàn)自己被綠了严里。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡追城,死狀恐怖刹碾,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情座柱,我是刑警寧澤教硫,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站辆布,受9級特大地震影響瞬矩,放射性物質發(fā)生泄漏。R本人自食惡果不足惜锋玲,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一景用、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧惭蹂,春花似錦伞插、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至廷雅,卻和暖如春耗美,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背航缀。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工商架, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人芥玉。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓蛇摸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親灿巧。 傳聞我的和親對象是個殘疾皇子赶袄,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內容

  • 〇、前言 本文共108張圖抠藕,流量黨請慎重饿肺! 歷時1個半月,我把自己學習Python基礎知識的框架詳細梳理了一遍幢痘。 ...
    Raxxie閱讀 18,952評論 17 410
  • 概要 64學時 3.5學分 章節(jié)安排 電子商務網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,180評論 0 3
  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學習記錄文檔唬格,今天18年5月份再次想寫文章,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 2,746評論 2 9
  • 怡然安心生活禪 孕育健康心理情勘破情感情緒障 釋出人生光明面 今日工商求效率 強大壓力障擾心壓榨精力與時間 ...
    東風唐閱讀 270評論 0 0
  • 有一種成功叫運氣。這其中有很多相互關聯(lián)购岗,就像蜘蛛網(wǎng)一樣互相交錯汰聋。 包含了很多項在里面: 1,天賦喊积,勤奮與運氣 02...
    螺魂_58ad閱讀 167評論 0 0