該系列文章:javascript
學一門編程語言正在變得愈來愈容易,只要念太高中(甚至是初中、小學),能熟練聊qq和懂得一點點office軟件的人,入門一門編程語言都不在話下。咱們跟別人溝通,靠的是語言,不管是說出來仍是寫出來,也無論是普通話仍是英語。那麼想要跟計算機溝通,也須要靠語言,世界上如今有不少跟計算機溝通的語言,有c,jave,javascript,php,python……這些都是編程語言,它們跟咱們與別人交流的語言有何不一樣呢?咱們與別人交流的語言是天然造成的,而編程語言是由某我的或者某幾我的編寫出來的。天然造成的咱們稱爲天然語言,編程語言則屬於人工語言。天然語言的語法較爲鬆散,自由,既能夠用來解決問題,也能夠抒發感情、講述故事。而計算機最初被設計的時候是用來解決各類現實生活中的問題的,因此邏輯嚴謹,說一是一,那麼跟計算機溝通的時候也須要邏輯嚴謹,不容含糊,語法嚴格,這大概就是不少人以爲編程困難的地方吧。但沒關係,一旦咱們習慣了這種嚴謹的語法和思考方式,將會大大提升咱們解決問題的效率和正確率。php
計算機使用的是二進制,經過接受到的指令執行任務,最初人們經過彙編語言(assembly language,低級語言)來與計算機溝通,告訴cpu執行什麼樣的指令,但是各個不一樣的計算機系統結構都各自有不一樣的彙編(assembly),而且用匯編編寫程序效率低下(畢竟彙編更偏向於跟計算機溝通),因此對人類友好的高級編程語言應運而生(好比c語言),人們經過編譯程序(充當了一個翻譯家的角色)把高級編程語言編譯成計算機能夠理解的機器代碼。這時候編程已經變得比以前容易了,然而更加高級的現代編程語言不斷產生,使得編程的入門門檻進一步下降,python就是其中一門現代編程語言。html
python是一種解釋型語言,也就是說用python編寫好的程序不須要提早編譯,而是在運行時由解釋器一行一行地把python源代碼翻譯成cpu能夠讀懂的機器代碼。要運行python程序,須要從python官網下載python軟件,安裝到本身的電腦上。從官網下載下來的python軟件中帶有CPython,這是用c語言寫成的python解釋器,咱們在命令行下運行用python編寫的程序時,就是在用CPython這個解釋器來翻譯程序。世界上還有其餘各類python解釋器,好比Jython(運行在Java平臺上的Python解釋器,能夠直接把Python代碼編譯成Java字節碼執行),但CPython的使用是最普遍的。通過多年發展,python最新版本(截止寫做這篇文章之時)已是3.7了,如今主要有兩個大的不一樣版本的python,一個是python2.x.x,另外一個是python3.x.x,這兩個版本在實際使用中會有些微的不一樣,此次咱們用python3.x.x來介紹編程中的基本概念。java
linux和mac通常都自帶python2。python
某些最新版本的linux發行版可能也自帶python3,若是沒有,請參考這裏來安裝使用。linux
最新版本的mac通常都自帶python3,若是沒有,請參考這裏來安裝使用。git
Windows系統能夠從www.python.org/downloads/下載python軟件(解釋器),下載最新版python3.x.x。安裝的時候勾選Add Python 3.x to PATH。這樣就自動設置好了python的環境變量(環境變量就是設置python程序的相關路徑,讓Windows能夠找到python程序的安裝目錄)。 github
python編程有命令行和圖形界面( 好比IDLE )兩種方式,下面使用命令行方式,經過命令行運行python程序,一般還須要一個文本編輯器來編寫python程序文件(這種程序文件被稱爲源代碼)。文本編輯器在Windows下可使用notepad++,也可使用Sublime Text(它是跨平臺的,也能夠在Linux和mac下使用),還可使用Visual Studio Code(它也是跨平臺的),能夠在網上搜索這些編輯器的安裝使用教程。編程
與python解釋器打交道的方式有兩種: 第一個就是python交互模式。在linux下,終端輸入python默認爲python2.x.x,輸入python3則爲python3.x.x。咱們輸入python3來使用python3.x.x,輸入python3後就進入了python3交互模式:windows
Python 3.5.2 (default, Nov 23 2017, 16:37:01)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
複製代碼
在windows系統下,須要在cmd(命令提示符)下輸入python進入,若是不知道cmd(命令提示符)是什麼,能夠參考這裏。
「>>>」是python交互模式的提示符(提示你能夠在它後面輸入東西),因此咱們在「>>>」後面輸入python語句,輸完後點擊回車,則python語句當即執行,並打印出執行結果。若是要退出python交互模式,輸入exit()就能夠了。
第二個則是用python運行python源代碼。 打開你熟悉的文本編輯器,編寫程序,在保存文件時將文件名以.py
爲後綴(文件擴展名,能夠起到指定文件類型的做用)。而後在該文件所在目錄打開命令行,比方說該文件叫filename.py,則輸入python filename.py
,點擊回車,運行該文件中的程序。
咱們編寫程序的時候,要在英文輸入法下輸入各類符號,否則程序會報錯。像下面這樣,我故意在中文輸入法下輸入雙引號,出現了「SyntaxError」錯誤:
>>> 「李」
File "<stdin>", line 1
「李」
^
SyntaxError: invalid character in identifier
>>>
複製代碼
咱們能夠把python交互模式直接看作一個命令行的計算器來使用,好比輸入4+5
點擊回車,python交互模式下就會顯示計算結果。
>>> 4+5
9
>>>
複製代碼
能夠嘗試在交互模式下進行不一樣的計算,「+」表示加法,「-」表示減法,「*」表示乘法,「/」表示除法。
>>> 5*6
30
>>>2/3
0.6666666666666666
>>>
複製代碼
「%」表示除餘,就是說結果會返回一個數被另外一個數整除除不盡時的餘數:
>>> 9%2
1
>>> 0%2
0
>>> 1%2
1
>>> 2%2
0
>>> 3%2
1
>>>
複製代碼
「**」表示冪運算,好比輸入4**2
則表示4的二次方:
>>> 4**2
16
>>>
複製代碼
「//」表示一種特殊除法,結果返回商的整數部分(向下取整),好比9//5
,9除以5爲1.8,那麼9//5
的結果就取了1.8的整數部分:
>>> 9//5
1
>>>
複製代碼
「+」,「-」,「*」,「/」,「%」,「**」,「//」這些符號代表了應該怎麼樣來操做這些符號以前和以後的兩個數字,好比,4+5就說明了須要把4和5加起來,因此這些符號就叫操做符。而像4+5
這樣操做某些數的式子,叫作表達式,4+5
這個表達式是比較簡單的,(4+5)/2
這個表達式就複雜了一些,一般把一個數字自己也叫作表達式。
若是咱們想計算一個複雜一點的表達式,好比(5/6)+((4/(4+5))*((3/2)-8))
,因爲它的計算過程相對複雜,所以很難理解這個式子具體作了什麼樣的操做。這時候咱們想要看懂這個表達式所表達的意義,就但願可以拆分它,經過給計算過程當中的某些中間結果一些「名稱」就能夠拆分紅不少步了。好比(4+5)/2
,咱們首先給4+5
起一個「名稱」,就叫作a吧。如今咱們就能夠把(4+5)/2
拆分紅兩步:
a是4+5的「名稱」 #第一步
a/2 #第二步
複製代碼
像上面這樣子寫的東西叫作僞代碼(Pseudocode),能夠經過僞代碼來大體描述一個程序的計算流程跟步驟,在這個僞代碼中,第一行代碼會首先運行,第二行代碼會在第一行代碼運行完成後運行,其實在真正的源代碼文件中,代碼也是如此運行的,從文件第一行開始,自上而下,逐行運行,直到最後一行代碼被運行完。「#」後面跟的文字包括「#」是代碼中的註釋,編譯器或者解釋器會忽略掉這部份內容,寫註釋是爲了增長程序的可讀性,當時寫的程序極可能做者會明白程序表達的東西,可是過一兩個月可能就會連做者本身都不知道,因此爲了給做者本身或者別人閱讀源代碼提供便利,要儘可能在註釋裏解釋介紹程序的做用或者思路。
在計算機術語中,給某個計算過程的某些中間結果起的「名稱」就是變量(variable)。該用什麼符號來表示變量呢,各類編程語言給咱們的自由度很是高,除了避開編程語言中保留的某些關鍵符號(關鍵字)和一些會與其餘東西產生混淆的符號,並注意不能把數字放在變量名中的第一個位置(例如「0a」就是一個不合法的變量名),咱們可使用任何字母、標點符號、數字的組合(中文和中文標點除外),爲了代碼的可讀性,儘可能使用具備描述性的單詞,好比user,id,phone_numbers……等。咱們編寫的程序可能會很長很長(程序很複雜),好比說可能會有1000行,那麼經過各類變量,咱們一步步的計錄下程序運行過程當中所得出的一些結果,再把這些結果提供給後面的程序,直到得出最終結果。在程序的世界裏,給變量賦值的符號是「=」(不一樣於數學中這個符號的用法),上面的僞代碼在python程序中能夠實現以下:
a=4+5 #變量a獲得4+5的值
a/2 #(4+5)/2的值
複製代碼
這是兩行python代碼,你把它複製到python交互模式的提示符中點擊回車,獲得以下結果:
>>> a=4+5 #變量a獲得4+5的值
>>> a/2 #(4+5)/2的值
4.5
>>>
複製代碼
可是你將它複製到一個文件中,並把文件名改成example.py,而後在python命令行模式下輸入python example.py
(在linux下,要使用python3就得輸入python3 example.py
),點擊回車,程序不會顯示任何結果:
咱們已經知道了什麼是變量,並知道如何給變量賦值。一個變量呢,就像一個空盒子,賦值就是給盒子裏塞東西。塞進去的是4
那該變量就表示4
,塞進去的是4+5
那該變量就表示4+5
的值。因此,給變量進行屢次賦值是容許的,只不過在變量再次被賦值時,上次賦的值就被抹去了。咱們要用到一個變量的時候,必須先聲明這個變量。第一次給剛聲明的變量賦值叫作初始化一個變量。在python中,聲明變量跟初始化變量是一步完成的,就是給出變量名並賦一個值給它:
#該變量名第一次出現,因此下面的語句
#是聲明和初始化了該變量
a=7
複製代碼
如今咱們須要擴展下咱們的認知,計算機程序中的變量不光能夠表示數字表達式(例如4+5)的值,還能夠記錄、存儲一些文字內容,好比這句英文:life is but a dream.這種文字性的內容咱們能夠看作是一串字符的序列(有順序的一串符號,想象用一條線串起不一樣的符號,符號的位置是固定的),這種序列稱爲字符串。在python中,用雙引號""或者單引號''來圈住字符串,也能夠說是用""或者''來表示引號中間的內容就是字符串。下面舉幾個例子:
#給變量str1賦值,值的內容是字符串"life is but a dream"
str1="life is but a dream"
#給變量str1繼續賦值,任何符號均可以成爲字符串,包括數字以及空格
str1='12'
str1=' '
#字符串能夠用「+」串聯起來
str1="life is but a dream"+"12"
str2="hello"+str1
str3=str1+str2
#給變量number1賦值,值的內容是數字12,給某個變量賦予數值直接寫上數值
number1=12
#給變量number1再次賦值
number1=37
複製代碼
在python中,變量能夠表示任何東西,一個變量能夠屢次賦予不一樣類型的值:
a=5
a="5"
a='string'
複製代碼
一個編程語言有了這種特性,咱們就能夠說這個編程語言是動態類型語言(動態語言),很顯然,python是動態類型語言(動態語言)。
在一些更爲傳統的編程語言裏,存儲數字的變量跟存儲字符串的變量是有區別的,存儲數字的變量不能把字符串賦值給它,存儲字符串的不能把數字賦值給它,須要變量的時候首先要經過編程語言裏的標識符(編程語言裏保留的一些代表變量的值的類型的字符)來代表這個變量是要存儲什麼的,而後隔個空格跟上變量名稱,這叫作聲明一個變量,例如在c語言中,聲明一個整數類型的變量能夠這樣作:
int a; //聲明一個int變量
a=3; //初始化變量,a是int變量,因此賦值的時候只能是整數
a="3" //這在c語言中是不容許的
複製代碼
像這種聲明變量時須要指定類型(而且一旦指定類型,賦值的時候只能賦予與變量類型符合的值)的編程語言被稱爲靜態類型語言(靜態語言)。通常的,變量裏存儲數字時能夠分爲整數(int),浮點數(float),整數(int)的概念咱們在數學裏學過,那麼浮點數(float)究竟是什麼呢,其實咱們在數學裏也是學過的,那就是小數(有小數點的數)。在計算機裏,浮點數跟整數的存儲方式不一樣,因此有必要分清二者的概念。
#把一個整數賦值給變量
number1=123
#把一個浮點數二次賦值給同一個變量
number1=12.44
複製代碼
前面咱們已經說到程序自上而下一行行運行,那若是咱們想要程序再也不這麼無聊的運行下去,而是有選擇的執行某一段代碼,該怎麼辦呢?那就要經過設置判斷條件來把程序分隔成一塊一起,程序在運行時根據當時的狀況來判斷符合哪一個條件從而執行那個條件下的一塊代碼。好比咱們想要實現一個「飲料選擇器」,當溫度低於10攝氏度時,咱們就喝熱飲,當溫度等於或者大於10攝氏度時,咱們就喝冷飲。用僞代碼能夠表示:
if temp<10:
#下面是一段代碼塊
喝熱飲
……
……
#上面是一段代碼塊
else if temp>=10:
#下面是一段代碼塊
喝冷飲
……
……
#上面是一段代碼塊
複製代碼
上面的僞代碼中,if,else if表示了它們在英文裏相同的意思(if表示若是,else if表示不然若是),在通常的編程語言裏,if,else if 是關鍵字,它們同其餘一些關鍵字被編程語言保留,你想要起變量的名字(後面咱們還會給函數起名字)都不能使用這些被保留的關鍵字,由於關鍵字在程序中表示了特殊的意思,好比在這兒if,else if 後面跟上表達式就是一個條件語句。而條件語句後面就能夠跟一段代碼塊,跟其餘地方的代碼區分開來,上面僞代碼中能夠把註釋中間的東西想象成很長的一段代碼塊。
上面僞代碼中的「temp<10」是一個表達式,「temp」看作存儲溫度的變量,「<」這個符號跟數學裏的意義同樣表示「小於」,那麼「temp<10」這個表達式的值就有兩種可能,一種就是「temp」變量的值大於10,另外一種就是「temp」變量的值小於10。在第一種狀況下,「temp<10」這個表達式顯然不符合事實,因此「if temp<10:」下面的代碼塊不會執行,與之相對應的,「else if temp>=10:」下面的代碼塊就會執行。在第二種狀況下,「temp<10」這個表達式顯然符合事實,因此「if temp<10:」下面的代碼塊會當即執行,與之相對應的,「else if temp>=10:」下面的代碼塊則不會執行。這樣就達到了有選擇的執行某一段代碼的目的。
像「temp<10」或者「temp>=10」這樣的表達式能夠稱爲比較表達式,像「<」或者「>=」這樣的操做符能夠稱爲比較操做符。常見的比較操做符以下:
操做符 | 解釋 |
---|---|
< | 小於 |
<= | 小於等於 |
> | 大於 |
>= | 大於等於 |
== | 等於 |
!= | 不等於 |
比較表達式的值如何表示呢,這裏咱們須要再次擴展咱們的變量所能表達的類型,變量除了表示數字、文字內容,還能表示比較表達式(好比「temp>=10」)的值,從前面的解釋中咱們知道比較表達式的值就兩種可能,一種符合事實,這時候咱們就規定比較表達式的值爲True(也能夠用數字「1」表示),另外一種不符合事實,這時候咱們就規定比較表達式的值爲False(也能夠用數字「0」表示)。這種只有兩個值(True和False)的變量類型稱爲布爾(boolean)類型。
通常來講,if,else if這兩個關鍵字後面跟的比較表達式的值是相反的,因此就只會執行比較表達式的值爲True的那個條件語句下的代碼塊。另外還有包含else關鍵字的條件語句,else後面會省略比較表達式,當if或者else if條件語句中比較表達式的值都爲Flase的時候就會執行else條件語句下的代碼塊。假如temp變量的值爲11,能夠想一想下面的僞代碼中到底會執行哪個代碼塊:
if temp<=10:
喝熱奶茶
……
……
else if temp>=15:
吃冰激凌
……
……
else:
喝涼開水
……
……
複製代碼
比較表達式也能夠串聯在一塊兒使用,好比你想表達溫度大於10而且小於15時,就要用and
這個操做符把temp>10
跟temp<15
給串起來,則表達式就變成了temp>10 and temp <15
;當你想要表達溫度大於10或者小於15時,就要用or
這個操做符把temp>10
跟temp<15
給串起來,則表達式就變成了temp>10 or temp <15
;當你想表達溫度大於10
這個事實不成立時,就要給temp>10
以前加上not
操做符,表達式變成了not temp>10
。
and
,or
和not
被稱爲布爾操做符(在python語言中),由於這些操做符的做用就是串聯起別的比較表達式來改變整個表達式的布爾值。固然在別的編程語言中,這些操做符會有所不一樣,這是可有可無的,重要的是操做符所起到的功能。
表達式 | 功能 |
---|---|
a and b |
a與b的布爾值都爲True則a and b 爲True,不然爲False |
a or b |
a與b的布爾值有一個爲True則a or b 爲True,不然爲False |
not a |
a的布爾值爲True則not a 爲False,a的布爾值爲False則not a 爲True |
假如temp變量的值爲9,能夠想一想下面的僞代碼中到底會執行哪個代碼塊:
if temp<=10 or temp>=15:
什麼都不喝
……
……
else:
喝涼開水
……
……
複製代碼
細心的你可能已經發現了,在「if temp<10:」或者「else if temp>=10:」這兩個條件語句中,末尾都有一個「:」,事實上上面的僞代碼是基本符合python語法的,在python中咱們經過關鍵字後面隔個空格,再寫上比較表達式,末尾再加上「:」的方式來代表一個條件語句,再更加細緻一點,你會發現條件語句之下有一段代碼全是相對於條件語句來講向右縮進的,通常是打四個空格來實現這樣的縮進,經過這樣的縮進來代表自身是受條件語句約束的代碼塊。在python裏,經過「:」和縮進來實現代碼塊,下文要講到的循環、函數、對象等也能經過這樣的方式實現受其約束的代碼塊。在其餘編程語言裏,一種實現代碼塊的方式是經過「{」和「}」把代碼包裹起來實現的,該小節開頭的僞代碼能夠寫成這樣:
if (temp<10) {
喝熱飲
……
……
}
else if (temp>=10){
喝冷飲
……
……
}
複製代碼
通常來講呢,編程語言裏會有if條件語句,else if條件語句,else條件語句,switch條件語句。在python的語法裏,else if變成了elif,更加簡潔了,而且沒有switch語句。該小節開頭的僞代碼咱們能夠寫成python源代碼:
temp=10
drink="喝什麼"
if temp<10:
drink="喝熱飲"
elif temp>=10:
drink="喝冷飲"
複製代碼
再多寫個例子:
temp=16
drink="喝什麼"
if temp<10:
drink="喝熱飲"
elif temp>=10 and temp<=15:
drink="喝涼開水"
else:
drink="吃冰激凌"
#想一想,最後drink的值是什麼?
複製代碼
若是咱們想要在程序運行的過程當中與人互動(與別的程序或者程序片斷互動),那麼咱們就須要引入未知數。這個未知數會在程序運行過程當中實時地獲得某人(其餘程序)的輸入(input),從而程序根據輸入(input)的數據計算下去。
好比咱們想計算小萌某一天走過的路程有多遠,已知小萌的行進速度是5千米每小時,那麼咱們不知道的就是小萌在某一天到底走了多長時間,這個未知數咱們能夠暫時先用t來表示,這樣咱們就可以用t*5來表示小萌某天走過的路程。
咱們如今想要計算小萌今天的路程,則只須要問問小萌今天走了多長時間的路,小萌說走了2.5小時,咱們把t*5中的t換成2.5,再計算下就知道小萌走了12.5千米。
像這個例子中的t*5
(t是未知數,將來會獲得一個具體輸入(input))這樣,包含了未知數的這種構造就是函數(function)。該小節開頭所說的讓程序在運行過程當中獲得一個具體輸入(input)就須要函數這樣的構造。函數中的未知數被稱爲該函數的參數。
該小節第二段的例子展現了定義一個函數的過程,用t*5
計算出來的路程就是函數的輸出(output),也能夠說是函數的結果。那麼t*5
其實能夠看做函數自己。t是函數的參數,咱們也能夠用a來表示則函數自己成爲了a*5
,a*5
與t*5
是等價的,函數的參數名稱與函數的運行結果無關。既然函數的參數能夠用任意名稱來表示,那麼函數自己呢?函數自己也能用任意名稱來表示,好比這裏咱們能夠用mile
來表示t*5
,之後咱們就能夠把t*5
直接叫mile函數。在python中,定義這個函數須要這樣作:
""" 如你所見 這是一個多行註釋 首行和末尾行用要用三個雙引號包裹起來哦 """
""" def是定義函數的關鍵字,mile是函數的名稱(名稱能夠自由的發揮想象力), 圓括號裏的是函數的參數(參數名稱能夠自由的發揮想象力),return是函數返回某個值的關鍵字。 """
def mile(t):
m=t*5
return m #返回變量m的值
複製代碼
該小節的第三段展現了咱們人類使用一個函數的過程,而在程序裏,不須要咱們人類操心,咱們只須要把參數丟進函數,函數就會計算出結果來。咱們能夠把函數看做黑盒子,不須要知道函數的具體實現過程。咱們可使用別人定義好的函數,只須要知道函數的參數和函數的返回值(或者函數的做用),以及函數的名稱。這樣咱們就不用什麼都靠本身編寫實現,而能夠站在巨人的肩膀上專心編寫本身的程序邏輯。假如一段很長的代碼都是爲了獲得某個結果,而在程序裏你須要屢次計算在不一樣參數輸入下的這個結果,把這段代碼用定義函數的方式包裹起來,能夠達到重複使用這段代碼的效果。函數的使用在程序裏咱們稱爲函數的調用,在python中,調用上面剛剛定義的mile函數須要這樣作:
#給mile函數填入參數2,而後將mile函數返回的計算結果賦值給變量n
n=mile(2)
#參數也可使用以前初始化好的變量,看下面的例子
a=3
b=mile(a)
複製代碼
函數的參數跟變量同樣,也是有各類類型的,有數字、字符串、布爾值……在定義函數的時候要想清楚輸入的參數是什麼類型,好比咱們以前定義的mile函數,它的參數就應該是數字,當你輸入不是數字的參數時,就會獲得奇怪的結果:
函數的參數能夠是任意多個,參數之間用逗號隔開,調用的時候須要按照順序給參數賦值:
def addTwo(a,b):
return a+b
a=addTwo(5,4)
print(a)
複製代碼
上面程序運行結果爲9。
函數的參數能夠沒有,也能夠不返回任何值:
def foo():
""" pass語句表示什麼也不作,當你沒有想好函數的具體實現時 能夠用pass語句先代替 """
pass
複製代碼
python中的函數有很是高的靈活性,在函數調用的時候可使用關鍵字參數的形式,也就是在調用的時候直接給定義時給出的參數名(關鍵字)賦值,這時候參數沒有必要按照順序給參數賦值:
def addTwo(a,b):
return a+b
a=addTwo(b=4,a=5)
print(a)
複製代碼
上面程序運行結果爲9。
python中的函數在定義的時候能夠設置默認參數,也就是說若是調用的時候沒有給參數賦值,則會使用默認的值:
def addTwo(a,b=4):
return a+b
a=addTwo(5,5)
print(a)
b=addTwo(5)
print(b)
複製代碼
上面程序a的值是10,b的值爲9。
python解釋器內置了一些函數,咱們能夠直接拿來用,最經常使用的就是print函數。這個函數的做用就是在命令行下打印出函數參數中輸入的字符串,你能夠在交互模式下試試:
print("hello,world!")
複製代碼
另外一個經常使用的函數就是input函數。這個函數的做用就是在命令行下接受用戶的輸入,你能夠在交互模式下試試:
input("請輸入一句話: ")
複製代碼
如今咱們用2.2小節關於溫度的例子寫一個示例程序,把咱們目前學習到的概念都運用一下:
""" 首先咱們定義個函數,把2.2小節例子中的條件語句用函數包裹起來, 以便複用這段代碼 """
def drink_selector(temp):
t=int(temp) #int函數內置函數,能夠把字符串轉換爲整數
if t<10:
print("喝熱飲")
elif t>=10 and t<=15:
print("喝涼開水")
else:
print("吃冰激凌")
""" 咱們從用戶輸入中獲得temperature變量的值 input函數獲得的用戶輸入是字符串 """
temperature=input("請輸入當前溫度: ")
#調用咱們以前定義好的函數,讓函數告訴咱們該喝什麼飲料
drink_selector(temperature)
複製代碼
程序運行如圖所示:
前面說到函數是個黑盒子,意思就是:若是把整個程序看作一整個解決某個大問題的流程(步驟)的話,定義一個函數,就比如預先定義了一個解決這個大問題裏的某一特定小問題的流程(步驟)的模板,一旦調用該函數,則解決該大問題的流程就變成了解決該大問題裏這個特定的小問題的流程(步驟)了。當函數返回結果或者函數內部流程結束,對該函數的調用結束,解決該大問題的流程繼續。所以,函數內部的運做能夠說是在不一樣的流程裏,在函數以外是不可見的,可是由於它的流程是在整個程序的流程裏,因此它可使用、修改函數以外的變量。函數內部定義的變量從該函數外部是沒法訪問到的,這樣的變量被稱爲局部變量,而在整個程序的全部地方都能訪問到的變量被稱爲全局變量。
x=0 #全局變量
def blackbox():
y=3 #局部變量
blackbox()
#str函數是內置函數,將數字轉換爲字符串
print(str(y))
複製代碼
上面的這段代碼由於從函數外部沒法訪問到函數內部定義的變量y,因此程序運行中會出現NameError: name 'y' is not defined:
x=0 #全局變量
def blackbox():
x=3 #是改變全局變量的值,仍是從新定義了一個局部變量?
print(str(x))
blackbox()
print(str(x))
複製代碼
上面這段程序運行結果爲下圖:
上段代碼中因爲初始化變量與變量的賦值語句的語法相同,致使解釋器沒法分清咱們在函數內部寫的x=3
的意圖何在?是從新定義一個局部變量仍是改變全局變量x
的值?從程序運行結果來看,python在這種狀況下選擇了定義局部變量,而函數外部因爲沒法訪問函數裏的局部變量,則會使用外部定義的全局變量。讓局部變量跟全局變量同名是種很迷惑人的作法,因此在定義一個變量的時候應該盡最大可能讓變量名具備惟一性。若是要在函數內部修改全局變量的值,則能夠這樣作:
x=0 #全局變量
def blackbox():
""" 下面代碼先使用global關鍵字後面跟全局變量x的方式來 說明此處的x是前面定義的全局變量x """
global x
x=3
blackbox()
print(str(x))
複製代碼
上段代碼運行以下:
任何程序都是自上而下一行行運行,假如咱們想要某個函數(某段程序)運行不少次,咱們該怎麼辦呢,一種天然的想法就是把這個函數(這段程序)多寫幾遍,想要運行幾遍就寫幾遍,這固然是容許的,好比說,咱們想要在終端一行一行的打印出「hello,world!」這句英文的每一個字母跟標點,則咱們能夠這樣作:
print("h")
print("e")
print("l")
print("l")
print("o")
print(",")
print("w")
print("o")
print("r")
print("l")
print("d")
print("!")
複製代碼
可是當咱們想要運行幾百上千遍這個函數(這段程序)時,咱們人類是特別不擅長作這種複製粘貼的重複工做的,尤爲是當這種重複動做達到幾百上千次時,複製過程當中甚至會出現難以察覺的錯誤,致使程序運行結果出現誤差。因此這不是好的方法,在各類編程語言裏,能夠經過循環語句來實現屢次運行同一函數(同一段程序),而且可以在重複運行某個函數(某段程序)的時候每次給予這個函數(這段程序)的參數(變量)都不一樣。下面的python代碼跟本小節第一段python代碼有相同的運行結果,但由於運用了循環語句(loop statement)而更加簡潔:
#for循環(for loop)
for letter in "hello,world!":
print(letter)
複製代碼
這段代碼裏「for」和「in」是組成循環語句的關鍵字,再一次的,python語法裏用「:」做爲循環語句的結尾,而且該語句下的代碼是相對於該循環語句向右縮進,來代表這是受該循環語句約束的代碼塊。這段代碼如何循環呢?它首先會把「hello,world!」字符串中有12個字母數出來,而後根據有12個字母就循環12次,也就是讓受該循環語句約束的代碼塊print(letter)
運行12次。第一次循環則取出第一個字母「h」賦值給參數letter,而後print函數會根據參數letter打印出字母「h」,第二次循環則會取出第二個字母「e」……直到第十二次循環把「!」取出來打印出來,循環結束。看下面一段代碼:
#另外一種for循環(for loop)
for index in range(0,12):
print("hello,world!"[index])
複製代碼
這段代碼跟上一段代碼的做用同樣,都是分行打印出「hello,world!」的每一個字符,但用到了另外一種形式的循環,這種循環更爲傳統,就是經過數字索引的方式達到循環的目的。range函數是個python內置函數,根據提供的參數0
和12
會給循環提供一串從0
到11
的索引數字,索引數字的取值範圍包括左邊的0
但不包括右邊的12
。第一次循環的時候索引index的值爲0,第二次循環的時候索引index的值爲1……直到第十二次循環索引index的值爲11,這時候索引數字完了,循環就結束了。值得特別注意的是,計算機世界裏,計數是從0開始的。因此經過range函數給定了12個索引數字以後,最後一次循環給出的索引數字index是11,而不是12。''hello,world!''[index]
,這是個新的寫法,字符串後面用方括號把索引數字包裹起來,則表示從字符串中取出對應位置上的單個的字符。在這段代碼裏,第一次循環的時候,index爲0,則''hello,world!''[0]
就是「h」,第二次循環的時候,index爲1,則''hello,world!''[1]
就是「e」……第十二次循環的時候,index爲11,這時候從0開始計數已是第十二次了,因此''hello,world!''[11]
就是「!」。再看下面一段代碼:
string="hello,world!"
count = 0
#len函數是內置函數,返回字符串的長度
while count <len(string):
print(string[count])
#下面的代碼表示增量,每一次循環count的值加1
count=count+1
複製代碼
這段代碼跟上一段代碼做用相同。這段代碼用到了while這個關鍵字,這是又一種循環方式,叫while循環(while loop),當count
變量的值小於"hello,world!"
的總長度時,就繼續循環下去:
count
變量的值爲0,count <len(string)
的值爲True,因此受該循環語句約束的代碼塊運行一次,當count=conut+1
運行以後,count
的值變爲1;count
變量的值爲1,count <len(string)
的值爲True,因此受該循環語句約束的代碼塊運行一次,當count=conut+1
運行以後,count
的值變爲2;count
變量的值爲10,count <len(string)
的值爲True,因此受該循環語句約束的代碼塊運行一次,當count=conut+1
運行以後,count
的值變爲11;count
變量的值爲11,count <len(string)
的值爲True,因此受該循環語句約束的代碼塊運行一次,當count=conut+1
運行以後,count
的值變爲12;count
變量的值都爲12,count <len(string)
的值爲False,退出循環。這種循環能夠實現無限循環:
number=1
#這兒number==1這個比較表達式的布爾值永遠爲True,因此循環永遠繼續
while number==1:
print("這個循環不會結束")
複製代碼
while True: #布爾值永遠爲True,因此循環永遠繼續
print("這個循環也不會結束")
複製代碼
上面的兩種無限循環可使用CTRL+C 來中斷循環。可是任何循環都是能夠在內部中斷的,經過在該循環中使用break語句,就能夠中斷該循環,下面的代碼就演示瞭如何使用break語句:
number=1
count=0
while number==1:
print("這個循環不會結束")
count=count+1;
if count>18:
""" 設置break語句,在變量count大於18時,該循環中斷 想一想,這個循環一共循環幾回? """
break
複製代碼
在python中用在循環中的另外一個能夠改變循環行爲的語句是continue語句。當出現continue語句時,該循環的該次循環中,出如今continue語句以後的語句被忽略,再也不執行:
#該程序顯示小於12的奇數
for index in range(0,12):
""" 假如index能被2整除,則爲偶數,反之爲奇數 當index是偶數的時候,運用continue語句忽略後面的print語句 """
if index%2==0:
continue
print("奇數:"+str(index))
複製代碼
歡迎瀏覽個人我的博客,https://diwugebingren.github.io