知識(shí)
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們?cè)谧非笃湟曈X(jué)表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營(yíng)銷(xiāo)的便利,運(yùn)營(yíng)的高效,讓網(wǎng)站成為營(yíng)銷(xiāo)工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏?jí)提供便捷的支持!
我要偷偷的學(xué)Python,然后驚呆所有人(第二天)
發(fā)表時(shí)間:2020-10-15
發(fā)布人:葵宇科技
瀏覽次數(shù):95
標(biāo)題無(wú)意冒犯,就是覺(jué)得這個(gè)廣告挺好玩的
上面這張思維導(dǎo)圖喜歡就拿走,反正我也學(xué)不了這么多
文章目錄
- 前言
- 編程學(xué)習(xí)的瓶頸
- 函數(shù)其實(shí)沒(méi)那么可怕
- 初始函數(shù)
- 定義一個(gè)函數(shù)
- 函數(shù)規(guī)則
- 示例2:
- 示例3:
- 示例4:
- 示例5:
- 全局變量和局部變量
- 函數(shù)小項(xiàng)目
- 物以 “類(lèi)” 聚
- 類(lèi)的創(chuàng)建
- 類(lèi)的實(shí)例化
- 類(lèi)的調(diào)用
- 類(lèi)的繼承
- 類(lèi)的多繼承
- 父類(lèi)函數(shù)重寫(xiě)
- 實(shí)戰(zhàn)小項(xiàng)目
前言
前期回顧:我要偷偷學(xué)Python,然后驚呆所有人(第一天)
上面這篇里面寫(xiě)了python的一些知識(shí)基礎(chǔ),從數(shù)據(jù)類(lèi)型到四則運(yùn)算,再到分支、循環(huán)。
那么今天,我們就看一下比較抽象的函數(shù)和類(lèi),如果對(duì)基礎(chǔ)還不是很熟練的話可以再扎實(shí)一下基礎(chǔ),畢竟萬(wàn)丈高樓平地起嘛,基礎(chǔ)不老實(shí)是很危險(xiǎn)的。
本系列文默認(rèn)各位有一定的C或C++基礎(chǔ),因?yàn)槲沂菍W(xué)了點(diǎn)C++的皮毛之后入手的Python,這里也要感謝齊鋒學(xué)長(zhǎng)送來(lái)的支持。
本系列文默認(rèn)各位會(huì)百度,會(huì)用在線編譯器,因?yàn)槲沂峭粨魧W(xué)Python的,之前的編譯環(huán)境都刪了,但是吧,我發(fā)現(xiàn)在線編譯是真的爽,浪費(fèi)那時(shí)間去搭那環(huán)境干啥,學(xué)好了Python,會(huì)差那點(diǎn)請(qǐng)人搭環(huán)境的錢(qián)嗎?
我要的不多,點(diǎn)個(gè)關(guān)注就好啦
然后呢,本系列的目錄嘛,說(shuō)實(shí)話我個(gè)人比較傾向于那兩本 Primer Plus,所以就跟著它們的目錄結(jié)構(gòu)吧。
本系列也會(huì)著重培養(yǎng)各位的自主動(dòng)手能力,畢竟我不可能把所有知識(shí)點(diǎn)都給你講到,所以自己解決需求的能力就尤為重要,所以我在文中埋得坑請(qǐng)不要把它們看成坑,那是我留給你們的鍛煉機(jī)會(huì),請(qǐng)各顯神通,自行解決。
好,接下來(lái)切入正題。
編程學(xué)習(xí)的瓶頸
先來(lái)聊點(diǎn)輕松的嘛,一上來(lái)就講那些佶屈聱牙的多沒(méi)意思啊。
不論大家是有基礎(chǔ),還是沒(méi)基礎(chǔ);是學(xué)過(guò)編程,還是學(xué)過(guò)數(shù)學(xué);多多少少都會(huì)遇上硬茬。比方說(shuō)我,在學(xué)習(xí)編程的路上遇到的第一個(gè)問(wèn)題就是函數(shù)傳參,哇靠,當(dāng)時(shí),我意氣風(fēng)發(fā),畢竟咱是C++考了九十分的人,要橫著走。但是到企業(yè)里面培訓(xùn)的第一天,老師給我們看了(講解)一段代碼的時(shí)候,整個(gè)人就給我整懵逼了,是一個(gè)結(jié)構(gòu)體作數(shù)據(jù)類(lèi)型的參數(shù),是一堆這樣的參數(shù)放在同一個(gè)函數(shù)里面。。。
然后在另一個(gè)地方,準(zhǔn)確的說(shuō)是另一個(gè)文件里面,調(diào)用這個(gè)函數(shù),當(dāng)時(shí)我聽(tīng)得一愣一愣的,連錄屏都忘了錄,等到我自己實(shí)操的時(shí)候。。。
傳什么?傳到哪里???暈死。。。
好啊,扯遠(yuǎn)了,大家可以在評(píng)論區(qū)打出自己遇到的瓶頸,說(shuō)不定你的苦思冥想,其他人早已有了解決方案。
一山放過(guò)一山攔啊,能看懂代碼只是基礎(chǔ)的第一步,你還要自己寫(xiě)。自己寫(xiě)的時(shí)候就容易遇上各種各樣的問(wèn)題了,第二道坎,就是debug。
說(shuō)多了都是淚,后面都會(huì)教大家這些技能,這篇我們先來(lái)看一下函數(shù)和類(lèi),后面再講分文件項(xiàng)目、Debug、基本的項(xiàng)目設(shè)計(jì)與架構(gòu)等東西,喜歡的話可以跟進(jìn)。
函數(shù)其實(shí)沒(méi)那么可怕
初始函數(shù)
函數(shù)是嗎?學(xué)過(guò)中學(xué)數(shù)學(xué)的都知道函數(shù)吧。
此函數(shù),非彼函數(shù)。
函數(shù)是組織好的,可重復(fù)使用的,用來(lái)實(shí)現(xiàn)單一,或相關(guān)聯(lián)功能的代碼段。
函數(shù)能提高應(yīng)用的模塊性,和代碼的重復(fù)利用率。你已經(jīng)知道Python提供了許多內(nèi)建函數(shù),比如print()。但你也可以自己創(chuàng)建函數(shù),這被叫做用戶(hù)自定義函數(shù)。
定義一個(gè)函數(shù)
一圖勝千言:
示例:
def math(x):
y = 3*x + 5
return y
這個(gè)函數(shù)用于實(shí)現(xiàn):y = 3x+5 的求值,這里的x就是參數(shù),別急,這里的規(guī)矩很多,聽(tīng)我慢慢講。
首先各位有沒(méi)有編譯器,碧如pycharm之類(lèi)的,沒(méi)有也沒(méi)關(guān)系,在線編譯器還是很多的,碧如“編程中國(guó)”,選擇Python編程。
把上面這一段先拿去編譯一下,運(yùn)行一下,不會(huì)運(yùn)行的朋友可以百度一下。
運(yùn)行之后你會(huì)發(fā)現(xiàn)根本沒(méi)什么東西嘛,這不是騙人嘛,對(duì),這不是騙人,咱又沒(méi)調(diào)用,自然沒(méi)東西。
函數(shù)規(guī)則
函數(shù)代碼塊以 def 關(guān)鍵詞開(kāi)頭,后接函數(shù)標(biāo)識(shí)符名稱(chēng)和圓括號(hào)(),括號(hào)后面要緊跟冒號(hào),不然會(huì)報(bào)錯(cuò)。def就相當(dāng)于告訴編譯器:我這里是一個(gè)函數(shù),你注意一下哈
任何傳入?yún)?shù)必須放在圓括號(hào)中間,關(guān)于這個(gè)參數(shù)的規(guī)矩嘛:
1、在調(diào)用函數(shù)時(shí),對(duì)函數(shù)進(jìn)行參數(shù)傳遞必須與函數(shù)聲明時(shí)的參數(shù)列表對(duì)應(yīng)。
2、函數(shù)聲明時(shí)可以聲明默認(rèn)參數(shù),在函數(shù)調(diào)用時(shí)如果沒(méi)有對(duì)默認(rèn)參數(shù)進(jìn)行傳值,這默認(rèn)參數(shù)使用預(yù)設(shè)值,默認(rèn)參數(shù)要放在參數(shù)列表最右側(cè)
3、函數(shù)外傳參的參數(shù)數(shù)據(jù)類(lèi)型須一一對(duì)應(yīng)(有些可以強(qiáng)轉(zhuǎn),碧如float轉(zhuǎn)int)
4、參數(shù)類(lèi)型多種多樣,并不局限于常見(jiàn)的int、float、str等參數(shù)類(lèi)型,也可以傳類(lèi)對(duì)象等
函數(shù)內(nèi)容以冒號(hào)起始,并且縮進(jìn)。
return [表達(dá)式] 結(jié)束函數(shù),選擇性地返回一個(gè)值給調(diào)用方。不帶表達(dá)式的return相當(dāng)于返回 None。
對(duì)于函數(shù)的調(diào)用,直接輸入函數(shù)名,并傳入?yún)?shù)(這里不考慮跨文件)
具體的,多看。
示例2:
# 定義函數(shù)
def printstr( str ):
"打印任何傳入的字符串"
print(str)
return
# 調(diào)用函數(shù)
printstr("我要調(diào)用用戶(hù)自定義函數(shù)!")
printstr("再次調(diào)用同一函數(shù)")
示例3:
def annimal(annimal1, annimal2):
print('Look,here is :' + annimal1)
print('Oh there is :' + annimal2)
menu('tiger','lion')
def action(action1,action2):
print('He is '+action1)
print('She is '+action2)
list('sleeping','running')
結(jié)果:
Look,here is tiger
Oh there is lion
He is sleeping
She is running
示例4:
默認(rèn)參數(shù)法:
def annimal(annimal1, annimal2, annimal3 = '貓'):
print('大型動(dòng)物:' + annimal1)
print('中型動(dòng)物:' + annimal2)
print('小型動(dòng)物:' + annimal3)
menu('大象','獵豹')
menu('鯨魚(yú)','馬','狗')
結(jié)果:
大型動(dòng)物:大象
中型動(dòng)物:獵豹
小型動(dòng)物:貓
大型動(dòng)物:鯨魚(yú)
中型動(dòng)物:貓
小型動(dòng)物:狗
示例5:
不定長(zhǎng)參數(shù)
它的格式比較特殊,是一個(gè)星號(hào)*加上參數(shù)名,它的返回值也比較特殊,我們來(lái)看看下面的例子。
def print_str(*str):
return str
order = print_str('Hello','World','!')
#括號(hào)里的這幾個(gè)值都會(huì)傳遞給參數(shù)str
print(order)
print(type(order))
結(jié)果:
你會(huì)發(fā)現(xiàn)函數(shù)返回的是這樣的結(jié)果:(‘Hello’, ‘World’, ‘!’),我們用type()函數(shù)可以知道這種數(shù)據(jù)類(lèi)型叫作元組(tuple)
和列表一樣,元組是可迭代對(duì)象,這意味著我們可以用for循環(huán)來(lái)遍歷它,這時(shí)候的代碼就可以寫(xiě)成:
def menu(*barbeque):
for i in barbeque:
print('一份烤串:' + i)
menu('烤香腸', '烤肉丸')
menu('烤雞翅', '烤茄子', '烤玉米')
# 不定長(zhǎng)參數(shù)可以接收任意數(shù)量的值
一份烤串:烤香腸
一份烤串:烤肉丸
一份烤串:烤雞翅
一份烤串:烤茄子
一份烤串:烤玉米
全局變量和局部變量
定義在函數(shù)內(nèi)部的變量擁有一個(gè)局部作用域,定義在函數(shù)外的擁有全局作用域。
局部變量只能在其被聲明的函數(shù)內(nèi)部訪問(wèn),而全局變量可以在整個(gè)程序范圍內(nèi)訪問(wèn)。調(diào)用函數(shù)時(shí),所有在函數(shù)內(nèi)聲明的變量名稱(chēng)都將被加入到作用域中。
total = 0 # 這是一個(gè)全局變量
# 可寫(xiě)函數(shù)說(shuō)明
def sum( arg1, arg2 ):
#返回2個(gè)參數(shù)的和."
total = arg1 + arg2 # total在這里是局部變量.
print("函數(shù)內(nèi)是局部變量 : ", total)
return total
#調(diào)用sum函數(shù)
sum( 10, 20 )
print("函數(shù)外是全局變量 : ", total)
輸出結(jié)果:
函數(shù)內(nèi)是局部變量 : 30
函數(shù)外是全局變量 : 0
我再想想還差些啥哈。
哦,多函數(shù)嵌套。
就像俄羅斯套娃一樣,一個(gè)函數(shù)中還能有另一個(gè)函數(shù)。
其實(shí)這個(gè)很好理解,想想print,它就是個(gè)函數(shù),前面不就經(jīng)常把print放在別的函數(shù)里面使用了嘛。
函數(shù)小項(xiàng)目
寫(xiě)一個(gè)小型計(jì)算器,支持四則運(yùn)算,不帶括號(hào),帶括號(hào)的太難了吧。
物以 “類(lèi)” 聚
什么是類(lèi)?什么是對(duì)象?
現(xiàn)在的高級(jí)編程語(yǔ)言吧,它都有一個(gè)門(mén)檻,就是你得是面向?qū)ο缶幊痰?#xff0c;而面向?qū)ο缶幊?#xff0c;你要有類(lèi)的支持。
那么什么是面向?qū)ο缶幊棠?#xff1f;就是描述一類(lèi)事務(wù)的特征與功能,就比方說(shuō)人類(lèi),那么對(duì)象就是人,人類(lèi)這個(gè)類(lèi)當(dāng)中就要實(shí)現(xiàn)人的特征和功能。
特征:
沒(méi)什么毛
兩個(gè)肩膀扛一個(gè)腦袋
等等
技能:
直立行走
使用火
能寫(xiě)字
等等
是吧,將這些特征和技能集合在一起中,就是人類(lèi)。
再講兩個(gè)概念,對(duì)象和實(shí)例:
對(duì)象是什么呢,就是你要構(gòu)造的這個(gè)類(lèi),是以什么為模型構(gòu)造的,拿上面那個(gè)人類(lèi)的例子來(lái)說(shuō),可以理解為女?huà)z捏人時(shí)的模子,女?huà)z在面對(duì)‘人’這個(gè)對(duì)象捏土。
實(shí)例是什么呢?就是通過(guò)這個(gè)類(lèi)構(gòu)造出來(lái)的,具有類(lèi)的一切特征和功能的玩意兒,可以理解為女?huà)z捏出來(lái)的一個(gè)個(gè)實(shí)實(shí)在在的人。
類(lèi)的創(chuàng)建
看圖說(shuō)話,一圖勝千言。
類(lèi)的實(shí)例化
類(lèi)的調(diào)用
來(lái),整理一下一條龍服務(wù):
創(chuàng)建一個(gè)人類(lèi),他有兩條腿,他能跑能跳,怎么寫(xiě)?這么寫(xiě):
class People:
leg = 2
def run(self):
print('他是一個(gè)人,他能跑')
def jump(self):
print('He is a man,he can jump')
lihua = People()
lihua.run()
好,這里面還有點(diǎn)沒(méi)講清楚的,碧如說(shuō)那個(gè)‘self’,到底是干嘛的。
- self,顧名思義嘛。好,我們直接看怎么用。
class People:
leg = 2
def run(self):
print('他是一個(gè)人,他有%d條腿,所以他能跑',self.leg)
def jump(self):
print('He is a man,he can jump because of his %d legs',legs)
lihua = People()
lihua.run()
如果要在類(lèi)的外部調(diào)用類(lèi)屬性,我們得先創(chuàng)建一個(gè)實(shí)例,再用實(shí)例名.屬性的格式調(diào)用,
那么如果想在類(lèi)的內(nèi)部調(diào)用類(lèi)屬性,而實(shí)例又還沒(méi)創(chuàng)建之前,我們就需要有個(gè)變量先代替實(shí)例接收數(shù)據(jù),這個(gè)變量就是參數(shù)self。
self的作用相當(dāng)于先給實(shí)例占了個(gè)位置,等到實(shí)例創(chuàng)建好就“功成身退,退位讓賢”。
同理,如果想在類(lèi)的方法內(nèi)部調(diào)用其他方法時(shí),我們也需要用到self來(lái)代表實(shí)例。
- 初始化方法
在C++中,有類(lèi)的初始化,那Python的類(lèi)里面肯定也是會(huì)有的啊。那我們來(lái)看一下栗子:
定義初始化方法的格式是def init(self),是由init加左右兩邊的【雙】下劃線組成( initialize “初始化”的縮寫(xiě))。
初始化方法的作用在于:當(dāng)每個(gè)實(shí)例對(duì)象創(chuàng)建時(shí),該方法內(nèi)的代碼無(wú)須調(diào)用就會(huì)自動(dòng)運(yùn)行。
class People:
def __init__(self):
print('恭喜你,你造了個(gè)人')
lihua1 = People()
這是一種,再來(lái)一種
class People:
def __init__(self,num):
self.num = num
def born()
print('恭喜你,你獲得了'+self.num+'個(gè)好朋友')
lihua2 = People(2)
lihua2.born()
分水嶺,難度再拔高
類(lèi)的繼承
什么是繼承,在C++里面繼承還是很好玩的,就像你的父親是一個(gè)類(lèi),你繼承了你父親的一些特征與技能,也可以有自己的技能,這就是繼承。
然后我們來(lái)實(shí)現(xiàn)一下上面所說(shuō)的:
class Father:
skin = 'yellow'
def clever():
print('他是個(gè)聰明人')
class Son(Father):
def strugle():
print('他很努力')
lihua = Son()
lihua.clever()
print(lihua.skin)
lihua.strucle()
類(lèi)的多繼承
一個(gè)類(lèi),可以同時(shí)繼承多個(gè)類(lèi),語(yǔ)法為class A(B,C,D):
這里各位可以自己實(shí)現(xiàn)一下一個(gè)人,繼承了自己父母親雙方的優(yōu)點(diǎn),比如說(shuō)父親聰明,母親好看,他又聰明又好看,還上進(jìn)。
小tip:就近原則:越靠近子類(lèi)(即越靠左)的父類(lèi),越親近,越優(yōu)先考慮。子類(lèi)調(diào)用屬性和方法時(shí),會(huì)先在靠左的父類(lèi)里找,找不到才往右找。
多學(xué)一點(diǎn):
父類(lèi)函數(shù)重寫(xiě)
重寫(xiě)代碼,是在子類(lèi)中,對(duì)父類(lèi)代碼的修改。
簡(jiǎn)單的舉個(gè)栗子,其實(shí)這個(gè)還是很重要的一點(diǎn):
class Father:
skin = 'yellow'
def clever():
print('他的智商100')
class Son(Father):
def clever():
print('他的智商110')
def strugle():
print('他很努力')
lihua = Son()
lihua.clever()
實(shí)戰(zhàn)小項(xiàng)目
這里,我們來(lái)實(shí)現(xiàn)一個(gè)家族傳承的小故事,來(lái)鞏固一下我們今天學(xué)習(xí)的東西:
他本家境優(yōu)渥,他的太爺爺白手做紗布生意白手起家,到了他爺爺這一代,生意進(jìn)一步擴(kuò)大,新增了藥店生意、錢(qián)莊生意,到了他父親這一代,倭寇入侵,時(shí)局動(dòng)蕩,百姓流離,于是他的父親毅然決定開(kāi)棚賑粥,開(kāi)鋪放藥,就這么堅(jiān)持了幾年之后,終于散盡家財(cái),但是他們無(wú)怨無(wú)悔。國(guó)破山河在?
到了他這一代,響應(yīng)國(guó)家中華民族偉大復(fù)興的口號(hào),他苦練技術(shù),期待著有一天能重整家族的輝煌···
哎,后續(xù)各位自己編,我們來(lái)實(shí)現(xiàn)四個(gè)類(lèi):他太爺爺,他爺爺,他爸,他。把這一條故事線串一串。
加油!!
持續(xù)更新中,喜歡的可以跟進(jìn)哦
相關(guān)案例查看更多
相關(guān)閱讀
- 汽車(chē)回收系統(tǒng)
- 保險(xiǎn)網(wǎng)站建設(shè)公司
- 網(wǎng)站上首頁(yè)
- 網(wǎng)站建設(shè)首選
- 正規(guī)網(wǎng)站建設(shè)公司
- 云南科技公司
- 云南網(wǎng)站建設(shè)一條龍
- 前端
- 云南網(wǎng)站建設(shè)高手
- 迪慶小程序開(kāi)發(fā)
- 云南網(wǎng)站建設(shè)列表網(wǎng)
- 汽車(chē)報(bào)廢軟件
- 云南小程序代建
- 網(wǎng)站搭建
- 排名
- 云南電商網(wǎng)站建設(shè)
- 跳轉(zhuǎn)小程序
- web前端
- 汽車(chē)拆解系統(tǒng)
- 網(wǎng)站建設(shè)案例
- 軟件定制公司
- 前端開(kāi)發(fā)
- 網(wǎng)站制作
- 昆明軟件公司
- 云南網(wǎng)頁(yè)制作
- 云南網(wǎng)站建設(shè)首頁(yè)
- 小程序商城
- 小程序用戶(hù)登錄
- 云南網(wǎng)站建設(shè)制作
- 智慧農(nóng)貿(mào)市場(chǎng)