小白自學筆記之Python入門-第六章 循環(huán)-1
接著探討超市購物系統(tǒng),模擬更加真實的購物操作,購物不可能都是購買三種商品,有可能一種,有可能多種,這個怎么實現(xiàn)呢?我們捋一下,過程別亂了。
如果購買一件商品,我們的編程步驟,或者算法應(yīng)該是下面這樣的:
⑴ 輸入商品價格
⑵ 顯示應(yīng)付金額
⑶ 輸入顧客付款金額
⑷ 顯示找零信息
⑸ 打印購物小票
如果購買三件商品,我們的編程步驟,或者算法應(yīng)該是下面這樣的:
⑴ 輸入三種商品價格,累加每種商品價格(為下一步顯示應(yīng)付金額準備)
⑵ 顯示應(yīng)付金額
⑶ 輸入顧客付款金額
⑷ 顯示找零信息
⑸ 打印購物小票
?
如果購買十件商品,我們的編程步驟,或者算法應(yīng)該是下面這樣的:
⑴ 輸入十種商品價格,累加每種商品價格(為下一步顯示應(yīng)付金額準備)
⑵ 顯示應(yīng)付金額
⑶ 輸入顧客付款金額
⑷ 顯示找零信息
⑸ 打印購物小票
?
大家可以比較一下,基本是第一步有區(qū)別,第一步輸入價格我們可以使用input函數(shù)實現(xiàn),但是輸入十種商品需要寫十個input函數(shù)嗎?當然不是,計算機不會提供這么笨的方法,就像一個笑話“萬先生”里面講的,跑一下題,輕松一下。?
古時候,有一個人不識字,他不希望兒子也像他這樣,就請了個教書先生來教他兒子認字。他兒子見老師寫“一”就是一劃,“二”就是二劃,“三”就是三劃,他就跑去跟他父親說:“爸爸,我會寫字了,請你叫老師走吧!” 這人聽了很高興,就給老師結(jié)算了工錢叫他走了。 第二天,這人想請一個姓萬的人來家里吃飯,就讓他兒子幫忙寫一張請?zhí)?,他兒子從早上一直寫到中午也沒有寫好,這人覺得奇怪,就去看看,只發(fā)現(xiàn)他兒子在紙上劃了好多橫線,就問他兒子什么意思?他兒子一邊擦頭上的汗一邊埋怨道:“爸,這人姓什么不好,偏偏姓萬,害得我從早上到現(xiàn)在才劃了500劃!!"?
Ok,拉回來接著講循環(huán),我們需要采用循環(huán)結(jié)構(gòu)完成這個功能。Python有兩種循環(huán):for循環(huán)和while循環(huán)。
6.1 for循環(huán)
學習for循環(huán)之前,我們需要先復(fù)習一下range函數(shù)。range函數(shù)的語法如下:
range(stop): 0~stop-1
range(start,stop): start~stop-1
range(start,stop,step): start~stop step(步長)
range(6): 生成序列0 1 2 3 4 5
range(3,,6): 生成序列3 4 5
range(1,6,2): 生成序列1 3 5
for循環(huán)的語法如下:
for 變量 in range():
??? 循環(huán)需要執(zhí)行的代碼
?
思考:⑴編程實現(xiàn)求1~100內(nèi)偶數(shù)之和,⑵求5的階乘5!
先看⑴,首先我們需要一個變量sum用于存儲累加和,初始值為零sum=0,然后通過range函數(shù)生成100之內(nèi)的所有偶數(shù)range(0,101,2)??? #為什么用101?在循環(huán)里進行累加計算,最后輸出結(jié)果。
參考代碼
sum=0
for i in range(0,101,2):
??? sum=sum+i
print(sum)
運行結(jié)果 2550
上面程序中循環(huán)體(就是要多次執(zhí)行的語句)只有一句sum=sum+i ,如果代碼改成下面這樣,思考一下運行結(jié)果會是什么。
sum=0
for i in range(0,101,2):
??? sum=sum+i
??? print(sum)
我都不想貼運行結(jié)果了,要占用我50行空間(差一點寫成100行),但是居然50行也是錯誤的,怎么驗證到底是多少行呢?程序改成下面這樣嬸兒的:
sum=0
count=0
for i in range(0,101,2):
??? sum=sum+i
??? count+=1
??? print(count,sum)
運行結(jié)果
1 0
……??? #我真的算不出這里省略了多少行了!
51 2550
?
解釋一下上面的程序,循環(huán)體有三條語句(為什么,因為Python縮進及其嚴格,這里程序通過縮進確定循環(huán)體),三條語句是
??? sum=sum+i
??? count+=1
??? print(count,sum)
也就是每一次(當i的值分別為0,2,4,6……100)都會執(zhí)行計算和、count加1和輸出count,sum值
試著編程實現(xiàn)求100以內(nèi)奇數(shù)的和,求1+2+3+…+100的和,給你參考答案,當然不是編程代碼,而是奇數(shù)和2500,所有數(shù)的和5050,測試一下你的程序編寫是否正確吧!
?
接下來看第2個思考題:求5的階乘5! 剛才是計算累加和,這次是計算累乘積,一樣的方法。首先我們需要一個變量mul用于存儲累乘積,初始值為1,mul=1,然后通過range函數(shù)生成5之內(nèi)的所有數(shù)range(1,6)? ?注意這里是6哦,在循環(huán)里進行累乘計算,最后輸出結(jié)果。
參考代碼
mul=1
for i in range(1,6):
??? mul=mul*i
print(mul)
運行結(jié)果 120
為什么沒有計算100的階乘呢?
我倒是計算了10的階乘:3628800,似乎是對的,還試了20的階乘:2432902008176640000,可能是正確的,100的階乘也試了,一行都寫不下,誰知道是對還是錯呢:
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
?
for循環(huán)編程思考題:給小學生出10個10以內(nèi)的加減法,隨機生成兩個10以內(nèi)的整數(shù)number1和number2,提示用戶輸入兩個整數(shù)的和,判斷答案是否正確并給出分數(shù)。我不想編寫這個代碼,算了算了,還是寫吧。畢竟還是有點難度的!
參考代碼:
import random
import time
?
print("**********小學生10以內(nèi)加減法考試系統(tǒng)**********")
print("一共10道題目\n3,2,1...開始了!")
starttime=time.time()
correctNo=0
?
for i in range(10):
??? number1 = random.randint(1,10)
??? number2 = random.randint(1, 10)
??? sign=random.randint(1,2)
??? if sign==1:? #加法
??????? answer=int(input(str(number1)+"+"+str(number2)+"="))
??????? if answer==number1+number2:
??????????? correctNo = correctNo + 1
??? else:??????? #減法
??????? if number1<number2:
??????????? number1,number2=number1,number1
??????? answer = int(input(str(number1) + "-" + str(number2) + "="))
??????? if answer==number1-number2:
??????????? correctNo = correctNo + 1
endtime=time.time()
spenttime=endtime-starttime
print("你做對了",correctNo,"個題目,得分:",correctNo*10, \
"用時",format(spenttime,"0.2f"),"秒")
?
print("bye......")
?
運行結(jié)果
**********小學生10以內(nèi)加減法考試系統(tǒng)**********
一共10道題目
3,2,1...開始了!
5+3=8
1-1=0
4-4=0
9+5=13
1-1=0
10+8=18
1-1=0
7+2=9
8+1=9
3+3=6
你做對了 9 個題目,得分: 90 用時 22.32 秒
bye......
?
for循環(huán)的一般形式(這個一般人我不告訴他,其它編程語言沒有else部分)
for 變量 in range():
??? 循環(huán)需要執(zhí)行的代碼
else:
??? 循環(huán)結(jié)束時(沒有通過break退出循環(huán)時),需要執(zhí)行的代碼
以用戶登錄管理系統(tǒng)為例說明。用戶登錄需求:1.輸入用戶名和密碼; 2.判斷用戶名和密碼是否正確(name=‘cup’,passwd=‘cup123’) 3.登錄僅有三次機會,超過3次會報錯。
for i in range(3):
??? user = input('請輸入用戶名:')
??? passwd = input('請輸入密碼:')
??? if user=='cup' and passwd == 'cup123 ':
??????? print('%s用戶登錄成功' %user)
??????? break
??? else:
??????? print('密碼錯誤,請重新輸入密碼,您還剩%d次機會' %(2-i))
else:
??? print('超過三次,登錄失敗')
?
print("bye......")
?
運行結(jié)果1
請輸入用戶名:cup
請輸入密碼:cup123
密碼錯誤,請重新輸入密碼,您還剩2次機會
請輸入用戶名:cup
請輸入密碼:cup123
cup用戶登錄成功
welcome !
我就想問問:第一次密碼為什么還不對?請你思考,別找了,沒有參考答案
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?運行結(jié)果2
請輸入用戶名:1
請輸入密碼:1
密碼錯誤,請重新輸入密碼,您還剩2次機會
請輸入用戶名:2
請輸入密碼:2
密碼錯誤,請重新輸入密碼,您還剩1次機會
請輸入用戶名:3
請輸入密碼:3
密碼錯誤,請重新輸入密碼,您還剩0次機會
超過三次,登錄失敗
bye......
?
試著分析下面代碼運行結(jié)果:
for i in range(1,10):
??? if i%2==0:
??????? print(i)
??????? continue
??? print("%d houmian"%i)? ? #“后面”的拼音
else:
??? print("for else")
print("end")
?
1 houmian
2
3 houmian
4
5 houmian
6
7 houmian
8
9 houmian
for else
end
?
for i in range(1,10):
??? if i%2==0:
??????? print(i)
??????? break
??? print("%d houmian"%i)
else:
??? print("for else")
print("end")
1 houmian
2
End
?
編程練習(就是自己試著編寫程序,獨立解決問題,我不是嚴師,希望你們是高徒):
1. 輸入一個正整數(shù),輸出這個數(shù)所有的因子。如6的因子有1,2,3,6
2. 計算從1到1000以內(nèi)所有能同時被3,5和7整除的數(shù)的和并輸出。
自己寫吧,我不想做了,現(xiàn)在太晚了,要養(yǎng)生,不熬夜。2020年7月8日星期三21時6分
?
又想起個問題,購物系統(tǒng)還沒有實現(xiàn)呢?這個……這個……購物系統(tǒng)用for循環(huán)不太適合,接著看下面的while循環(huán)吧!