1. 程式人生 > >寫程式碼遇到問題的思考方法

寫程式碼遇到問題的思考方法

寫程式碼時會遇到各種需求,大大小小的都有。

遇到比較複雜的需求時,不要直接開始碼程式碼,寫一點改一點,我們需要先冷靜下來,把大需求拆分成若干個小需求之後再一個個實現,因為往往我們的思路決定程式的框架,想要後期再修改就比較困難了。

比如現在有一個需求:

我們有兩年內若干個月份的列表,如:

['2016-12', '2017-01', '2017-05', '2017-06', '2017-08', '2018-01', '2018-02', '2018-03']

現在要輸出兩年內從此列表第一個月開始不在此列表中連續兩個月以上的月份區間,比如此時要輸出:

[('2016-09, 2016-11'), ('2017-02', '2017-04'), ('2017-09', '2017-12'), ('2018-04', '2018-08')]

此時大需求就是得到月份區間,我們可以拆分一下:

1、獲取兩年內所有月份。

2、判斷兩個月份是否連續。(由一個月得到下一個月)

     也就是說將連續的月份轉化為連續的數字,通過相減確定是否連續。(第一種方法:年份*12+月份; 第二種方法:通過月份在兩年內所有月份的位置。)

3、連續月份取為區間。

我們可以從兩個方向考慮:

1、由已有的列表通過差值去除不在列表中的月份區間。(需要考慮最後缺少月份的情況)

2、有兩年內所有月份生成所有不在列表中的月份,再取成區間。(需要考慮開始月份的情況)

兩個方向都差不多,我們選取第一種做演示

我們獲得兩年內所有月份:

def get_n_month_list(month_count, start_date=None, order='DESC', slant_line=True):
    now = time.localtime()
    if start_date:
        month_diff = (now.tm_year - start_date.year) * 12 + now.tm_mon - start_date.month
        month_count = month_diff if month_diff < month_count else month_count
    month_list = [time.localtime(time.mktime(
        (now.tm_year, now.tm_mon - 1 - n, 1, 0, 0, 0, 0, 0, 0)))[:2] for n in range(month_count)]
    if order != 'DESC':
        month_list.reverse()
    if slant_line == False:
        return ['%d%02d' % (y, m) for y, m in month_list]
    return ['%d/%02d' % (y, m) for y, m in month_list]

獲取到兩年內的月份後,可以通過該列表判斷我們的月份是否連續:(通過新增月份數24來去除最後缺少月份的情況)

two_year_month = get_n_month_list(month_count=24, slant_line=True)
two_year_month.reverse()
report_month = [two_year_month.index(x) for x in two_year_month if x in [result['month_list'][y] for y in range(len(result['month_list'])) if result['month_payment_amount_list'][y]]] + [24]

最後通過相減判斷差值,就能取出所需月份了:

loss_month = []
if len(report_month) > 1:
	for item_index in range(len(report_month) - 1):
		if (report_month[item_index + 1] - report_month[item_index]) > 2:
			loss_month.append((report_month[item_index] + 1, (report_month[item_index + 1] - 1)))
result['loss_month'] = [(two_year_month[x[0]], two_year_month[x[1]]) for x in loss_month]

相關推薦

2018-5-23論程式碼思考的重要性

保持微笑保持微笑:                      I  quit?。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。明白了思考的重要性

近期程式碼思考

深度還是沒有加深很多,還是在不停的學習更多的東西,東西還沒有學習全,感覺唯一能夠安慰我自己的可能就是年輕吧, 年輕的我不會按照老一輩人的套路,可以學習更多的東西,能夠去願意思考,去自覺的優化程式碼,去避免做一些重複勞動

程式碼遇到問題的思考方法

寫程式碼時會遇到各種需求,大大小小的都有。 遇到比較複雜的需求時,不要直接開始碼程式碼,寫一點改一點,我們需要先冷靜下來,把大需求拆分成若干個小需求之後再一個個實現,因為往往我們的思路決定程式的框架,想要後期再修改就比較困難了。 比如現在有一個需求: 我們有兩年內若干個

少說話多程式碼之Python學習017——字典的方法(items、pop)

  items方法將字典的所有項以列表方式返回,列表中每一項都表示為(鍵,值)對形式,但對字典的項的次序沒有什麼規律。 #items方法 d={'title':'繞口令:喇嘛和啞巴',    'content':'打南邊來了個啞巴,腰裡別了個喇叭;打北邊來了個喇

少說話多程式碼之Python學習019——字典的方法(update、values)

update方法 利用一個字典A去更新另一個字典B。A的項會新增到B中,如果存在相同鍵,則A會覆蓋B的這個鍵。 #update 方法 d={     'name':'楊友山',     'blog地址':'https://blog.csdn.net/y

少說話多程式碼之Python學習018——字典的方法(popitem、setdefault)

popitem方法 popitem其實和pop方法沒什麼兩樣,雖然解釋說pop是彈出字典的最後一項,popitem彈出的是字典的隨機項。但是字典是一個連結串列結構,哪裡有最後一項和第一項呢?不管怎麼說,我們可以看看popitem的用法。 #popitem d={} d={'詩仙':'李白',

