小孩子剛剛開始學說話的時候,常常是一個字一個字地開始學,比如學說“餃子”,對他/她來講,似乎有點難度,大人也聰明,于是就簡化了,用“餃餃”來代替,其實就是讓孩子學會一個字就能表達。當然,從教育學的角度,有人不贊成這種方法。這個此處不討論了。如果對比學習編程,就好像是前面已經學習過的那些各種類型的數據(對應這自然語言中的單個字、詞),要表達一個完整的意思,或者讓計算機完成一個事情(動作),不得不通過一句話,這句話就是語句,它是按照一定規則組織起來的。自然語言中的一句話,按照主謂賓的語法方式組織,計算機編程中的語句,也是按照一定的語法要求進行組織。
雖然在第一部分中,已經零星涉及到語句問題,并且在不同場合也進行了一些應用。畢竟不那么系統。本部分,就比較系統地介紹python中的語句。
為了有總括的印象,先看看python中都包括哪些語句:
* 賦值語句
* if語句,當條件成立時運行語句塊。經常與else, elif(相當于else if)配合使用。
* for語句,遍列列表、字符串、字典、集合等迭代器,依次處理迭代器中的每個元素。
* while語句,當條件為真時,循環運行語句塊。
* try語句。與except, finally, else配合使用處理在程序運行中出現的異常情況。
* class語句。用于定義類型。
* def語句。用于定義函數和類型的方法。
* pass語句。表示此行為空,不運行任何操作。
* assert語句。用于程序調適階段時測試運行條件是否滿足。
* with語句。Python2.6以后定義的語法,在一個場景中運行語句塊。比如,運行語句塊前加鎖,然后在語句塊運行退出后釋放鎖。
* yield語句。在迭代器函數內使用,用于返回一個元素。
* raise語句。拋出一個異常。
* import語句。導入一個模塊或包。常用寫法:from module import name, import module as name, from module import name as anothername
特別說明,以上劃分也不是很嚴格,有的內容,有的朋友不認為屬于語句。這沒關系,反正就是那個東西,在編程中使用。不糾結于名詞歸類上。總之這些都是要掌握的,才能順利編程呢。
## 再談賦值語句
還記得[賦值,簡單也不簡單](https://github.com/qiwsir/ITArticles/blob/master/BasicPython/127.md)那一講中所提到的賦值語句嗎?既然談語句,就應該從這個開始,一方面復習,另外一方面,希望能夠深點,深點的感覺總是很好的(我說的是理解python,思無邪。前面有一個關于list的內容:[再深點,更懂list](https://github.com/qiwsir/ITArticles/blob/master/BasicPython/119.md),就有喜歡看玩笑的看官思邪了。哈哈。)
~~~
>>> qiwsir = 1
>>> python = 2
>>> x, y = qiwsir, python #相當于x=qiwsir,y=python
>>> x
1
>>> y
2
>>> x, y #輸出的是tuple
(1, 2)
>>> [x, y] #這就是一個list
[1, 2]
>>> [a, b] = [qiwsir, python]
>>> a
1
>>> b
2
>>> a, b
(1, 2)
>>> [a, b]
[1, 2]
~~~
換一種方式,以上兩種賦值方法交叉組合一下:
~~~
>>> [c, d] = qiwsir, python
>>> c
1
>>> d
2
>>> c, d
(1, 2)
>>> f, g = [qiwsir, python]
>>> f
1
>>> g
2
>>> f, g
(1, 2)
~~~
居然也行。其實,從這里我們就看出來了,賦值,就是對應著將左邊的變量和右邊的對象關聯起來。
有這樣一個有趣的問題,如果a=3,b=4,想把這兩個變量的值調換一下,也就是a=4,b=3。在有的高級語言中,是要先引入另外一個變量c做為中間中專,就是這樣:
~~~
a = 3
b = 4
c = a #即c=3
a = b #a=4
b = c #b=3
~~~
初學者可能有點糊涂。就是我和你兩只手都托著一個箱子,現在我們兩個要換一下箱子,但是兩個手都被占用了,無法換(當然,要求箱子不能落地,也不要放在桌子上之類的)。于是再找一個名曰張三的人來,他空著兩只手,那么我先把箱子給張三,我就空出來了,然后接你的箱子,你的箱子就到我手里了。我的那個箱子現在張三手里呢,你接過來,于是我們兩個就換了箱子了。
只所以這么啰嗦,就是因為我們兩個沒有更多的手。但是,這不是python,python有更多的手。她可以這樣:
~~~
>>> qiwsir = 100
>>> python = 200
>>> qiwsir, python = python, qiwsir
>>> qiwsir
200
>>> python
100
~~~
有點神奇,python是三頭六臂的。
## 序列賦值
其實上面實驗的賦值,本質上就是序列賦值。只不過這里再強化一番罷了。如果左邊的變量是序列,右邊的對象也是序列,兩者將一一對應地進行賦值。
~~~
>>> [a, b, c] = (1, 2, 3) #左右序列一一對應,左邊是變量,右邊是對象
>>> a
1
>>> b
2
>>> c
3
>>> (a,b,c) = [1,2,3]
>>> a
1
>>> b
2
>>> c
3
>>> [a,b,c] = "qiw" #不要忘記了,str也是序列類型的數據
>>> a
'q'
>>> b
'i'
>>> c
'w'
>>> (a,b,c) = "qiw"
>>> a,c
('q', 'w')
>>> a,b,c = 'qiw' #與前面等價
>>> a,b
('q', 'i')
>>> a,b = 'qiw' #報錯了,因為左邊和右邊不是一一對應
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack
>>> (a,b),c = "qi","wei" #注意觀察,這樣的像是是如何對應的
>>> a,b,c
('q', 'i', 'wei')
>>> string = "qiwsir"
>>> a,b,c = string[0],string[1],string[2] #取切片也一樣
>>> a,b,c
('q', 'i', 'w')
>>> (a,b),c = string[:2],string[2:]
>>> a,b,c
('q', 'i', 'wsir')
~~~
從實驗中,可以看出,要搞清楚這種眼花繚亂的賦值,就僅僅扣住“一一對應”這個命脈即可。
如果看官用python3,在賦值上還有更多有意思的東西呢。不過,本講座用的還是python2。
- 第零部分 獨上高樓,望盡天涯路
- 嘮叨一些關于Python的事情
- 為什么要開設本欄目
- 第一部分 積小流,至江海
- Python環境安裝
- 集成開發環境(IDE)
- 數的類型和四則運算
- 啰嗦的除法
- 開始真正編程
- 初識永遠強大的函數
- 玩轉字符串(1):基本概念、字符轉義、字符串連接、變量與字符串關系
- 玩轉字符串(2)
- 玩轉字符串(3)
- 眼花繚亂的運算符
- 從if開始語句的征程
- 一個免費的實驗室
- 有容乃大的list(1)
- 有容乃大的list(2)
- 有容乃大的list(3)
- 有容乃大的list(4)
- list和str比較
- 畫圈還不簡單嗎
- 再深點,更懂list
- 字典,你還記得嗎?
- 字典的操作方法
- 有點簡約的元組
- 一二三,集合了
- 集合的關系
- Python數據類型總結
- 深入變量和引用對象
- 賦值,簡單也不簡單
- 坑爹的字符編碼
- 做一個小游戲
- 不要紅頭文件(1): open, write, close
- 不要紅頭文件(2): os.stat, closed, mode, read, readlines, readline
- 第二部分 窮千里目,上一層樓
- 正規地說一句話
- print能干的事情
- 從格式化表達式到方法
- 復習if語句
- 用while來循環
- 難以想象的for
- 關于循環的小伎倆
- 讓人歡喜讓人憂的迭代
- 大話題小函數(1)
- 大話題小函數(2)
- python文檔
- 重回函數
- 變量和參數
- 總結參數的傳遞
- 傳說中的函數條規
- 關于類的基本認識
- 編寫類之一創建實例
- 編寫類之二方法
- 編寫類之三子類
- 編寫類之四再論繼承
- 命名空間
- 類的細節
- Import 模塊
- 模塊的加載
- 私有和專有
- 折騰一下目錄: os.path.<attribute>
- 第三部分 昨夜西風,亭臺誰登
- 網站的結構:網站組成、MySQL數據庫的安裝和配置、MySQL的運行
- 通過Python連接數據庫:安裝python-MySQLdb,連接MySQL
- 用Pyton操作數據庫(1):建立連接和游標,并insert and commit
- 用Python操作數據庫(2)
- 用Python操作數據庫(3)
- python開發框架:框架介紹、Tornado安裝
- Hello,第一個網頁分析:tornado網站的基本結構剖析:improt模塊、RequestHandler, HTTPServer, Application, IOLoop
- 實例分析get和post:get()通過URL得到數據和post()通過get_argument()獲取數據
- 問候世界:利用GAE建立tornado框架網站
- 使用表單和模板:tornado模板self.render和模板變量傳遞
- 模板中的語法:tornado模板中的for,if,set等語法
- 靜態文件以及一個項目框架
- 模板轉義
- 第四部分 暮然回首,燈火闌珊處
- requests庫
- 比較json/dictionary的庫
- defaultdict 模塊和 namedtuple 模塊
- 第五部分 Python備忘錄
- 基本的(字面量)值
- 運算符
- 常用的內建函數
- 擴展閱讀(來自網絡文章)
- 人生苦短,我用Python