鍍金池/ 教程/ Python/ 語句(1)
標(biāo)準(zhǔn)庫 (4)
如何成為 Python 高手
標(biāo)準(zhǔn)庫 (6)
標(biāo)準(zhǔn)庫 (3)
類(2)
Pandas 使用 (2)
xml
用 tornado 做網(wǎng)站 (5)
文件(1)
練習(xí)
列表(3)
從小工到專家
除法
錯誤和異常 (2)
函數(shù)(1)
用 tornado 做網(wǎng)站 (7)
為做網(wǎng)站而準(zhǔn)備
函數(shù)練習(xí)
標(biāo)準(zhǔn)庫 (8)
Pandas 使用 (1)
回顧 list 和 str
字典(1)
用 tornado 做網(wǎng)站 (3)
字符串(1)
函數(shù)(2)
寫一個(gè)簡單的程序
將數(shù)據(jù)存入文件
語句(5)
SQLite 數(shù)據(jù)庫
集成開發(fā)環(huán)境(IDE)
集合(1)
類(1)
用 tornado 做網(wǎng)站 (6)
用 tornado 做網(wǎng)站 (2)
自省
語句(4)
錯誤和異常 (1)
用 tornado 做網(wǎng)站 (4)
集合(2)
列表(1)
標(biāo)準(zhǔn)庫 (1)
生成器
mysql 數(shù)據(jù)庫 (1)
第三方庫
實(shí)戰(zhàn)
運(yùn)算符
類(3)
字典(2)
語句(1)
數(shù)和四則運(yùn)算
語句(2)
文件(2)
MySQL 數(shù)據(jù)庫 (2)
電子表格
迭代器
mongodb 數(shù)據(jù)庫 (1)
特殊方法 (2)
特殊方法 (1)
字符編碼
編寫模塊
用 tornado 做網(wǎng)站 (1)
標(biāo)準(zhǔn)庫 (5)
函數(shù)(4)
類(5)
字符串(2)
關(guān)于 Python 的故事
函數(shù)(3)
字符串(4)
處理股票數(shù)據(jù)
常用數(shù)學(xué)函數(shù)和運(yùn)算優(yōu)先級
字符串(3)
為計(jì)算做準(zhǔn)備
多態(tài)和封裝
類(4)
迭代
語句(3)
錯誤和異常 (3)
分析 Hello
Python 安裝
標(biāo)準(zhǔn)庫 (2)
列表(2)
元組

語句(1)

數(shù)據(jù)類型已經(jīng)學(xué)的差不多了,但是,到現(xiàn)在為止我們還不能真正的寫程序,這就好比小學(xué)生學(xué)習(xí)寫作一樣,到目前為止僅僅學(xué)會了一些詞語,還不知道如何造句子。從現(xiàn)在開始就學(xué)習(xí)如何造句子了。

在編程語言中,句子被稱之為“語句”,

什么是語句

事實(shí)上,前面已經(jīng)用過語句了,最典型的那句:print "Hello, World"就是語句。

為了能夠嚴(yán)謹(jǐn)?shù)仃U述這個(gè)概念,抄一段維基百科中的詞條:命令式編程

命令式編程(英語:Imperative programming),是一種描述電腦所需作出的行為的編程范型。幾乎所有電腦的硬件工作都是指令式的;幾乎所有電腦的硬件都是設(shè)計(jì)來運(yùn)行機(jī)器碼,使用指令式的風(fēng)格來寫的。較高級的指令式編程語言使用變量和更復(fù)雜的語句,但仍依從相同的范型。

運(yùn)算語句一般來說都表現(xiàn)了在存儲器內(nèi)的數(shù)據(jù)進(jìn)行運(yùn)算的行為,然后將結(jié)果存入存儲器中以便日后使用。高級命令式編程語言更能處理復(fù)雜的表達(dá)式,可能會產(chǎn)生四則運(yùn)算和函數(shù)計(jì)算的結(jié)合。

