什麼是code?
code就就是一種「語言」,一種計算機能讀懂的語言。計算機是一個傻瓜,他了解不了任何模棱兩可的東西。比如,你讓你老公去買個西瓜,你老公會自己決定去哪裡買,買幾個,找個搞活動打折的買,總之,你給他錢,他就給你買回來讓你吃到爽的西瓜。
但是,你想讓計算機買一個西瓜?你要告訴他:去門口的鮮豐水果店買,買沙瓤無籽西瓜,若旁邊的店打折,就去旁邊的店買。總之,你不能讓計算機做任何決定,你要清楚的告訴他所有情況下的所有的行為。而「code,就是你和計算機交流的語言,或者說是對計算機的指令」。
我們就「把計算機了解為一個人」,這個人很死闆,隻能按照你給他的詳細指令進行工作。而這個人工作速度特别特别快,并且保證工作結果都是正确的。
程式設計語言其實不重要,重要的是要「明白如何和計算機交流」,明白了這個也就能看懂代碼了。
程式設計 = 算法 + 資料結構
Python就是一種和計算機交流的語言,這種語言單詞(關鍵字)不多,規則也少。下面所有的内容都基于Python。
1 判斷
當你指令計算機做一件事情的時候,這件事情可能分一些情況進行處理。判斷通常涉及到的關鍵字有:
if , else, elseif, and, or,<, >,=,<=,>=,==
比如,你讓計算機買西瓜,希望買到打折的西瓜,不打折的話你就不吃了。
if 水果店打折:
買西瓜
else:
不買了
通過這個指令,計算機變得更智能了一些,他可以根據情況執行你的指令。
水果店不打折你就吃不到西瓜,你不開心。那麼,我們讓計算機更智能一些。假如西瓜打折,就買西瓜;不打折的話讓計算機跟老闆講價,老闆同意打折,就買西瓜;不同意,不吃了;
if 水果店打折:
買西瓜
else:
與老闆講價
if 講價成功:
買西瓜
else:
不吃了。
雖然和老闆講價一般都能講成功,但是有的老闆給力給打五折,有的老闆隻給打九折。你就想了,若老闆打五折,我就買兩個,今天吃一個,明天吃一個。若老闆不給力,打折不到五折,就買一個,今天先吃,明天再說。
if 水果店打折:
買西瓜
else:
與老闆講價
if 打折成功 and 打折力度<=5:
買兩個西瓜
elseif 打折成功 and 打折力度 > 5:
買一個西瓜
else:
不吃了。
此外,有沒有發現,打折成功這段代碼其實也可以寫成:
if 打折成功:
if 打折力度<=5:
買兩個西瓜
else:
買一個西瓜
else:
不吃了。
由此可見,計算機也不是完全的一成不變,隻要你給他的指令他能了解并且不會模棱兩可,他都可以完成工作。
and
的意思代表且,
or
的意思代表或。
and
和
or
的順序不同,結果也不同,可以通過括号來說明判斷條件的優先級。
a==b
是比較a和b是否相等的意思,而=代表指派。指派的含義,我在下面的變量章節介紹。
2 循環
Python中涉及到循環的關鍵字包括:
for…in… ,while,break,continue
上面的例子我們已經讓電腦成功地根據不同的情況去水果店買西瓜了,但是若老闆不打折,你就吃不到西瓜了。這時,你就想了,咱們小區門口有三家水果店,分别是鮮豐水果、四季水果和路邊攤,一家不打折不代表三家都不打折啊,是以你希望電腦可以去三家都去看看,挑一家打折的店買西瓜。
for 水果店 in (鮮豐水果、四季水果和路邊攤):
if 水果店 打折:
買西瓜
break(循環結束)
else:
啥都不做
帶西瓜回家
循環的意義在于,可以用電腦對不同的對象執行相同的指令。
介紹下
break
,break的意思就是結束循環。比如,這段代碼中的break表示,我們一旦買了西瓜,那麼就帶西瓜回家。
3 變量
現在是時候介紹「變量」這個重要的東西了。
我們依然把電腦了解為幫我們工作的一個人,那麼作為一個人,他需要有記憶力,而我們就可以通過變量去控制、利用計算機的記憶力。
變量可以了解為計算機的一個記憶單元,計算機擁有極好的記憶力,是以,可以随心所欲的使用,用完了就扔,需要了就要。(當然,說随心所欲是不嚴謹的,但是你可以了解為随心所欲)
那為什麼叫變量呢,就是因為可以改變。為什麼要改變呢?比如我們都有自己的年齡,我今年18,明年就19了。是以,’年齡’在我的記憶裡是每年改變的。
變量對應的一個東西叫常量,在我的記憶力,我的老婆是江江同學。而這個’老婆’這個記憶單元在我的腦子裡是不會變的,她永遠都是江江同學。常量你現在可以不用了解,我寫主要是為了秀恩愛。
現在,計算機又要去買西瓜了。不過這次,你希望計算機可以在三個水果店中,找到一個打折力度最大的水果店去買水果。
之前所有水果店的最大折扣 = None
之前給最大折扣的水果店 = None
for 水果店 in (鮮豐水果、四季水果和路邊攤):
目前水果店折扣 = 老闆給的折扣
if 目前水果店折扣 < 之前所有水果店的最大折扣:#4折比5折力度大
之前所有水果店的最大折扣 = 目前水果店折扣
之前給最大折扣的水果店 = 水果店
去 之前給最大折扣的水果店 買一個西瓜
以上有以下幾個記憶單元:
- 之前所有水果店的最大折扣
- 之前給最大折扣的水果店
- 目前水果店折扣
- 水果店 注意,
,a也是一個變量,他在每次執行的時候都是b中的目前執行的一個元素。for a in b
這裡需要介紹一些概念:
-
在Python中表示空,表示這個記憶單元現在啥都沒有。比如在我情窦初開時,腦海中就已經有了情人這個記憶單元,我一直在尋找,但遇到你之前一直沒有找到,是以那段時間這個記憶單元裡面一直是空。None
- 指派符号:
。注意,在計算機語言裡面,一個’=
’号表示指派,兩個等号’=
’表示比較前後元素。指派的意思是,把後面的元素,放到前面的變量裡面。==
4 函數
看懂以上幾節,大概應該明白計算機如何執行代碼的了。
而函數和子產品,和之前的介紹不太一樣。之前是介紹如何讓計算機工作,是面向計算機的。而這一節,是面向人的,是如何讓我們寫給計算機的代碼看起來更加簡潔、明了。函數和子產品都是對代碼結構的優化,否則一個稍微大點的項目,一大坨代碼,計算機看得懂人看不懂,不利于管理和交流。
首先說函數。函數是一系列代碼的集合,用函數一般是有幾個原因:1.給一段代碼起個名字。2.這段代碼和使用它的代碼關系不大,是以可以抽出來,抽出來後代碼更簡潔。關系不大的意思就是:使用函數的代碼通過傳給函數幾個參數,函數就可以執行。3.代碼集合起來就可以在代碼的不同地方使用。
依然我們去買西瓜,不過我們希望電腦可以今天買完西瓜明天再買一個。按照之前的方式,這個邏輯應該寫成這樣:
for 水果店 in (鮮豐水果、四季水果和路邊攤):
if 水果店打折:
買西瓜
else:
與老闆講價
if 打折成功 and 打折力度<=5:
買兩個西瓜
elseif 打折成功 and 打折力度 > 5:
買一個西瓜
else:
不吃了。
休息一天。
for 水果店 in (鮮豐水果、四季水果和路邊攤):
if 水果店打折:
買西瓜
else:
與老闆講價
if 打折成功 and 打折力度<=5:
買兩個西瓜
elseif 打折成功 and 打折力度 > 5:
買一個西瓜
else:
不吃了。
上面的代碼可以實作我們的要求,但是買西瓜的代碼其實是重複的,對于重複代碼,管理起來比較麻煩,比如你想改一點,那麼就要去各個地方都改一次。
那麼,我們把買西瓜的代碼弄成一個函數,代碼就可以整理為:
def 買西瓜_函數():
for 水果店 in (鮮豐水果、四季水果和路邊攤):
if 水果店打折:
買西瓜
else:
與老闆講價
if 打折成功 and 打折力度<=5:
買兩個西瓜
elseif 打折成功 and 打折力度 > 5:
買一個西瓜
else:
不吃了。
買西瓜_函數()
休息一天。
買西瓜_函數()
這一次,代碼整潔多了,而且,我們每次想修改買西瓜的代碼,都隻需要改這個函數一處代碼都可以。
在python中,使用
def function_name():
定義函數,函數下面所有的縮進都屬于這個函數,叫函數體。
使用
function_name()
調用函數。
函數參數
現在你又不滿足于電腦隻會買西瓜了,你又想吃柚子。怎麼辦呢,那麼是不是我們又要寫一個買柚子的函數呢。
當然可以再寫一個買柚子函數,但是買柚子函數的邏輯和買西瓜函數的邏輯都是一樣的,指令也一樣,唯一的差別就是之前是賣西瓜,現在是買柚子。如果再寫一個類似的買柚子函數,那麼又出現剛才說的問題,每次修改買水果的邏輯,都需要同時去修改買西瓜、買柚子函數,如果柚子吃膩了,又要買香蕉、蘋果、梨,豈不是要寫非常多的函數?
為了解決這個問題,其實有一個更好的方法,就是使用函數參數。
由于我們買水果(無論是西瓜、還是柚子)的功能都是一樣的,是以我們可以寫一個買水果函數,買水果函數定義了買一個水果的流程,當我們使用這個函數的時候,我們隻要告訴這個函數我們要買什麼水果,函數就可以根據你告訴他的水果名,去買對應的水果。
買水果函數的代碼如下:
def 買水果函數(水果名):
for 水果店 in (鮮豐水果、四季水果和路邊攤):
if 水果店打折:
買[水果名]
else:
與老闆講價
if 打折成功 and 打折力度<=5:
買兩個[水果名]
elseif 打折成功 and 打折力度 > 5:
買一個[水果名]
else:
不吃了。
買水果函數(西瓜)#讓電腦去買西瓜
買水果函數(柚子)#讓電腦去買柚子
在Python中想使用函數參數,隻需要在函數定義的時候,在括号裡面加上參數即可,我們這裡的參數就是「水果名」。在函數體中代碼可以使用函數參數。
在調用函數的時候,把一個變量或者常量寫在函數名後面的括号裡面,傳給函數。
注意,若是存在多個參數,函數定義和調用函數的參數順序一定要一緻。
在Python中,還存在預設參數、關鍵字參數等稍微進階一點的使用方式,舉個例子,不詳細說明了。
def sum(a, b = 0,c = 1):#b/c是預設參數
return a+b+c
func(1,0,1)
func(1)
func(1,c=1)
這三個func調用的結果都是一樣的。
5 子產品
剛才我們已經講了函數,函數就是把代碼整合起來。而子產品,就是把更多代碼整合起來。
子產品和函數的引入是為了解決類似的問題:管理代碼段,并且給他們起一個名字。
一般來說,一把子產品就是一個py檔案,裡面可能包括很多函數,也可以包括一些類的定義(這個我們後面講哦)。
子產品的引入就是為了将代碼更好地管理。
我們把代碼放在一個py檔案中,這個py檔案就是一個子產品,在其他py檔案裡面,我們就可以使用import關鍵字,将子產品引入。
比如,我們現在有一個
a.py
檔案,裡面有一些函數,比如
buy_xigua
,
buy_youzi
等,若我們想在b檔案中使用這些函數,那麼我們必須在使用前,導入a子產品。
導入一個子產品并使用子產品裡面的函數有很多方法,我把常見的方法列在下面.
方法一:
import a
a.buy_xigua()
a.buy_youzi()
這種方法導入子產品a,然後通過子產品.函數調用函數。
方法二:
from a import *
buy_xigua()
buy_youzi()
這個方式導入子產品a中的所有内容,可以直接使用。
方法三:
from a import buy_xigua,buy_youzi
buy_xigua()
buy_youzi()
這個方式導入子產品a中的指定内容,可以直接使用,一般這種方法在軟體開發過程中使用的比較多,原因是我們隻把需要的内容導入使用,不需要的不導入。(按需使用别浪費,在哪裡都是個好習慣,深層原因超出教程範圍)
6 類和對象
類和對象的概念,對于沒有接觸過程式設計的同學來說,可能稍微有些不好了解。我記得當年第一次接觸這個概念,也迷糊了段時間。
之前,我們介紹過‘變量’。變量的引入,是為了描述程式内的記憶單元。一個變量可以是一個數字,也可以是一個字元串(比如設定一個變量 名字='水風')。
但是,有些東西需要使用很多變量共同描述才可以。比如,一個買西瓜的人。買西瓜的人有很多特征,比如:名字、存款,持有西瓜數量。此外,買西瓜的人也有一些行為,比如買西瓜這個行為。為了實作買西瓜的人這個功能,我們引入類和對象的概念。注意,類/對象引入想解決的問題和函數、子產品所解決的問題不一樣。函數和子產品的引入更多的是為了管理代碼,而類/對象的引入是為了把狀态和行為封裝在一起。
那麼,類和對象分别是什麼意思呢。類是我們定義的一種東西有哪些狀态和行為,比如買西瓜的人有狀态和行為,我們提前定義好他們,類的概念是一種虛拟的。而對象就是代碼在執行的過程中,去動态建立、生成的一個實體。
比如買西瓜的人,我們之前寫了買西瓜的流程,現在我們想建立兩個買西瓜的人,每人負責一天,這樣買西瓜的人也可以休息了。
以上就是通過“買西瓜”這件事對python中一些概念的解讀。你聽懂了嗎?