A蚤氏、函數(shù)的基本使用
1.函數(shù)的定義
函數(shù)是一段具有特定功能的、可重用的語(yǔ)句組,用函數(shù)名來(lái)表示仙逻,并通過(guò)函數(shù)名進(jìn)行功能調(diào)用服鹅。
函數(shù)也可以看作是一段具有名字的子程序,可以在需要的地方調(diào)用執(zhí)行杈绸,不需要在每個(gè)執(zhí)行地方重復(fù)編寫(xiě)這些語(yǔ)句帖蔓。
每次使用函數(shù)可以提供不同的參數(shù)作為輸入,以實(shí)現(xiàn)對(duì)不同數(shù)據(jù)的處理瞳脓。
函數(shù)執(zhí)行后塑娇,還可以反饋相應(yīng)的處理結(jié)果。
函數(shù)是一種功能抽象(類(lèi)似黑盒)劫侧。
? ??使用函數(shù)的目的:
? ??降低編程難度
? ??代碼重用
函數(shù)的使用:
函數(shù)定義
Python安裝包自帶的函數(shù):
????Python內(nèi)置函數(shù)(abs()埋酬、eval()、input())
????Python標(biāo)準(zhǔn)庫(kù)中的函數(shù)(math.sqrt())
自定義函數(shù)(用戶(hù)自己編寫(xiě))
函數(shù)調(diào)用
自定義函數(shù)
Python定義一個(gè)函數(shù)使用def保留字:
函數(shù)定義時(shí)烧栋,所指定的參數(shù)是一種占位符
函數(shù)定義后写妥,如果不經(jīng)過(guò)調(diào)用,不會(huì)被執(zhí)行
函數(shù)定義時(shí)审姓,參數(shù)是輸入珍特,函數(shù)體是處理,結(jié)果是輸出(IPO)
函數(shù)名:任何有效的Python標(biāo)識(shí)符
參數(shù)列表:調(diào)用函數(shù)時(shí)給它的值
????????參數(shù)個(gè)數(shù)>=0
????????多個(gè)參數(shù)用 , 分隔
形式參數(shù)(形參):定義函數(shù)時(shí)使用魔吐,只在函數(shù)內(nèi)部有用扎筒。
實(shí)際參數(shù)(實(shí)參):調(diào)用函數(shù)時(shí)使用莱找。可以是常量嗜桌、變量奥溺、表達(dá)式、函數(shù)骨宠。
函數(shù)體:函數(shù)被調(diào)用時(shí)執(zhí)行的代碼
return語(yǔ)句:
????結(jié)束函數(shù)調(diào)用谚赎,并將結(jié)果返回給調(diào)用者
????可選
????可以出現(xiàn)在函數(shù)體的任意位置
????如果沒(méi)有return語(yǔ)句,函數(shù)在函數(shù)體結(jié)束位置將控制權(quán)返回給調(diào)用方
函數(shù)接口:返回值和參數(shù)
函數(shù)傳遞信息的途徑:
????通過(guò)函數(shù)返回值的方式傳遞信息
????通過(guò)參數(shù)傳遞信息
實(shí)例:生日歌
過(guò)生日時(shí)要為朋友唱生日歌诱篷,歌詞為:
Happy birthday to you!
Happy birthday to you!
Happy birthday, dear <名字>
Happy birthday to you!
要求:編寫(xiě)程序?yàn)镸ike和Lily輸出生日歌壶唤。
最簡(jiǎn)單的實(shí)現(xiàn)方法是重復(fù)使用print()語(yǔ)句。
2.函數(shù)調(diào)用的過(guò)程
程序調(diào)用一個(gè)函數(shù)需要執(zhí)行以下四個(gè)步驟:
(1)調(diào)用程序在調(diào)用處暫停執(zhí)行棕所;
(2)在調(diào)用時(shí)闸盔,將實(shí)參復(fù)制給函數(shù)的形參;
(3)執(zhí)行函數(shù)體語(yǔ)句琳省;
(4)函數(shù)調(diào)用結(jié)束給出返回值(return)迎吵,程序回到調(diào)用前的暫停處繼續(xù)執(zhí)行。
3.lambda函數(shù)
Python有33個(gè)保留字针贬,其中一個(gè)是lambda击费,用于定義一種特殊的函數(shù) — 匿名函數(shù),又稱(chēng)lambda函數(shù)桦他。
匿名函數(shù)并非沒(méi)有名字蔫巩,而是將函數(shù)名作為函數(shù)結(jié)果返回,如下:
<函數(shù)名> =
lambda <參數(shù)列表>: <表達(dá)式>
lambda函數(shù)與正常函數(shù)一樣快压,等價(jià)于下面形式:
def <函數(shù)名>(<參數(shù)列表>):
????return <表達(dá)式>
簡(jiǎn)單說(shuō)圆仔,lambda函數(shù)用于定義簡(jiǎn)單的、能夠在一行內(nèi)表示的函數(shù)蔫劣,返回一個(gè)函數(shù)類(lèi)型坪郭。
謹(jǐn)慎使用lambda函數(shù)
lambda函數(shù)主要用作一些特定函數(shù)或方法的參數(shù)
lambda函數(shù)有一些固定的使用方式,建議逐步掌握
一般情況下脉幢,建議使用def定義普通函數(shù)
B歪沃、函數(shù)的參數(shù)傳遞
1.函數(shù)的參數(shù)
????函數(shù)的形參、實(shí)參嫌松。
????函數(shù)可以定義可選參數(shù)沪曙,使用參數(shù)的位置或者名稱(chēng)傳遞參數(shù)值。
????根據(jù)函數(shù)中變量的不同作用域有不同的函數(shù)返回值方式豆瘫。
2.可選參數(shù)和可變數(shù)量參數(shù)
在定義函數(shù)時(shí)珊蟀,有些參數(shù)可以存在默認(rèn)值
在函數(shù)定義時(shí),可以設(shè)計(jì)可變數(shù)量參數(shù)
????通過(guò)參數(shù)前增加星號(hào)(*)實(shí)現(xiàn)
????必須放在參數(shù)列表的最后
????調(diào)用時(shí),這些參數(shù)被當(dāng)做元組類(lèi)型傳遞到函數(shù)
3. 參數(shù)的位置和名稱(chēng)傳遞
????函數(shù)調(diào)用時(shí)育灸,默認(rèn)將實(shí)參按照位置順序傳遞給函數(shù)
????例如:func(x1,y1,z1,x2,y2,z2)
???????????????????? return
? ?實(shí)際調(diào)用:result=func(1,2,3,4,5,6)
????可讀性差
????提供了按照形參名稱(chēng)輸入實(shí)參的方式腻窒,調(diào)用如下:
????result=func(x2=4, y2=5, z2=6, x1=1, y1=2,z1=3)
由于調(diào)用函數(shù)時(shí)指定了參數(shù)名稱(chēng),所以參數(shù)之間的順序可以任意調(diào)整磅崭。
4. 函數(shù)的返回值
????return語(yǔ)句用來(lái)退出函數(shù)儿子,并將程序返回到函數(shù)被調(diào)用的位置繼續(xù)執(zhí)行。
????return語(yǔ)句同時(shí)可以將0個(gè)砸喻、1個(gè)或多個(gè)函數(shù)運(yùn)算完的結(jié)果返回給函數(shù)被調(diào)用處的變量柔逼,例如:
函數(shù)可以沒(méi)有return,此時(shí)函數(shù)并不返回值割岛,等價(jià)于return none愉适。
用return返回多個(gè)值,也可以根據(jù)多返回值的順序進(jìn)行賦值癣漆。
返回值可以是一個(gè)變量维咸,也可以是一個(gè)表達(dá)式
5. 函數(shù)對(duì)變量的作用
函數(shù)通過(guò)參數(shù)與調(diào)用程序傳遞信息。
函數(shù)的形參值接收了實(shí)參的值惠爽,給形參賦值不影響實(shí)參癌蓖。
Python通過(guò)值來(lái)傳遞參數(shù)。
一個(gè)程序中的變量包括兩類(lèi):
局部變量指在函數(shù)內(nèi)部使用的變量婚肆,僅在函數(shù)內(nèi)部有效租副,當(dāng)函數(shù)退出時(shí)變量將不存在。
全局變量指在函數(shù)之外定義的變量较性,一般沒(méi)有縮進(jìn)用僧,在程序執(zhí)行全過(guò)程有效。
原因:當(dāng)函數(shù)執(zhí)行完退出后两残,其內(nèi)部變量將被釋放永毅。
如果函數(shù)內(nèi)部使用了全局變量呢?
函數(shù)func()內(nèi)部使用了變量n人弓,并且將變量參數(shù)b賦值給變量n,為何全局變量n值沒(méi)有改變着逐?
如果希望讓func()函數(shù)將n當(dāng)作全局變量崔赌,需要在變量n使用前顯式聲明該變量為全局變量。
如果全局變量不是整數(shù)n耸别,而是列表類(lèi)型ls健芭,會(huì)怎么樣呢?
如果func()函數(shù)內(nèi)部存在一個(gè)真實(shí)創(chuàng)建過(guò)且名稱(chēng)為ls的列表秀姐,則func()將操作該列表而不會(huì)修改全局變量慈迈。
Python函數(shù)對(duì)變量的作用遵守如下原則:
????????簡(jiǎn)單數(shù)據(jù)類(lèi)型變量無(wú)論是否與全局變量重名,僅在函數(shù)內(nèi)部創(chuàng)建和使用,函數(shù)退出后變量被釋放痒留;
????????簡(jiǎn)單數(shù)據(jù)類(lèi)型變量在用global保留字聲明后谴麦,作為全局變量;
????????對(duì)于組合數(shù)據(jù)類(lèi)型的全局變量伸头,如果在函數(shù)內(nèi)部沒(méi)有被真實(shí)創(chuàng)建的同名變量匾效,則函數(shù)內(nèi)部可直接使用并修改全局變量的值;
????????如果函數(shù)內(nèi)部真實(shí)創(chuàng)建了組合數(shù)據(jù)類(lèi)型變量恤磷,無(wú)論是否有同名全局變量面哼,函數(shù)僅對(duì)局部變量進(jìn)行操作。
C扫步、datetime庫(kù)的使用
引入模塊
from datetime import datetime
1.datetime庫(kù)概述
以不同格式顯示日期和時(shí)間是程序中最常用到的功能魔策。
Python提供了一個(gè)處理時(shí)間的標(biāo)準(zhǔn)函數(shù)庫(kù)datetime,它提供了一系列由簡(jiǎn)單到復(fù)雜的時(shí)間處理方法河胎。datetime庫(kù)可以從系統(tǒng)中獲得時(shí)間代乃,并以用戶(hù)選擇的格式輸出。
datetime庫(kù)億格林威治時(shí)間為基礎(chǔ)仿粹。
每天劃分為3600×24秒搁吓。
兩個(gè)常量:datetime.MINYEAR(=1) 和datetime.MAXYEAR (=9999)。
datetime庫(kù)以類(lèi)的方式提供多種日期和時(shí)間表達(dá)方式
datetime.date:日期表示類(lèi)吭历,表示年堕仔、月、日等
datetime.time:時(shí)間表示類(lèi)晌区,表示小時(shí)摩骨、分鐘、秒朗若、毫秒等
datetime.datetime:日期和時(shí)間表示的類(lèi)恼五,功能覆蓋date和time類(lèi)
datetime.timedelta:時(shí)間間隔有關(guān)的類(lèi)
datetime.tzinfo:與時(shí)區(qū)有關(guān)的信息表示類(lèi)
2.datetime庫(kù)解析
使用datetime.now()獲得當(dāng)前日期和時(shí)間對(duì)象
作用:返回一個(gè)datetime類(lèi)型,表示當(dāng)前的日期和時(shí)間哭懈,精確到微秒灾馒。
使用datetime.utcnow()獲得當(dāng)前日期和時(shí)間對(duì)應(yīng)的UTC(世界標(biāo)準(zhǔn)時(shí)間)時(shí)間對(duì)象,使用方法如下:
datetime.utcnow()
作用:返回datetime類(lèi)型遣总,表示當(dāng)前日期和時(shí)間的UTC表示睬罗,精確到微秒。
datetime.now()和datetime.utcnow()都返回一個(gè)datetime類(lèi)型的對(duì)象旭斥,也可以直接使用datetime()構(gòu)造一個(gè)日期和時(shí)間對(duì)象容达,使用方法如下:
datetime(year, month, day, hour=0,
minute=0,second=0, microsecond=0)
作用:返回一個(gè)datetime類(lèi)型,表示指定的日期和時(shí)間垂券,可以精確到微秒花盐。
調(diào)用datetime()函數(shù)直接創(chuàng)建一個(gè)datetime對(duì)象,表示2018年4月16日22:33,32秒7微秒算芯,執(zhí)行結(jié)果如下:
程序已經(jīng)有了一個(gè)datetime對(duì)象柒昏,進(jìn)一步可以利用這個(gè)對(duì)象的屬性顯示時(shí)間,為了區(qū)別datetime庫(kù)名也祠,采用上例中的someday代替生成的datetime對(duì)象
datetime對(duì)象有3個(gè)常用的時(shí)間格式化方法昙楚,如表所示:
isoformat()和isoweekday()方法的使用如下:
strftime()方法是時(shí)間格式化最有效的方法,幾乎可以以任何通用格式輸出時(shí)間
strftime()格式化字符串的數(shù)字左側(cè)會(huì)自動(dòng)補(bǔ)零诈嘿,上述格式也可以與print()的格式化函數(shù)一起使用
D堪旧、七段數(shù)碼管繪制
1.七段數(shù)碼管繪制
七段數(shù)碼管(seven-segment indicator)由7段數(shù)碼管拼接而成,每段有亮或不亮兩種情況奖亚,改進(jìn)型的七段數(shù)碼管還包括一個(gè)小數(shù)點(diǎn)位置淳梦。
七段數(shù)碼管能形成27=128種不同狀態(tài),其中部分狀態(tài)能夠顯示易于人們理解的數(shù)字或字母含義昔字,因此被廣泛使用爆袍。下圖給出了十六進(jìn)制中16個(gè)字符的七段數(shù)碼管表示。
要求:
用程序繪制七段數(shù)碼管作郭。
基本思路:
繪制單個(gè)數(shù)字對(duì)應(yīng)的數(shù)碼管
獲得一串?dāng)?shù)字陨囊,繪制對(duì)應(yīng)的數(shù)碼管
獲得當(dāng)前系統(tǒng)時(shí)間,繪制對(duì)應(yīng)的數(shù)碼管
每個(gè)0到9的數(shù)字都有相同的七段數(shù)碼管樣式夹攒,因此蜘醋,可以通過(guò)設(shè)計(jì)函數(shù)復(fù)用數(shù)字的繪制過(guò)程。
進(jìn)一步咏尝,每個(gè)七段數(shù)碼管包括7個(gè)數(shù)碼管樣式压语,除了數(shù)碼管位置不同外,繪制風(fēng)格一致编检,也可以通過(guò)函數(shù)復(fù)用單個(gè)數(shù)碼段的繪制過(guò)程胎食。
步驟1:繪制單個(gè)數(shù)字對(duì)應(yīng)的數(shù)碼管
七段數(shù)碼管有7個(gè)基本線(xiàn)條組成
七段數(shù)碼管可以有固定順序
不同數(shù)字顯示不同的線(xiàn)條
?
E、代碼的復(fù)用和模塊化設(shè)計(jì)
1.代碼的復(fù)用
把代碼當(dāng)做資源進(jìn)行抽象
代碼資源化:程序代碼是一種用來(lái)表達(dá)計(jì)算的“資源”允懂。
代碼抽象化:使用函數(shù)等方法對(duì)代碼賦予更高級(jí)別的定義厕怜。
代碼復(fù)用:同一份代碼在需要的時(shí)候可以被重復(fù)使用 –– 首先要對(duì)代碼進(jìn)行抽象
函數(shù) 和對(duì)象 是代碼復(fù)用的兩種主要形式
函數(shù):將代碼命名在代碼層面建立了初步的抽象。
對(duì)象:屬性和方法
<a>.<b>和.()
在函數(shù)之上再次組織進(jìn)行抽象
函數(shù)是程序的一種基本抽象方式累驮,它將一系列代碼組織起來(lái)通過(guò)命名供其他程序使用酣倾。
函數(shù)封裝的直接好處是代碼復(fù)用,任何其他代碼只要輸入?yún)?shù)即可調(diào)用函數(shù)谤专,從而避免相同功能代碼在被調(diào)用處重復(fù)編寫(xiě)。
代碼復(fù)用產(chǎn)生了另一個(gè)好處午绳,當(dāng)更新函數(shù)功能時(shí)置侍,所有被調(diào)用處的功能都被更新(更新便利)。
當(dāng)程序的長(zhǎng)度在百行以上,如果不劃分模塊蜡坊,就算是最好的程序員也很難理解程序含義杠输,程序的可讀性就已經(jīng)很糟糕了。
最好解決方法:將一個(gè)程序分割成短小的程序段秕衙,每一段程序完成一個(gè)小的功能蠢甲。
無(wú)論面向過(guò)程和面向?qū)ο缶幊蹋瑢?duì)程序合理劃分功能模塊并基于模塊設(shè)計(jì)程序是一種常用方法据忘,被稱(chēng)為“模塊化設(shè)計(jì)”鹦牛。
2. 模塊化設(shè)計(jì)
模塊化設(shè)計(jì)的核心:分而治之
通過(guò)函數(shù)或者對(duì)象封裝,將程序劃分為模塊和模塊之間的表達(dá)
具體包括:主程序勇吊、子程序和子程序間關(guān)系
子程序:模塊
主程序:模塊間的關(guān)系
分而治之:一種分而治之曼追、分層抽象、體系化的設(shè)計(jì)思想
模塊化設(shè)計(jì)一般有兩個(gè)基本要求:
緊耦合:兩個(gè)部分的交流很多汉规,無(wú)法獨(dú)立存在礼殊。
松耦合:兩個(gè)部分的交流較少,有清晰簡(jiǎn)單的接口针史,可以獨(dú)立存在晶伦。
一般來(lái)說(shuō),完成特定功能或被經(jīng)常復(fù)用的一組語(yǔ)句應(yīng)該采用函數(shù)來(lái)封裝啄枕,并盡可能減少函數(shù)間參數(shù)和返回值的數(shù)量婚陪,這樣復(fù)用的可能性越高。
盡可能合理劃分功能塊射亏,功能塊內(nèi)部耦合緊密--緊耦合近忙;
模塊間關(guān)系盡可能簡(jiǎn)單,功能塊之間耦合度低--松耦合智润。
F及舍、函數(shù)的遞歸
遞歸的定義
函數(shù)作為一種代碼封裝,可以被其他程序調(diào)用窟绷,當(dāng)然锯玛,也可以被函數(shù)內(nèi)部代碼調(diào)用。這種函數(shù)定義中調(diào)用函數(shù)自身的方式稱(chēng)為遞歸兼蜈。就像一個(gè)人站在裝滿(mǎn)鏡子的房間中攘残,看到的影像就是遞歸的結(jié)果。
遞歸在數(shù)學(xué)和計(jì)算機(jī)應(yīng)用上非常強(qiáng)大为狸,能夠非常簡(jiǎn)潔的解決重要問(wèn)題歼郭。
遞歸不是循環(huán)
階乘的例子揭示了遞歸的兩個(gè)關(guān)鍵特征:
?(1)存在一個(gè)或多個(gè)基例,基例不需要再次遞歸辐棒,它是確定的表達(dá)式病曾;
?(2)計(jì)算出存在的遞歸鏈牍蜂,所有遞歸鏈要以一個(gè)或多個(gè)基例結(jié)尾。
類(lèi)似數(shù)學(xué)歸納法
?(1)證明當(dāng)n 取第一個(gè)值的時(shí)候泰涂,命題成立
?(2)假設(shè)當(dāng)nk 時(shí)命題成立鲫竞,證明當(dāng)n=nk+1時(shí)命題也成立
?(3)遞歸是數(shù)學(xué)歸納法思維在編程中的體現(xiàn)
遞歸的使用方法
實(shí)例:階乘的計(jì)算。
分析
利用函數(shù)+分支語(yǔ)句實(shí)現(xiàn)上述代碼逼蒙。
遞歸本身是一個(gè)函數(shù)从绘,需要以函數(shù)定義方式描述
函數(shù)內(nèi)部,采用分支語(yǔ)句對(duì)輸入?yún)?shù)進(jìn)行判斷
基例和遞歸鏈是牢,分別編寫(xiě)對(duì)應(yīng)的代碼僵井。?????
?
注意:
構(gòu)造遞歸函數(shù),需要基例
基例不進(jìn)行遞歸妖泄,否則遞歸就會(huì)無(wú)限循環(huán)執(zhí)行
此遞歸調(diào)用以字符串形式執(zhí)行驹沿,應(yīng)設(shè)置基例為空串
F、科赫曲線(xiàn)繪制
科赫曲線(xiàn)
高大上的分形幾何
分形幾何是一種迭代的幾何圖形蹈胡,廣泛存在于自然界中渊季。(整體與局部有很強(qiáng)的相似性。)
科赫(Koch)曲線(xiàn)
在眾多經(jīng)典數(shù)學(xué)曲線(xiàn)中非常著名罚渐,由瑞典數(shù)學(xué)家馮·科赫(H·V·Koch)于1904年提出却汉,由于其形狀類(lèi)似雪花,也被稱(chēng)為雪花曲線(xiàn)荷并。
科赫曲線(xiàn)的基本概念和繪制方法如下:
正整數(shù)n代表科赫曲線(xiàn)的階數(shù)合砂,表示生成科赫曲線(xiàn)過(guò)程的操作次數(shù)。
科赫曲線(xiàn)初始化階數(shù)為0源织,表示一個(gè)長(zhǎng)度為L(zhǎng)的直線(xiàn)翩伪。
對(duì)于直線(xiàn)L,將其等分為三段谈息,中間一段用邊長(zhǎng)為L/3的等邊三角形的兩個(gè)邊替代缘屹,得到1階科赫曲線(xiàn),它包含四條線(xiàn)段侠仇。
進(jìn)一步對(duì)每條線(xiàn)段重復(fù)同樣的操作后得到2階科赫曲線(xiàn)轻姿。繼續(xù)重復(fù)同樣的操作n次可以得到n階科赫曲線(xiàn)。
科赫曲線(xiàn)屬于分形幾何分支逻炊,它的繪制過(guò)程體現(xiàn)了遞歸思想互亮。
????????遞歸思想:函數(shù)+分支
????????遞歸鏈條:線(xiàn)段的組合
????????遞歸基例:初始線(xiàn)段
雪花效果:科赫曲線(xiàn)的組合
G、Python內(nèi)置函數(shù)
Python解釋器提供了68個(gè)內(nèi)置函數(shù)余素,其中豹休,前36個(gè)已經(jīng)將結(jié)果,需要掌握桨吊。
H慕爬、PyInstaller庫(kù)基本介紹
需求:將python源代碼(.py)轉(zhuǎn)化為無(wú)需源代碼的可執(zhí)行文件窑眯。即:以可執(zhí)行文件的方式執(zhí)行一段程序屏积,從而可以在未安裝python IDLE和解釋器的電腦上運(yùn)行医窿。
需要將源程序編譯或者打包成一個(gè)直接可以執(zhí)行的程序。
PyInstaller是第三方庫(kù)
官方網(wǎng)站:
?????? http://http://www.pyinstaller.org/
第三方庫(kù):使用前需要額外安裝
安裝第三方庫(kù)需要使用pip工具(使用cmd)
使用cmd命令行
?????? pip
install pyinstaller
安裝需要連接互聯(lián)網(wǎng)
安裝pyInstaller庫(kù)后炊林,會(huì)生成一個(gè)pyInstaller程序(命令)姥卢,用于將源文件打包,生成可執(zhí)行文件渣聚。
使用命令行(cmd)独榴,因?yàn)閜yinstaller是命令行的執(zhí)行程序,而不是python下面的執(zhí)行指令奕枝。
?????? pyinstaller–F <文件名.py>