【每天學點Python】案例四:52周存錢挑戰


52周存錢挑戰

V1.0初步實現

案例描述:

  • 52周存錢法,即52周階梯式存錢法,是國際上非常流行的存錢方法。
  • 按照52周存錢法,存錢的人必須在一年52周內,每周遞周10元
  • 例子:
    • 第一周存10元,第二周存20元,第三周存30元,一直到第52周存520元,這樣一年下來會有多少錢呢?
    • 10+20+30+40+...+520 = 13780

上機實驗:

 1 """
 2     作者:王鑫正
 3     功能:52周存錢挑戰
 4     版本:1.0
 5     日期:2018年9月21日
 6 """
 7 
 8 
 9 def main():
10     """
11        主函數
12     """
13     money_per_week = 00     # 每周的存入的金額
14     num_week = 1            # 記錄周數
15     increase_money = 10     # 遞增的金額
16     total_week = 52         # 總共的周數
17     saving = 0              # 賬戶累計
18 
19     while num_week <= total_week:
20         # 存錢操作
21         saving += money_per_week
22 
23         # 輸出信息
24         print('第{}周,存入{}元,賬戶累計{}元'.format(num_week, money_per_week, saving))
25 
26         # 更新下一周的存錢金額
27         money_per_week += increase_money
28         num_week += 1
29 
30 
31 if __name__ == '__main__':
32     main()
View Code

 


V2.0增加功能:記錄每周的存款數

上機實驗:

 1 """
 2     作者:王鑫正
 3     功能:52周存錢挑戰
 4     版本:2.0
 5     日期:2018年9月21日
 6     2.0新增功能:記錄每周的存款數
 7 """
 8 import math
 9 
10 def main():
11     """
12        主函數
13     """
14     money_per_week = 10     # 每周的存入的金額
15     num_week = 1            # 記錄周數
16     increase_money = 10     # 遞增的金額
17     total_week = 52         # 總共的周數
18     saving = 0              # 賬戶累計
19 
20     money_list = []         # 記錄每周存款數的列表
21 
22     while num_week <= total_week:
23         # 存錢操作
24         # saving += money_per_week
25 
26         money_list.append(money_per_week)
27         saving = math.fsum(money_list)
28 
29         # 輸出信息
30         print('第{}周,存入{}元,賬戶累計{}元'.format(num_week, money_per_week, saving))
31 
32         # 更新下一周的存錢金額
33         money_per_week += increase_money
34         num_week += 1
35 
36 
37 if __name__ == '__main__':
38     main()
View Code

補充說明:

1. 列表

  • 列表(list)是有序的元素集合
  • 可通過索引訪問單個元素,如l[2],l[-1]
  • 可通過區間索引訪問子列表內容,如l[2:5],l[-3:]
  • 列表中每個元素類型可以不同

2. 列表操作符

操作符 含義
list1 + list2 合並(連接)兩個列表
list1 * n  重復n次列表內容
len(list1)  返回列表長度(元素個數)
in list1 檢查元素是否在列表中
list.append(x) 將某個元素添加到列表的末尾
list.sort() 對列表元素排序
list1.reverse() 將列表元素逆序
list1.index(x) 返回第一次出現元素x的索引值
list1.insert(i,x) 在位置i處插入新元素x
list1.count(x) 返回元素x在列表中數量
list1.remove(x) 刪除列表中第一次出現的元素x
list1.pop(i) 取出列表中i位置上的元素,並將其刪除

 3. math庫

函數 含義
math.pi 圓周率
math.ceil(x) 對x向上取整
math.floor(x) 對x向下取整
math.pow(x,y) x的y次方
math.sqrt(x) x的平方根
math.fsum(list1) 對集合內的元素求和

 


V3.0增加功能:使用循環直接計數

上機實驗:

 1 """
 2     作者:王鑫正
 3     功能:52周存錢挑戰
 4     版本:3.0
 5     日期:2018年9月21日
 6     3.0新增功能:使用循環直接計數
 7 """
 8 import math
 9 
10 
11 def main():
12     """
13        主函數
14     """
15     money_per_week = 10     # 每周的存入的金額
16     increase_money = 10     # 遞增的金額
17     total_week = 52         # 總共的周數
18 
19     money_list = []         # 記錄每周存款數的列表
20 
21     for num_week in range(total_week):
22         money_list.append(money_per_week)
23         saving = math.fsum(money_list)
24 
25         # 輸出信息
26         print('第{}周,存入{}元,賬戶累計{}元'.format(num_week + 1, money_per_week, saving))
27 
28         # 更新下一周的存錢金額
29         money_per_week += increase_money
30 
31 
32 if __name__ == '__main__':
33     main()
View Code

補充說明:

1. for循環

  • 使用for語句可以循環遍歷整個序列的內容

    for <x> in <list>

      <body>

  • 循環變量x在每次循環時,被賦值成對應的元素內容
  • 與while循環的區別
    • for循環的次數固定,即所遍歷的序列長度
    • while為無限循環
  • range(n)返回一個可迭代的對象
    • list(range(n))將迭代類型轉換為列表類型

 


 V4.0增加功能:靈活設置每周的存錢數,增加的存款數及存款周數

上機實驗:

 1 """
 2     作者:王鑫正
 3     功能:52周存錢挑戰
 4     版本:4.0
 5     日期:2018年9月21日
 6     4.0新增功能:靈活設置每周的存錢數,增加的存款數及存款周數
 7 """
 8 import math
 9 
10 
11 def save_money_in_n_weeks(money_per_week, increase_money, total_week):
12     """
13         計算n周內的存款金額
14     """
15     money_list = []  # 記錄每周存款數的列表
16 
17     for num_week in range(total_week):
18         money_list.append(money_per_week)
19         saving = math.fsum(money_list)
20 
21         # 輸出信息
22         print('第{}周,存入{}元,賬戶累計{}元'.format(num_week + 1, money_per_week, saving))
23 
24         # 更新下一周的存錢金額
25         money_per_week += increase_money
26 
27     return saving
28 
29 
30 def main():
31     """
32        主函數
33     """
34     money_per_week = float(input('請輸出每周的存入的金額:'))          # 每周的存入的金額
35     increase_money = float(input('請輸出每周的遞增金額:'))        # 遞增的金額
36     total_week = int(input('請輸出總共的周數:'))                 # 總共的周數
37 
38     # # 局部變量
39     # saving = 0
40 
41     saving = save_money_in_n_weeks(money_per_week, increase_money, total_week)
42     print('總的存款金額:', saving)
43 
44 
45 if __name__ == '__main__':
46     main()
View Code

補充說明:

1. 函數的參數傳遞

  • 函數通過參數與調用程序傳遞信息
  • 變量的作用范圍
    • 局部,函數內的變量作用范圍只在函數內
    • 全局,函數外的變量,在所有函數中都能使用
  • 函數的形參只接收實參的值,給形參賦值並不影響實參
  • 函數內使用定義的全局變量,需用global在函數內申明

 


V5.0增加功能:根據用戶輸入的日期,判斷是一年中的第幾周,然后輸出相應的存款金額

案例分析:

每一周存的錢放到列表里,通過第幾周直接獲取對應的存款金額

上機實驗:

 1 """
 2     作者:王鑫正
 3     功能:52周存錢挑戰
 4     版本:5.0
 5     日期:2018年9月21日
 6     5.0新增功能:根據用戶輸入的日期,判斷是一年中的第幾周,然后輸出相應的存款金額
 7 """
 8 import math
 9 import datetime
10 
11 
12 def save_money_in_n_weeks(money_per_week, increase_money, total_week):
13     """
14         計算n周內的存款金額
15     """
16     money_list = []        # 記錄每周存款數的列表
17     saved_money_list = []  # 記錄每周的賬戶累計
18 
19     for num_week in range(total_week):
20         money_list.append(money_per_week)
21         saving = math.fsum(money_list)
22         saved_money_list.append(saving)
23 
24         # 輸出信息
25         print('第{}周,存入{}元,賬戶累計{}元'.format(num_week + 1, money_per_week, saving))
26 
27         # 更新下一周的存錢金額
28         money_per_week += increase_money
29 
30     print()
31 
32     return saved_money_list
33 
34 
35 def main():
36     """
37        主函數
38     """
39     money_per_week = float(input('請輸出每周的存入的金額:'))          # 每周的存入的金額
40     increase_money = float(input('請輸出每周的遞增金額:'))            # 遞增的金額
41     total_week = int(input('請輸出總共的周數:'))                      # 總共的周數
42 
43     saved_money_list = save_money_in_n_weeks(money_per_week, increase_money, total_week)
44 
45     input_data_str = input('請輸入日期(yyyy-mm-dd):')
46     input_data = datetime.datetime.strptime(input_data_str, format('%Y-%m-%d'))  # 要解析的需要和上面輸入的對應
47 
48     week_num = input_data.isocalendar()[1]
49     print('第{}周的存款:{}'.format(week_num, saved_money_list[week_num - 1]))
50 
51 
52 if __name__ == '__main__':
53     main()
View Code

補充說明:

1. datetime庫

  • 處理時間的標准函數庫datetime
  • datetime.now()獲取當前日期和時間
  • 字符串->datetime
    • datetime.strptime(),解析時間字符串
  • datetime->字符串
    • 格式化datetime為字符串顯示
  • isocalendar(),返回年,周數,及周幾


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM