本章主要內容包括下面:
1. 如何分析問題,使用程序解決問題
2. 掌握邏輯處理if/else ,for ,while 語句
3. 不同角度分析同一個問題,對編程有一個總體認識
先來一個例子熱熱身,如何判斷閏年?到這裡大家可以暫停,將思路寫道評論區
1. 第一個小案例
先說一下自己的思路,一步一步來:
1. 什麼是閏年,我麼可以百度,把這個需求弄明白;
2. 作為新手可以嘗試編寫偽代碼;
3. 實現需要python那些知識點;
4. 使用代碼替換偽代碼邏輯;
5. 調試並嘗試優化代碼。
1.1 問題分析:
什麼是閏年?並不是被4整除就是閏年,閏年需要滿足下面兩個條件中的一個:
1:能被400整除;
2:能被4整除且不能被100 整除;
比如:2000年是閏年,1900年不是閏年;
那我們如何來使用程序完成這個判斷呢?課可以先嚐試寫偽代碼。
1.2 偽代碼編寫:
偽代碼就可以理解為我們使用非編程語言將邏輯表達出來,例如:
如果明天天氣晴朗,我就去郊遊,否則在家學習python,偽代碼如下:
如果明天天氣晴
我就去郊遊
否則
我在家學習python
將閏年邏輯使用偽代碼表示,如下:
如果年份被400整除
閏年
如果年份能被4整除且不能被100整除
閏年
現在邏輯就跟清晰了,但是我們使用哪些知識點實現?
1.3 知識點分析:
在偽代碼中我們可以看到,需要使用知識點包括:
1:數據結構:數字;
2:算數運算符:除,求餘;
3:比較運算符:==, !=;
4:邏輯運算符:and;
5:如果,使用條件判斷語句:if/elif 來解決;
我們先將條件表達式使用代碼實現,如下:
#定義一個年份
y1 = 2000
#年份被400整除:對年份求餘,餘數為0說明能夠整除
print(y1 % 400 == 0)
#定義一個年份
y2 = 1900
#年份能被4整除且不能被100整除,
#計算是否被4整除,然後計算不能被100整除,返回值為真,說明是閏年
print(y2 % 4 == 0 and y2 % 100 != 0 )
結果:True,False;結果和預期一樣;
下面再來看條件語句 if ,大多數語言都支持if/elif語句;使用方式如下:
#if/elif/else為關鍵字,
#if可以和多個elif一起使用,但只能和一個else一起使用
#表達式1值為真執行1,2 與3不執行
if 條件表達式1:
執行1
#表達式1值為假,表達式2值為真,執行2,不執行3
elif條件表達式2:
執行2
#如果上面兩個表達式值為假,執行3
else:
執行3
到這裡,使用這些知識點可以完成當前代碼。
1.4 代碼實現:
我麼按照邏輯使用代碼編寫,結果如下:
# 定義一個年份
year = 2000
#if 與條件表達式使用空格憤慨,表達式後面加冒號
# 添加不同打印信息便於觀察結果
if year %400 == 0:
print('case1 :%d is lead year' %year)
if year % 4 == 0 and year %100 != 0:
print('case2 :%d is lead year' %year)
輸出結果:case1 :2000 is leap year;
這麼一看編寫代碼其實並不複雜,雖然實現了,但是這不是我們最終的代碼,分析下代碼執行過程:
1:程序執行第一條if語句後,好藥順序執行第二條if語句;
2:如果第一條為真,第二條沒必要,所以這裡使用if/elif/else;
修改後代碼執行如下:
#修改年份year = 2001#如果條件為真,不執行elif與elseif year % 400 == 0 : print('case1 :%d is leap year' % year)elif year % 4 == 0 and year % 100 != 0: print('case2:%d is leap year' %year)else: print('case3: %d is not leap year'% year)
運行結果:case3 :2001 is not leap year
到這裡,這個案例就完成了,但是還有優化空間;
可但是 又來了新的需求,只能後面優化。
2. 第二個案例,找到1000到2000年所有的閏年
第一個與第二個有相似性,讀者朋友可以思考下如何解決,建議可以寫下偽代碼;
分析步驟:
思路整理,知識點分析,代碼實現,優化;
2.1 思路:
1:找到1000到2000年所有年份
2:逐一判斷每個年份是否是閏年,如果是閏年將其打印出來。
2.2知識點分析:
1) 如何找到1000—2000年之間的年份,我們可以使用range函數,函數說明如下:
range(stop)
range(start,stop[,step])
start:起始值
stop:結束值
step:步進值
函數意思:按照設置步進值生成start到stop-1範圍的range對象,步進值默認為1
看幾個例子我們就明白了:
#0~10-1之間的值tmp = range(10)#range 對象轉成列表print(list(tmp))
#0~10-1之間的數字,步進值2tmp = range(0,10,2)print(list(tmp))#倒序,10-1,步進值-1tmp = range(10,0,-1)print(list(tmp))#1000 - 2000年所有年份tmp = range(1000,2000)print(list(tmp))
輸出結果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 2, 4, 6, 8]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
[1000,1002,1002,...2000]
2) 找到這些年份,如何注意判斷,我們可以使用for語句遍歷,for語句語法如下:
#for:關鍵字,item:獲取元素,in:關鍵字,iterable:可迭代對象
#作用:遍歷iterable每個元素
foritemin iterable:
dosomething
我們來遍歷這1000個年份:
#產生1000—2000年份
#使用for循環遍歷range對象,獲取每個年份
#打印出每個年份
foryear in range(1000,2001):
print(year)
輸出結果:
1000
1001
1002
1003. ...
2000
到這裡,這些知識點就可以解決這些問題。
2) 代碼整理實現:
我們要做的事情:遍歷年份,使用案例1 中的代碼判斷閏年,並將閏年打印輸出;
代碼實現如下:
#遍歷年份:
foryearin range(1000,2001):
#為真打印閏年
ifyear%400 == 0:
print (year)
elifyear % 4 == 0 and year % 100 != 0 :
print(year)
輸出結果:
1004
1008......
2000
我們來看當前代碼,判斷閏年這部分代碼具有可能會被其他代碼使用,如果每次都拷貝代碼,感覺有點冗餘,不易維護;
我們可以將其封裝成一個函數,如果這部分功能出現問題,我們可以將代碼修改量降到最低。
我們將判斷閏年這部分功能封裝成函數,代碼實現如下:
#函數名:isleapyear
#參數:year
#返回值:閏年:True,平年:False
defisleapyear(year):
isleap= False
#如果為閏年isleap值設置為True
ifyear %400 == 0:
isleap=True
elifyear% 4 == 0 and year % 100 != 0:
isleap = True
return isleap
year = 2000
print('%d is leap year:%s'%(year,isleapyear(year)))
year = 1000
print('%d is leap year:%s'%(year,isleapyear(year)))
輸出結果:
2000 is leap year:True
1000 is leap year :False
我們對第二案例進行修改,直接調用這個函數,結果如下:
#遍歷年份
for year in range(1000,2001):
#判斷年份是否為閏年
if isleapyear(year):
print(year)
感覺這樣寫完後,整個人都舒暢了。
4、我們可能存在的問題
很多朋友看了N多資料,但是實際編程時可能被下面幾個問題困擾:
1> 思路有了,但是寫不出來,動能力不足;
2> 基本思路清晰,細節處理能力補不足,幾個邏輯就把自己繞暈了;
3> 代碼編寫完成,能用,但是有很大優化空間。
具體到閏年判斷案例,是否有優化空間我們來分析,先來看當前代碼:
defisleapyear(year):
isleap= False
#條件1
ifyear %400 == 0:
isleap=True
#條件2
elifyear% 4 == 0 and year % 100 != 0:
isleap = True
return isleap
下面靜下心來看代碼執行過程,假設年份 從1到400:
1> 條件1被執行400次,條件被執行多少次?
2> 條件1位假次數為399次,所以條件2被執行399次,
我們將條件1和條件2順序調一下,再來分析,代碼實現如下:
defisleapyear(year):
isleap= False
#條件2
ifyear% 4 == 0 and year % 100 != 0:
isleap = True
#條件1
elifyear %400 == 0:
isleap=True
return isleap
我們再來分析下代碼執行過程:
1>條件2被執行400次,條件1執行多少次?
2>400個年份中閏年個數為97個,減去400這個年份,一共96個,那麼條件1執行次數:400-96=304次
這只是一種優化方式,我們還可以繼續優化,大家可以將優化後的代碼留言到評論區,大家相互參考。
希望大家能通過這個案例,對編程有一個新的認識,編程真的不是拷貝別人的代碼,然後做簡單修改,很多場景不深入到細節很難真正解決問題。