少說話多程式碼之Python學習040——類02(類的函式和方法

在類裡定義函式時的self引數,其實是方法和函式的區別。在類裡定義方法時,一般都在方法里加一個預設的引數,可以是,a,c,d的。但是約定俗成就統一叫self。self表示的是 這個類的當前例項,一個類有多個例項,那麼它屬於自己所屬於的例項,不會存在例項寧缺的self會指向例項陳皮皮。 這裡比價特

少說話多程式碼之Python學習050——類的成員(靜態方法,類成員方法,getattr,setattr)

我們在訪問類的欄位時,還有一些過濾的條件,類似於前端語言比如vue Js、anjularJs中過濾器的概念。在3.0以前可以使用比如,__setattr__,__getattr__的方法進行屬性的過濾。在3.0以後我們如果對某些欄位需要過濾訪問,也可以使用這些函式。 class Rectan

少說話多程式碼之Python學習054——類的成員(生成器的方法和模擬生成器))

我們看看生成器的呼叫以及內部響應, 外部訪問生成器的send方法,類似於我們方位迭代器的next方法。 內部響應的過程是,yield作為表示式使用。生成器重新執行時,yield方法返回一個值,如果send方法被使用,則返回none。 比如這樣的過程, def repeater(value):

【小白看的Java教程】第十五章,更聰明的程式碼方法

之前講解的迴圈操作,可以解決的是程式碼重複的問題,但是此時的重複的程式碼必須是有規律的。那迴圈操作,能解決所有的程式碼重複嗎?答案肯定是不行的,比如針對於某一種功能的重複操作,迴圈解決不了,終於方法就該登場了。舉個例子。 編寫一個飛機大戰遊戲,程式在執行過程中

《碼農經驗手冊》-拿到需求程式碼前,要思考的問題有哪些?

1.在開始寫每行程式碼之前,先把問題徹底理解並理清所有的邏輯判斷。寫出虛擬碼。 2.對需求進行分析,想清楚最終執行的目標結果是什麼,輸入輸出,以及最終要執行的環境。 3.我開始用文字寫出過程的樣子。例如

別再這麼程式碼了,這幾個方法不香嗎?

JDK8 應該是 Java 中最堅挺一個版本,這個版本新增很多特性,讓我們開發起來多了很多便利。 不過最近 Review 專案程式碼的時候發現,雖然很多專案工程已經使用了 JDK8,但是工程程式碼卻很少使用到 JDK8 新特性、新方法。 如果單從程式碼正確性上來說,老方式寫法寫當然沒有什麼問題,那唯一的缺

【jQuery】結合accordion插件分析插件的方法及註意事項

als 參數 啟動 trigger 默認值 cto global efi each 1.jQuery插件的命名方式:jquery.[插件名].js 2.對象方法附加在jQuery.fn上,全局函數附加在jQuery對象本身上 3.插件內部this指向的是通過選擇器獲取的jQ

jscss()方法,記得加引號“ ”,除非是數字

pos 引號 index size z-index roi absolut fff dex js寫css()方法,記得加引號“ ”,除非是數字。如: $("#android").css({ "position": "absolute", "z-index":

Python讀excel表格的方法

python excel 表格 xls 目的:實現用python做excel的讀取、新增、修改操作。環境:ubuntu 16.04 Python 3.5.2用python讀寫文檔,一般是操作txt文件或者可以用記事本打開的文件,因為這個操作很直接,不需要導入其他模塊,但如果想要對excel表

java 讀文件常用方法

tools int big cti readline out 隨機 i++ utf package study.bigdata; import org.apache.commons.io.FileUtils; import org.apache.commons.io.I

Python讀excel表格的方法

python excel 讀寫表格 目的:實現用python的另一種方法做excel的讀取、新增操作。環境:ubuntu 16.04 Python 3.5.2情景:之前介紹了一種操作excel文件的方法(私鏈),現在使用另一種方法讀寫excel文件,一次性讀出或寫入,讀寫也很方便,讀出為有序字典

一個不需要Log4Net的日誌的簡單方法

filename stream lena creat test contex writer exists ndt 有些項目寫日誌時會選擇大名鼎鼎的Log4Net。而在我們使用它時,總會出現一些諸如版本不匹配而造成的寫日誌失敗的情況,還要改web.config,還要改Asse

Mac OSX原生讀NTFS功能開啟方法

ima 是你 bsp mac 需要 util 發現 find top macOX系統內建的NTFS支持默認只能讀不能寫 原生讀寫NTFS,需要自行終端命令手動開啟 1. 插上磁盤 此時Mac桌面應該會顯示出插入的磁盤,但是當你想把文件拖入磁盤的時候,發現是不能拖進去的

Nginx如何實現讀限流的方法

http height normal radi wrap border ret ola style 針對Nginx請求,單個IP,每秒50讀次,寫10次。萬能的Nginx,幾行配置搞定# 先定義好規則,需要寫在server外面 limit_req_zone $binary_