一般所有高級語言,都包含如下語句,Python 也不例外:

  • 循環(huán)語句:容許一些語句反復(fù)運(yùn)行數(shù)次。循環(huán)可依據(jù)一個(gè)默認(rèn)的數(shù)目來決定運(yùn)行這些語句的次數(shù);或反復(fù)運(yùn)行它們,直至某些條件改變。
  • 條件語句:容許僅當(dāng)某些條件成立時(shí)才運(yùn)行某個(gè)區(qū)塊。否則,這個(gè)區(qū)塊中的語句會略去,然后按區(qū)塊后的語句繼續(xù)運(yùn)行。
  • 無條件分支語句容許運(yùn)行順序轉(zhuǎn)移到程序的其他部分之中。包括跳躍(在很多語言中稱為 Goto)、副程序和 Procedure 等。

循環(huán)、條件分支和無條件分支都是控制流程。

當(dāng)然,Python 中的語句還是有 Python 特別之處的(別的語言中,也會有自己的特色)。下面就開始娓娓道來。

print

在 Python2.x 中,print 是一個(gè)語句,但是在 Python3.x 中它是一個(gè)函數(shù)了。這點(diǎn)請注意。不過,這里所使用的還是 Python2.x。

為什么不用 Python3.x?這個(gè)問題在開始就回答過。但是還有朋友問。重復(fù)回答:因?yàn)楝F(xiàn)在很多工程項(xiàng)目都是 Python2.x,Python3.x 相對 Python2.x 有不完全兼容的地方。學(xué) Python 的目的就是要在真實(shí)的工程項(xiàng)目中使用,理所應(yīng)當(dāng)要學(xué) Python2.x。此外,學(xué)會了 Python2.x,將來過渡到 Python3.x,只需要注意一些細(xì)節(jié)即可。

print 發(fā)起的語句,在程序中主要是將某些東西打印出來,還記得在講解字符串的時(shí)候,專門講述了字符串的格式化輸出嗎?那就是用來 print 的。

>>> print "hello, world"
hello, world
>>> print "hello","world"
hello world

請仔細(xì)觀察,上面兩個(gè) print 語句的差別。第一個(gè)打印的是"hello, world",包括其中的逗號和空格,是一個(gè)完整的字符串。第二個(gè)打印的是兩個(gè)字符串,一個(gè)是"hello",另外一個(gè)是"world",兩個(gè)字符串之間用逗號分隔。

本來,在 print 語句中,字符串后面會接一個(gè) \n 符號。即換行。但是,如果要在一個(gè)字符串后面跟著逗號,那么換行就取消了,意味著兩個(gè)字符串"hello","world"打印在同一行。

或許現(xiàn)在體現(xiàn)的還不時(shí)很明顯,如果換一個(gè)方法,就顯示出來了。(下面用到了一個(gè)被稱之為循環(huán)的語句,下一節(jié)會重點(diǎn)介紹。

>>> for i in [1,2,3,4,5]:
...     print i
... 
1
2
3
4
5

這個(gè)循環(huán)的意思就是要從列表中依次取出每個(gè)元素,然后賦值給變量 i,并用 print 語句打印打出來。在變量 i 后面沒有任何符號,每打印一個(gè),就換行,再打印另外一個(gè)。

下面的方式就跟上面的有點(diǎn)區(qū)別了。

>>> for i in [1,2,3,4,5]:
...     print i ,
... 
1 2 3 4 5

就是在 print 語句的最后加了一個(gè)逗號,打印出來的就在一行了。

print 語句經(jīng)常用在調(diào)試程序的過程,讓我們能夠知道程序在執(zhí)行過程中產(chǎn)生的結(jié)果。

import

《常用數(shù)學(xué)函數(shù)和運(yùn)算優(yōu)先級》中,曾經(jīng)用到過一個(gè) math 模塊,它能提供很多數(shù)學(xué)函數(shù),但是這些函數(shù)不是 Python 的內(nèi)建函數(shù),是 math 模塊的,所以,要用 import 引用這個(gè)模塊。

這種用 import 引入模塊的方法,是 Python 編程經(jīng)常用到的。引用方法有如下幾種:

>>> import math
>>> math.pow(3,2)
9.0

這是常用的一種方式,而且非常明確,math.pow(3,2)就明確顯示了,pow()函數(shù)是 math 模塊里的??梢哉f這是一種可讀性非常好的引用方式,并且不同模塊的同名函數(shù)不會產(chǎn)生沖突。

>>> from math import pow
>>> pow(3,2)
9.0

這種方法就有點(diǎn)偷懶了,不過也不難理解,從字面意思就知道 pow()函數(shù)來自于 math 模塊。在后續(xù)使用的時(shí)候,只需要直接使用 pow()即可,不需要在前面寫上模塊名稱了。這種引用方法,比較適合于引入模塊較少的時(shí)候。如果引入模塊多了,可讀性就下降了,會不知道那個(gè)函數(shù)來自那個(gè)模塊。

>>> from math import pow as pingfang
>>> pingfang(3,2)
9.0

這是在前面那種方式基礎(chǔ)上的發(fā)展,將從某個(gè)模塊引入的函數(shù)重命名,比如講 pow 充命名為 pingfang,然后使用 pingfang()就相當(dāng)于在使用 pow()了。

如果要引入多個(gè)函數(shù),可以這樣做:

>>> from math import pow, e, pi
>>> pow(e,pi)
23.140692632779263

引入了 math 模塊里面的 pow,e,pi,pow()是一個(gè)乘方函數(shù),e,就是那個(gè)歐拉數(shù);pi 就是 π.

e,作為數(shù)學(xué)常數(shù),是自然對數(shù)函數(shù)的底數(shù)。有時(shí)稱他為歐拉函數(shù)(Euler's number),以瑞士數(shù)學(xué)家歐拉命名;也有個(gè)較鮮見的名字納皮爾常數(shù),以紀(jì)念蘇格蘭數(shù)學(xué)家約翰·納皮爾引進(jìn)對數(shù)。它是一個(gè)無限不循環(huán)小數(shù)。e = 2.71828182845904523536(《維基百科》)

e 的 π 次方,是一個(gè)數(shù)學(xué)常數(shù)。與 e 和 π 一樣,它是一個(gè)超越數(shù)。這個(gè)常數(shù)在希爾伯特第七問題中曾提到過。(《維基百科》)

from math import * pow(3,2) 9.0 sqrt(9) 3.0

這種引入方式是最貪圖省事的了,一下將 math 中的所有函數(shù)都引過來了。不過,這種方式的結(jié)果是讓可讀性更降低了。僅適用于模塊中的函數(shù)比較少的時(shí)候,并且在程序中應(yīng)用比較頻繁。

在這里,我們用 math 模塊為例,引入其中的函數(shù)。事實(shí)上,不僅函數(shù)可以引入,模塊中還可以包括常數(shù)等,都可以引入。在編程中,模塊中可以包括各樣的對象,都可以引入。

賦值語句

對于賦值語句,應(yīng)該不陌生,在前面已經(jīng)頻繁使用了,如 a = 3 這樣的,就是將一個(gè)整數(shù)賦給了變量。

編程中的“=”和數(shù)學(xué)中的“=”是完全不同的。在編程語言中,“=”表示賦值過程。

除了那種最簡單的賦值之外,還可以這么干:

>>> x, y, z = 1, "python", ["hello", "world"]
>>> x
1
>>> y
'python'
>>> z
['hello', 'world']

這里就一一對應(yīng)賦值了。如果把幾個(gè)值賦給一個(gè),可以嗎?

>>> a = "itdiffer.com", "python"

>>> a
('itdiffer.com', 'python')

原來是將右邊的兩個(gè)值裝入了一個(gè)元組,然后將元組賦給了變量 a。這個(gè) Python 太聰明了。

在 Python 的賦值語句中,還有一個(gè)更聰明的,它一出場,簡直是讓一些已經(jīng)學(xué)習(xí)過某種其它語言的人亮瞎眼。

有兩個(gè)變量,其中 a = 2,b = 9?,F(xiàn)在想讓這兩個(gè)變量的值對調(diào),即最終是 a = 9,b = 2.

這是一個(gè)簡單而經(jīng)典的題目。在很多編程語言中,是這么處理的:

temp = a;
a = b;
b = temp;

這么做的那些編程語言,變量就如同一個(gè)盒子,值就如同放到盒子里面的東西。如果要實(shí)現(xiàn)對調(diào),必須在找一個(gè)盒子,將 a 盒子里面的東西(數(shù)字 2)拿到那個(gè)臨時(shí)盒子(temp)中,這樣 a 盒子就空了,然后將 b 盒子中的東西拿(數(shù)字 9)拿到 a 盒子中(a = b),完成這步之后,b 盒子是空的了,最后將臨時(shí)盒子里面的那個(gè)數(shù)字 2 拿到 b 盒子中。這就實(shí)現(xiàn)了兩個(gè)變量值得對調(diào)。

太啰嗦了。

Python 只要一行就完成了。

>>> a = 2
>>> b = 9

>>> a, b = b, a

>>> a
9
>>> b
2

a, b = b, a 就實(shí)現(xiàn)了數(shù)值對調(diào),多么神奇。之所以神奇,就是因?yàn)槲仪懊嬉呀?jīng)數(shù)次提到的 Python 中變量和數(shù)據(jù)對象的關(guān)系。變量相當(dāng)于貼在對象上的標(biāo)簽。這個(gè)操作只不過是將標(biāo)簽換個(gè)位置,就分別指向了不同的數(shù)據(jù)對象。

還有一種賦值方式,被稱為“鏈?zhǔn)劫x值”

>>> m = n = "I use python"
>>> print m,n
I use python I use python

用這種方式,實(shí)現(xiàn)了一次性對兩個(gè)變量賦值,并且值相同。

>>> id(m)
3072659528L
>>> id(n)
3072659528L

id()來檢查一下,發(fā)現(xiàn)兩個(gè)變量所指向的是同一個(gè)對象。

另外,還有一種判斷方法,來檢查兩個(gè)變量所指向的值是否是同一個(gè)(注意,同一個(gè)和相等是有差別的。在編程中,同一個(gè)就是 id()的結(jié)果一樣。

>>> m is n
True

這是在檢查 m 和 n 分別指向的對象是否是同一個(gè),True 說明是同一個(gè)。

>>> a = "I use python"
>>> b = a
>>> a is b
True

這是跟上面鏈?zhǔn)劫x值等效的。

但是:

>>> b = "I use python"
>>> a is b
False
>>> id(a)
3072659608L
>>> id(b)
3072659568L

>>> a == b
True

看出其中的端倪了嗎?這次 a、b 兩個(gè)變量雖然相等,但不是指向同一個(gè)對象。

還有一種賦值形式,如果從數(shù)學(xué)的角度看,是不可思議的,如:x = x + 1,在數(shù)學(xué)中,這個(gè)等式是不成立的。因?yàn)閿?shù)學(xué)中的“=”是等于的含義,但是在編程語言中,它成立,因?yàn)?quot;="是賦值的含義,即將變量 x 增加 1 之后,再把得到的結(jié)果賦值變量 x.

這種變量自己變化之后將結(jié)果再賦值給自己的形式,稱之為“增量賦值”。+、-、*、/、% 都可以實(shí)現(xiàn)這種操作。

為了讓這個(gè)操作寫起來省點(diǎn)事(要寫兩遍同樣一個(gè)變量),可以寫成:x += 1

>>> x = 9
>>> x += 1
>>> x
10

除了數(shù)字,字符串進(jìn)行增量賦值,在實(shí)際中也很有價(jià)值。

>>> m = "py"
>>> m += "th"
>>> m
'pyth'
>>> m += "on"
>>> m
'python'

總目錄   |   上節(jié):運(yùn)算符   |   下節(jié):語句(2)

如果你認(rèn)為有必要打賞我,請通過支付寶:qiwsir@126.com,不勝感激。

上一篇:集合(2)下一篇:標(biāo)準(zhǔn)庫 (5)