摘要:該系列文章入門,編程基礎概念介紹變量,條件,函數,循環中的數據類型,,,,在中創建對象學一門編程語言正在變得越來越容易,只要念過高中甚至是初中小學,能熟練聊和懂得一點點軟件的人,入門一門編程語言都不在話下。
該系列文章:
《python入門,編程基礎概念介紹(變量,條件,函數,循環)》
《python中的數據類型(list,tuple,dict,set,None)》
《在python中創建對象(object)》
學一門編程語言正在變得越來越容易,只要念過高中(甚至是初中、小學),能熟練聊qq和懂得一點點office軟件的人,入門一門編程語言都不在話下。我們跟別人溝通,靠的是語言,無論是說出來還是寫出來,也不管是普通話還是英語。那么想要跟計算機溝通,也需要靠語言,世界上現在有很多跟計算機溝通的語言,有c,jave,javascript,php,python……這些都是編程語言,它們跟我們與別人交流的語言有何不同呢?我們與別人交流的語言是自然形成的,而編程語言是由某個人或者某幾個人編寫出來的。自然形成的我們稱為自然語言,編程語言則屬于人工語言。自然語言的語法較為松散,自由,既可以用來解決問題,也可以抒發感情、講述故事。而計算機最初被設計的時候是用來解決各種現實生活中的問題的,所以邏輯嚴謹,說一不二,那么跟計算機溝通的時候也需要邏輯嚴謹,不容含糊,語法嚴格,這大概就是很多人覺得編程困難的地方吧。但不要緊,一旦我們習慣了這種嚴謹的語法和思考方式,將會大大提高我們解決問題的效率和正確率。
計算機使用的是二進制,通過接受到的指令執行任務,最初人們通過匯編語言(assembly language,低級語言)來與計算機溝通,告訴cpu執行什么樣的指令,可是各個不同的計算機系統結構都各自有不同的匯編(assembly),并且用匯編編寫程序效率低下(畢竟匯編更偏向于跟計算機溝通),所以對人類友好的高級編程語言應運而生(比如c語言),人們通過編譯程序(充當了一個翻譯家的角色)把高級編程語言編譯成計算機可以理解的機器代碼。這時候編程已經變得比之前容易了,然而更加高級的現代編程語言不斷產生,使得編程的入門門檻進一步降低,python就是其中一門現代編程語言。
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來介紹編程中的基本概念。
1.準備工作linux和mac一般都自帶python2。
某些最新版本的linux發行版可能也自帶python3,如果沒有,請參考這里來安裝使用。
最新版本的mac一般都自帶python3,如果沒有,請參考這里來安裝使用。
Windows系統可以從https://www.python.org/downloads/下載python軟件(解釋器),下載最新版python3.x.x。安裝的時候勾選Add Python 3.x to PATH。這樣就自動設置好了python的環境變量(環境變量就是設置python程序的相關路徑,讓Windows可以找到python程序的安裝目錄)。
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交互模式:
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,點擊回車,運行該文件中的程序。
2.基礎概念我們編寫程序的時候,要在英文輸入法下輸入各種符號,不然程序會報錯。像下面這樣,我故意在中文輸入法下輸入雙引號,出現了“SyntaxError”錯誤:
>>> “李” File "", 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這個表達式就復雜了一些,通常把一個數字本身也叫做表達式。
2.1變量如果我們想計算一個復雜一點的表達式,比如(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),點擊回車,程序不會顯示任何結果:
這就是python兩個模式下的區別,交互模式會自動打印出結果,命令行模式下則不會打印出結果(除非你自己告訴程序打印出哪個結果(變量))。交互模式下寫的python語句能立即執行,但無法保存,不能重復使用。所以想要寫復雜一點的程序就要寫入python源代碼文件中。
我們已經知道了什么是變量,并知道如何給變量賦值。一個變量呢,就像一個空盒子,賦值就是給盒子里塞東西。塞進去的是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.442.2條件
前面我們已經說到程序自上而下一行行運行,那如果我們想要程序不再這么無聊的運行下去,而是有選擇的執行某一段代碼,該怎么辦呢?那就要通過設置判斷條件來把程序分隔成一塊一塊兒,程序在運行時根據當時的情況來判斷符合哪個條件從而執行那個條件下的一塊代碼。比如我們想要實現一個“飲料選擇器”,當溫度低于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的值是什么?2.3函數
如果我們想要在程序運行的過程中與人互動(與別的程序或者程序片段互動),那么我們就需要引入未知數。這個未知數會在程序運行過程中實時地得到某人(其他程序)的輸入(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:
像上面這樣在程序運行過程中出現錯誤的代碼,我們就說代碼里有bug(故障,缺陷)。還有一種bug,就是在程序運行過程中會出現奇怪的行為,或者得出的結果與我們希望得到的有出入。
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這段代碼跟上一段代碼作用相同。這段代碼用到了while這個關鍵字,這是又一種循環方式,叫while循環(while loop),當count變量的值小于"hello,world!"的總長度時,就繼續循環下去:
第一次循環,count變量的值為0,count
的值為True,所以受該循環語句約束的代碼塊運行一次,當count=conut+1運行之后,count的值變為1; 第二次循環,count變量的值為1,count
的值為True,所以受該循環語句約束的代碼塊運行一次,當count=conut+1運行之后,count的值變為2; ……
……
第十一次循環,count變量的值為10,count
的值為True,所以受該循環語句約束的代碼塊運行一次,當count=conut+1運行之后,count的值變為11; 第十二次循環,count變量的值為11,count
的值為True,所以受該循環語句約束的代碼塊運行一次,當count=conut+1運行之后,count的值變為12; 現在count變量的值都為12,count
的值為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
](https://diwugebingren.github.io)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43548.html
摘要:本文與大家分享一些編程語言的入門書籍,其中不乏經典。全書貫穿的主體是如何思考設計開發的方法,而具體的編程語言,只是提供一個具體場景方便介紹的媒介。入門入門容易理解而且讀起來幽默風趣,對于編程初學者和語言新手而言是理想的書籍。 本文與大家分享一些Python編程語言的入門書籍,其中不乏經典。我在這里分享的,大部分是這些書的英文版,如果有中文版的我也加上了。有關書籍的介紹,大部分截取自是官...
摘要:以下這些項目,你拿來學習學習練練手。當你每個步驟都能做到很優秀的時候,你應該考慮如何組合這四個步驟,使你的爬蟲達到效率最高,也就是所謂的爬蟲策略問題,爬蟲策略學習不是一朝一夕的事情,建議多看看一些比較優秀的爬蟲的設計方案,比如說。 (一)如何學習Python 學習Python大致可以分為以下幾個階段: 1.剛上手的時候肯定是先過一遍Python最基本的知識,比如說:變量、數據結構、語法...
閱讀 3280·2021-11-25 09:43
閱讀 2083·2021-09-22 10:02
閱讀 3309·2021-09-06 15:00
閱讀 2297·2019-08-30 15:56
閱讀 2346·2019-08-30 15:54
閱讀 3223·2019-08-30 14:14
閱讀 2257·2019-08-29 17:25
閱讀 2901·2019-08-29 17:16