流程控制是一門程式語言的基本,掌握python流程控制語句就已經能夠實現很多演算法了。本節主要介紹python的條件分支結構if語句和兩種主要迴圈結構while語句和for語句,並在最後詳細講解python函式的用法。如果讀者有一定的程式設計基礎,對條件分支、迴圈和函式這3種結構比較熟悉,那麼本節的內容是簡單的。如果讀者初入程式設計,請認真閱讀本節,這些內容是你日後程式設計的基礎。
print "布林表示式"
print true,false
# result: true,false
print true == 1
# result: true
print true + 2
# result: 3
print true + false*3
# result: 1
print 3 > 2
# result: true
print (1 < 3)*10
# reuslt: 10
***詳見:示例程式/code/2-3.py
2.條件分支
到目前為止的程式都是一條一條語句順序執行的,現在我們的程式開始有了選擇和判斷的能力。if語句能夠設定分支,有且只有1條分支會被執行,這和我們日常語言中的「如果」是一樣的。if語句的一般格式如下:
if 布林表示式1:
分支一
elif 布林表示式2:
分支二
else:
分支三
程式會先計算第乙個布林表示式,如果結果為真,則執行第乙個分支的所有語句。如果為假,則計算第二個布林表示式,如果第二個布林表示式結果為真,則執行第二個分支的所有語句。如果結果仍然為假,則執行第三個分支的所有語句。如果只有兩個分支,那麼不需要elif,直接寫else即可,如果有更多的分支,那麼就需要新增更多的elif語句。python中沒有switch和case語句,多路分支只能通過if-elif-else來實現。注意整個分支結構中是有嚴格的退格縮排要求的。**清單2-3給出一些例子。
**清單2-3 條件分支
print "條件分支"
# 例1 判斷天氣
weather = 'sunny'
if weather =='sunny':
print "shopping"
elif weather =='cloudy':
print "playing football"
else:
print "learning python"
#result: shopping
# 例2 選擇兩個數的較大者
import math
a = math.pi
b = math.sqrt(9.5)
if a>b:
print a
else:
print b
# result: 3.14159265359
# 例3 3個數簡單排序
first = 1
second = 2
third = 3
if second',second,'>',third
# result: 3 > 2 > 1
***詳見:示例程式/code/2-3.py
while語句
計算機比人類愚蠢得多,但計算機的優勢是它能夠無休止地進行計算。2023年3月谷歌的人工智慧機器alphago擊敗棋力世界排名前十的李世石,這個新聞引起了強大轟動。很多人不理解人工智慧為何能夠超越人腦。可以這樣簡單地理解,alphago能夠日夜不停地自我對弈,不斷提高實力,而且速度比人類快得多,它的勝利是可以預見的。
回歸正題,似乎我們現有的知識要讓程式重複地做一件事,就只能重複地寫相同的**,顯然這不合理。為此,我們需要掌握乙個重要的概念——迴圈。while迴圈是最常用的迴圈之一,它的格式如下:
while 布林表示式:
程式段
只要布林表示式為真,那麼程式段將會被執行,執行完畢後,再次計算布林表示式,如果結果仍然為真,那麼再次執行程式段,直至布林表示式為假。舉乙個例子,如果要計算1到1000的和是多少,那麼可以:
a=1000
s=0while a:
s+=a
a-=1
break和continue
下面看兩個簡單的語句,它們只有巢狀在迴圈中才起作用,分別是break語句和continue語句。它們的作用如下:
break:跳出最內層迴圈。
continue:跳到最內層迴圈的首行。
簡單來說,break用於中止迴圈,注意,如果乙個while語句巢狀在另乙個while語句內,即程式中有雙層迴圈,內層迴圈中的break語句僅僅退出內層迴圈並回到外層迴圈。而continue語句是中斷當前的迴圈並回到迴圈段的開頭重新執行程式。首次接觸continue的讀者可能比較難理解,**清單2-4舉出了一些例子。
**清單2-4 while語句
print '''while語句'''
# 例1 1到1000求和
a = 1000
s = 0
while a:
s+=a
a-=1
print s
#result: 500500
# 例2 簡單計算
while true:
s = input('1+2=')
if s ==3:
print '答案正確'
break
if s>=0 and s<=9:
continue
print '答案是個位數'
***詳見:示例程式/code/2-3.py
for迴圈在python中是乙個通用的序列迭代器,可以遍歷任何有序的序列。for語句可作用於字串、列表、元組,這些資料結構在2.4節將會詳細介紹,本節我們的例子需要用到這些資料結構。程式語言的學習是乙個迴圈的學習過程,與其他學科不同,程式語言的知識是相互緊扣的。讀者閱讀本節有困難的話可以先跳到2.4節。
for語句
python中的for語句接受可迭代物件,如序列和迭代器作為其引數,每次迴圈調取其中乙個元素。在**清單2-5中,我們給出了for迴圈對字串、列表的遍歷。python的for迴圈看上去像偽**,非常簡潔,如**清單2-5所示。
**清單2-5 for語句
print '''簡單for迴圈'''
# 對列表和字串進行迭代
for a in ['e','f','g']:
print a,
# result:e f g
print
for a in 'string':
print a,
# result:string
***詳見:示例程式/code/2-3.py
range()函式
如果你希望python能像c語言的格式進行迴圈,就需要乙個數字序列,range()函式能夠快速生成乙個數字序列。如:
range(5)
[0,1,2,3,4]
那麼python中for i in range(5)的效果和c中for(i=0;i<5;i++)的效果是一樣的。而range(a,b)能夠返回列表[a,a+1,…,b-1](注意不包含b),這樣for迴圈就可以從任意起點開始,任意終點結束。range()函式經常和len()函式一起用於遍歷整個序列。len()函式能夠返回乙個序列的長度,for i in range(len(l))能夠迭代整個列表l。雖然直接使用for迴圈似乎也可以實現這個目的,但是直接使用for迴圈難以對序列進行修改(因為每次迭代調取的元素並不是序列元素的引用),而通過range()和len()函式可以快速通過索引訪問序列並對其進行修改。請看下面的**清單2-6:
**清單2-6 range()函式
print '''range()函式'''
print range(2,9)
# result: [2, 3, 4, 5, 6, 7, 8]
print range(2,9,3) #相鄰元素的間隔為3
# result: [2, 5, 8]
print '-'*70
# 直接使用for迴圈難以改變序列元素
l = [1,2,3]
for a in l:
a+=1 #a不是引用,l中對應的元素沒有發生改變
print l
# result: [1,2,3]
# range()與len()函式遍歷序列並修改元素
for i in range(len(l)):
l[i]+=1 #通過索引訪問
print l
# result: [2,3,4]
***詳見:示例程式/code/2-3.py
3.迴圈中的else語句
for迴圈同樣支援break和continue語句。迴圈語句可以有乙個else語句,當for迴圈迭代整個列表後或while迴圈條件變為假時,迴圈並非通過break語句終止時,便會執行這個else語句。下面給出乙個實現簡單搜尋質數的例子(見**清單2-7)。
**清單2-7 迴圈中的else語句
print '''迴圈中的else語句'''
# 簡單搜尋質數
for n in range(2,10):
for x in range(2,n):
if n%x ==0: # 含有非普通因子
print n,'equals',x,'*',n/x
break
else:
print n,'是乙個質數' # 僅含有普通因子,說明這是乙個質數
***詳見:示例程式/code/2-3.py
流資料探勘 三
本篇主要介紹流資料的研究內容。資料流處理準備知識。1.資料流模型的研究 資料流模型是對資料流的邏輯抽象,合理的資料流模型,可以改善資料流的處理效率,是設計高效的處理演算法的基礎。資料流分析模型主要包括 滑動視窗模型 sliding window model 界標模型 landmark model 和...
python與資料探勘基礎
進行txt檔案資料讀取,資料為uci資料庫的 氣病症 病馬資料,資料見 data horsecolic.txt.資料有多行,每行有22個資料,前21個為馬的病症資料,最後乙個時該馬的標籤,判斷其患病與否。實驗的要求是將所有行的前21個資料儲存到乙個二維列表dataarr中,而標籤資料單獨儲存在乙個列...
python基礎與資料探勘
資料探勘的流程 明確目標,資料蒐集,資料清洗,構建模型,模型評估,應用部署。正向單索引 如上圖所示,變數list1是乙個含有7個元素的列表,包含字串 字串必須用引號引起來 數值和列表。用print列印,列表中最後乙個元素正好又是乙個列表 巢狀列表 所以需要取出巢狀列表中的元素就需要兩層索引來實現。負...