一個練習:讓你的編程不再只是湊代碼

Python 編程語言 數據結構 碼農時代 2019-06-28

本章主要內容包括下面:

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次

這只是一種優化方式,我們還可以繼續優化,大家可以將優化後的代碼留言到評論區,大家相互參考。

希望大家能通過這個案例,對編程有一個新的認識,編程真的不是拷貝別人的代碼,然後做簡單修改,很多場景不深入到細節很難真正解決問題。

相關推薦

推薦中...