前面已經講過了四則運算,其中涉及到一些運算符:加減乘除,對應的符號分別是:+ - * /,此外,還有求餘數的:%。這些都是算術運算符。其實,算術運算符不止這些。根據中學數學的知識,也應該想到,還應該有乘方、開方之類的。java
下面列出一個表格,將全部的運算符表現出來。python
運算符 | 描述 | 實例 |
---|---|---|
+ | 加 - 兩個對象相加 | 10+20 輸出結果 30 |
- | 減 - 獲得負數或是一個數減去另外一個數 | 10-20 輸出結果 -10 |
* | 乘 - 兩個數相乘或是返回一個被重複若干次的字符串 | 10 * 20 輸出結果 200 |
/ | 除 - x除以y | 20/10 輸出結果 2 |
% | 取餘 - 返回除法的餘數 | 20%10 輸出結果 0 |
** | 冪 - 返回x的y次冪 | 10**2 輸出結果 100 |
// | 取整除 - 返回商的整數部分 | 9//2 輸出結果 4 , 9.0//2.0 輸出結果 4.0 |
如下假設a=10
,b=20
:git
運算符 | 描述 | 實例 |
---|---|---|
== | 等於 - 比較對象是否相等 | (a == b) 返回 False。 |
!= | 不等於 - 比較兩個對象是否不相等 | (a != b) 返回 True. |
> | 大於 - 返回x是否大於y | (a > b) 返回 False。 |
< | 小於 - 返回x是否小於y | (a < b) 返回 True。 |
>= | 大於等於 - 返回x是否大於等於y。 | (a >= b) 返回 False。 |
<= | 小於等於 - 返回x是否小於等於y。 | (a <= b) 返回 True。 |
(假設a=10
,b=20
)github
運算符 | 描述 | 實例 |
---|---|---|
and | 布爾"與" - 若是x爲False,x and y返回False,不然它返回y的計算值。 | (a and b) 返回 20。 |
or | 布爾"或" - 若是x是True,它返回True,不然它返回y的計算值。 | (a or b) 返回 10。 |
not | 布爾"非" - 若是x爲True,返回False。若是x爲False,它返回True。 | not(a and b) 返回 false。 |
and編程
and,翻譯爲「與」運算,但事實上,這種翻譯容易引發望文生義的理解。app
先說一下正確的理解。less
A and B
,含義是:編程語言
首先運算A,若是A的值是True,就計算B,並將B的結果返回作爲最終結果,若是B是False,那麼A and B
的最終結果就是False,若是B的結果是True,那麼A and B的結果就是True;函數
若是A的值是False ,就不計算B了,直接返回A and B
的結果爲False.優化
在Python 2中,print是一個語句,可是在Python 3中它是一個函數了。這點請注意。
以Python 2爲例,說明print語句。若是說讀者使用的是Python 3,請自行將print xxx修改成print(xxx),其它不變。
print發起的語句,在程序中主要是將某些東西打印出來,還記得在講解字符串的時候,專門講述了字符串的格式化輸出嗎?那就是用來print的。
>>> print "hello, world" hello, world >>> print "hello","world" //逗號表示打印在同一行 hello world
原本,在print語句中,字符串後面會接一個n符號。即換行。可是,若是要在一個字符串後面跟着逗號,那麼換行就取消了,意味着兩個字符串"hello","world"打印在同一行。
可是,在Python 3中狀況有變。默認的end='n',若是不打算換行,能夠在使用print()函數的時候,修改end這個參數的值。
>>> for i in [1,2,3,4]: print(i, end=',') 1,2,3,4,
import引入模塊的方法,是Python編程常常用到的。引用方法有以下幾種:
>>> import math >>> math.pow(3,2) 9.0
這是一種可讀性很是好的引用方式,而且不一樣模塊的同名函數不會產生衝突。
>>> from math import pow >>> pow(3,2) 9.0
這種引用方法,比較適合於引入模塊較少的時候。若是引入模塊多了,可讀性就降低了,會不知道那個函數來自那個模塊。
>>> from math import pow as pingfang >>> pingfang(3,2) 9.0
將從某個模塊引入的函數重命名,好比講pow充命名爲pingfang,而後使用pingfang()就至關於在使用pow()了
>>> from math import pow, e, pi >>> pow(e,pi) 23.140692632779263
引入了math模塊裏面的pow,e,pi,pow()是一個乘方函數,e是那個歐拉數;pi就是π.
>>> from math import * >>> pow(3,2) 9.0 >>> sqrt(9) 3.0
一下將math中的全部函數都引過來了。不過,這種方式的結果是讓可讀性更下降了。僅適用於模塊中的函數比較少的時候,而且在程序中應用比較頻繁。
事實上,不只函數能夠引入,模塊中還能夠包括常數等,均可以引入。在編程中,模塊中能夠包括各樣的對象,均可以引入。
a = 3
>>> x, y, z = 1, "python", ["hello", "world"] >>> x 1 >>> y 'python' >>> z ['hello', 'world']
>>> a = "itdiffer.com", "python" >>> a ('itdiffer.com', 'python')
原來是將右邊的兩個值裝入了一個元組,而後將元組賦給了變量a。
兩個變量的值對調,python只要一行就完成了:
>>> a = 2 >>> b = 9 >>> a, b = b, a >>> a 9 >>> b 2
由於我前面已經數次提到的Python中變量和對象的關係。變量至關於貼在對象上的標籤。這個操做只不過是將標籤換個位置,就分別指向了不一樣的數據對象。
還有一種賦值方式,被稱爲「鏈式賦值」
>>> m = n = "I use python" >>> print m, n #Python 3:print(m, n) I use python I use python
用這種方式,實現了一次性對兩個變量賦值,而且值相同。
>>> id(m) 3072659528L >>> id(n) 3072659528L
用id()
來檢查一下,發現兩個變量所指向的是同一個對象。
另外,還有一種判斷方法,來檢查兩個變量所指向的值是不是同一個(注意,同一個和相等是有差異的。在編程中,同一個就是id()
的結果同樣。
>>> m is n True
這是在檢查m和n分別指向的對象是不是同一個,True說明是同一個。
>>> a = "I use python" >>> b = a >>> a is b True
這是跟上面鏈式賦值等效的。
可是:
>>> b = "I use python" >>> a is b False >>> id(a) 3072659608L >>> id(b) 3072659568L >>> a == b True
看出其中的端倪了嗎?此次a、b兩個變量雖然相等,但不是指向同一個對象。
還有一種賦值形式,若是從數學的角度看,是難以想象的,如:x = x + 1
,在數學中,這個等式是不成立的。由於數學中的「=」是等於的含義,可是在編程語言中,它成立,由於"="是賦值的含義,即將變量x增長1以後,再把獲得的結果賦值變量x.
這種變量本身變化以後將結果再賦值給本身的形式,稱之爲「增量賦值」。+、-、*、/、
%均可以實現相似這種操做。
爲了讓這個操做寫起來省點事(要寫兩遍一樣一個變量),能夠寫成:x += 1
>>> x = 9 >>> x += 1 >>> x 10
除了數字,字符串進行增量賦值,在實際中也頗有價值。
>>> m = "py" >>> m += "th" >>> m 'pyth' >>> m += "on" >>> m 'python'
>>> a = 8 >>> if a == 8: //冒號是必須的 ... print a //四個空格的縮進是必須的 ... 8 >>>
必需要經過縮進方式來表示語句塊的開始和結束
縮進用四個空格也是必須的
#coding:utf-8 print "請輸入一個整數數字:" number = int(raw_input()) if number == 10: print "您輸入的數字是: %d" % number print "You are smart" elif number > 10: print "您輸入的數字是: %d" % number print "This number is more than 10." elif number < 10: print "您輸入的數字是: %d" % number print "This number is less than 10." else: print "Are you a human?" 結果打印: 請輸入一個整數數字: 12 您輸入的數字是: 12 This number is more than 10. 請輸入一個整數數字: 10 您輸入的數字是: 10 You are smart 請輸入一個整數數字: 9 您輸入的數字是: 9 This number is less than 10.
>>> name = "liuguoquan" if "deason" else "xiaoniu" >>> name 'liuguoquan' >>> name = "liuguoquan" if "" else "xiaoniu" >>> name 'xiaoniu' >>> name = "liuguoquan" if "xiaoniu" else "" >>> name 'liuguoquan'
總結一下:A = Y if X else Z
根據上述例子能夠看出:
若是X爲真,那麼就執行A = Y
若是X爲假,那麼就執行A = Z
>>> a = "python" if x > y else "java" >>> a 'java' >>> a = "python" if x < y else "java" >>> a 'python' >>>
For循環的基本結構是:
for 循環規則: //須要冒號
操做語句 //語句要縮進
>>> hello = "liuguoquan" >>> for i in hello: ... print i ... l i u g u o q u a n or: >>> for i in range(len(hello)): ... print i ... 0 1 2 3 4 5 6 7 8 9
range是個內建函數,通常形式是range(start,stop,[,step])
關於range()函數注意一下幾點:
該函數能夠建立一個數字元素組成的列表
該函數最經常使用於for循環
函數的參數必須是整數,默認從0開始
step默認值是1,不寫就是默認值
step是正數,返回list最後的值不包含stop的值,即start + step的值小於stop;step是負數,start + step的值大於stop;
step不能等於0
參數解釋:
start:開始數值,默認爲0
stop:結束數值,必需要寫
step:變化的步長,默認是1,不能爲0
正數
>>> range(9) [0, 1, 2, 3, 4, 5, 6, 7, 8] >>> range(0,9) [0, 1, 2, 3, 4, 5, 6, 7, 8] >>> range(0,9,1) [0, 1, 2, 3, 4, 5, 6, 7, 8] >>> range(1,9) [1, 2, 3, 4, 5, 6, 7, 8] >>> range(1,9,2) [1, 3, 5, 7]
負數
>>> rang(-9) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'rang' is not defined >>> range(0,-9,-1) [0, -1, -2, -3, -4, -5, -6, -7, -8] >>> range(0,-9,-2) [0, -2, -4, -6, -8] >>>
>>> lgq = ["I","am","a","Android"] >>> index = range(len(lgq)) >>> index [0, 1, 2, 3] >>>
#coding:utf-8 result = [] for n in range(1,100): if n % 3 == 0: result.append(n) print result or: print range(3,100,3) 結果打印: [3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]
#coding:utf-8 name = "liuguoquan" print "str" for i in name: print i, print "list" name_list = list(name) print name_list for i in name_list: print i, print "set" name_set = set(name) print name_set for i in name_set: print i, print "tuple" name_tuple = set(name) print name_tuple for i in name_tuple: print i, print "dict" name_dict = {"name":"liuguoquan","sex":"male","age":"18"} print name_dict for i in name_dict: print i,"-->",name_dict[i] 結果打印: str: l i u g u o q u a n list: ['l', 'i', 'u', 'g', 'u', 'o', 'q', 'u', 'a', 'n'] l i u g u o q u a n set: set(['a', 'g', 'i', 'l', 'o', 'n', 'q', 'u']) a g i l o n q u tuple ('l', 'i', 'u', 'g', 'u', 'o', 'q', 'u', 'a', 'n') l i u g u o q u a n dict: {'age': '18', 'name': 'liuguoquan', 'sex': 'male'} age --> 18 name --> liuguoquan sex --> male
name_dict = {"name":"liuguoquan","sex":"male","age":"18"} print name_dict for i in name_dict: print i,"-->",name_dict[i]
注意到,上面的循環,實際上是讀取了字典的key。在字典中,有一個方法,dict.keys(),獲得的是字典key列表。
#獲取字典key列表 for k in name_dict.keys(): print k #Python 3: print(k)
這種循環方法和上面的循環方法,結果是同樣的,可是,這種方法並不提倡,覺得它在執行速度上表現欠佳。
若是要得到字典的value怎麼辦?不要忘記dict.values()方法
for k,v in name_dict.items(): print k,"-->",v
用上面的方法,要把全部的內容都讀入內存,內存東西多了,可能會出麻煩。爲此,Python中提供了另外的方法。
for k,v in name_dict.iteritems(): #注意:僅在Python2中可用,Python 3中已經作了優化,d.items()即有同等功能。 print k,"-->",v
這裏是循環一個迭代器,迭代器在循環中有不少優點。除了剛纔的dict.iteritems()以外,還有dict.itervalues(),dict.iterkeys()供你選用(以上三個dict.iter*都只用在Python 2中,Python 3中已經不須要了)
>>> import collections
引入collections這個標準庫。要判斷數字321是否是可迭代的,能夠這麼作:
>>> isinstance(321, collections.Iterable) False
返回了False,說明321這個整數類型的對象,是不可迭代的。再判斷一個列表對象。
>>> isinstance([1,2,3], collections.Iterable) True
從返回結果,咱們知道,列表[1,2,3]
是可迭代的。
固然,並非要你在使用for循環以前,非要判斷某個對象是否可迭代。由於至此,你已經知道了字符串str、列表list、字典dict、元組tuple、集合set都是可迭代的。
zip()
——一個內建函數,Python 2中,參數是seq1, seq2, ...
,意思是序列數據;在Python 3中,參數須要時可迭代對象。這點差異,一般是沒有什麼影響的,由於序列也是可迭代的。值得關注的是返回值,在Python 2中,返回值是一個列表對象,裏面以元組爲元素;而Python 3中返回的是一個zip對象。
經過實驗來理解上面的文檔:
Python 2: >>> a = "qiwsir" >>> b = "github" >>> zip(a, b) [('q', 'g'), ('i', 'i'), ('w', 't'), ('s', 'h'), ('i', 'u'), ('r', 'b')] Python 3: >>> zip(a, b) <zip object at 0x0000000003521D08> >>> list(zip(a, b)) [('q', 'g'), ('i', 'i'), ('w', 't'), ('s', 'h'), ('i', 'u'), ('r', 'b')]
若是序列長度不一樣,那麼就以"the length of the shortest argument sequence"爲準。
>>> c = [1, 2, 3] >>> d = [9, 8, 7, 6] >>> zip(c, d) #這是Python 2的結果,若是是Python 3,請仿照前面的方式顯示查看 [(1, 9), (2, 8), (3, 7)]
>>> s = {"name":"qiwsir"} >>> t = {"lang":"python"} >>> zip(s,t) [('name', 'lang')]
zip是一個內置函數,它的參數必須是序列,若是是字典,那麼鍵視爲序列。而後將序列對應的元素依次組成元組,作爲一個列表的元素。
for循環實現
>>> a = [1, 2, 3, 4, 5] >>> b = [9, 8, 7, 6, 5] >>> c = [] >>> for i in range(len(a)): ... c.append(a[i]+b[i]) ... >>> c [10, 10, 10, 10, 10]
zip()實現
>>> d = [] >>> for x,y in zip(a,b): ... d.append(x+y) ... >>> d [10, 10, 10, 10, 10]
for循環
>>> myinfor = {"name":"qiwsir", "site":"qiwsir.github.io", "lang":"python"} >>> infor = {} >>> for k,v in myinfor.items(): ... infor[v]=k ... >>> infor {'python': 'lang', 'qiwsir.github.io': 'site', 'qiwsir': 'name'}
zip()
>>> dict(zip(myinfor.values(), myinfor.keys())) {'python': 'lang', 'qiwsir.github.io': 'site', 'qiwsir': 'name'}
enumerate()
也是內建函數。
>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter'] >>> list(enumerate(seasons)) [(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')] >>> list(enumerate(seasons, start=1)) [(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
for循環
week = ["monday","sunday","friday"] for i in range(len(week)): print week[i] + ' is ' + str(i) #注意,i是int類型,若是和前面的用+鏈接,必須是str類型
enumerate
for (i,day) in enumerate(week): print day + " is " + str(i)
raw = "Do you love Canglaoshi? Canglaoshi is a good teacher." print raw #1. 先將字符串轉換爲列表 raw_list = raw.split(" ") print type(raw_list) print raw_list #2. 對列表中的字符串進行替換 for i,string in enumerate(raw_list): if "Canglaoshi" in string: raw_list[i] = "PHP" print raw_list #3. 將列表轉換爲字符串 print " ".join(raw_list)
Python有一個很是強大的功能,就是列表解析,它這樣使用:
>>> squares = [x**2 for x in range(1, 10)] >>> squares [1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> mybag = [' glass',' apple','green leaf '] #有的前面有空格,有的後面有空格 >>> [one.strip() for one in mybag] #去掉元素先後的空格 ['glass', 'apple', 'green leaf']
在不少狀況下,列表解析的執行效率高,代碼簡潔明瞭。是實際寫程序中常常被用到的。
如今Python的兩個版本,對列表解釋上,仍是有一點點差異的,請認真看下面的比較操做。
Python 2: >>> i = 1 >>> [ i for i in range(9)] [0, 1, 2, 3, 4, 5, 6, 7, 8] >>> i 8 Python 3: >>> i = 1 >>> [i for i in range(9)] [0, 1, 2, 3, 4, 5, 6, 7, 8] >>> i 1
先i = 1
,而後是一個列表解析式,很是巧合的是,列表解析式中也用了變量i
。這種狀況,在編程中是經常遇到的,咱們一般把i=1
中的變量i
稱爲處於全局命名空間裏面(命名空間,是一個新詞彙,暫且用起來,後面會講述),而列表解析式中的變量i
是在列表解析內,稱爲處在局部命名空間。在Python 3中,for循環裏的變量再也不與全局命名空間的變量有關聯了。
while i< 5: print i i += 1 print "quit" 0 1 2 3 4 quit
i= 10 while i: if i % 2 == 0: break else: print "%d is odd number" %i i = 0 print "%d is even number" %i 10 is even number
i= 10 while i: if i % 2 == 0: i -= 1 continue; # 繼續下一次循環 else: print "%d is odd number" %i i -= 1 print "%d is even number" %i
while...else
有點相似if ... else
,只須要一個例子就能夠理解。 固然,一遇到else
了,就意味着已經不在while循環內了。
count = 0 while count < 5: print count, " is less than 5" count = count + 1 else: print count, " is not less than 5" 執行結果: 0 is less than 5 1 is less than 5 2 is less than 5 3 is less than 5 4 is less than 5 5 is not less than 5
除了有while...else
外,還能夠有for...else
。這個循環也一般用在當跳出循環以後要作的事情。
from math import sqrt for n in range(99, 1, -1): root = sqrt(n) if root == int(root): print n # 知足此條件後,不執行else break else: print "Nothing." # break不執行就會執行else