【學習筆記】python100例


#python3下進行實驗

#第一例:

題目:有四個數字:1、2、3、4,能組成多少個互不相同且無重復數字的三位數?各是多少?
程序分析:可填在百位、十位、個位的數字都是1、2、3、4。組成所有的排列后再去 掉不滿足條件的排列。

1 for a in range(1,5):                      
2     for b in range(1,5):                          
3         for c in range(1,5):
4             if (a != b) and (a != c) and (b != c):
5                 print(a,b,c)
方法一:
1 num=[1,2,3,4]
2 i=0
3 for a in num:
4     for b in num:
5         for c in num:
6             if (a!=b) and (b!=c) and (c!=a):
7                 i+=1
8                 print(a,b,c)
9 print('總數是:',i) 
方法二

 

#第二例:

題目:企業發放的獎金根據利潤提成。利潤(I)低於或等於10萬元時,獎金可提10%;利潤高於10萬元,低於20萬元時,低於10萬元的部分按10%提成,高於10萬元的部分,可提成7.5%;20萬到40萬之間時,高於20萬元的部分,可提成5%;40萬到60萬之間時高於40萬元的部分,可提成3%;60萬到100萬之間時,高於60萬元的部分,可提成1.5%,高於100萬元時,超過100萬元的部分按1%提成,從鍵盤輸入當月利潤I,求應發放獎金總數?

程序分析:請利用數軸來分界,定位。注意定義時需把獎金定義成長整型。

 1 i = int(input('凈利潤:'))
 2 arr = [1000000,600000,400000,200000,100000,0]
 3 rat = [0.01,0.015,0.03,0.05,0.075,0.1]
 4 r = 0
 5 for idx in range(0,6):
 6     if i>arr[idx]:
 7         r+=(i-arr[idx])*rat[idx]
 8         print((i-arr[idx])*rat[idx])
 9         i=arr[idx]
10 
11 print('應發獎金總數:',r)
方法一
 1 Bonus = 0;
 2 BonusRateList = [[100,0.010],[60,0.015],[40,0.030],[20,0.050],[10,0.075],[0,0.100]];
 3 
 4 Profit =  int(input('凈利潤:'));
 5 Profit /= 10000;
 6 
 7 for i in range(0, len(BonusRateList)) :
 8     if (Profit > BonusRateList[i][0]) :
 9         Bonus += ((Profit - BonusRateList[i][0]) * BonusRateList[i][1]);
10         Profit = BonusRateList[i][0];
11 
12 print (Bonus * 10000);
方法二

 

#第三例:

題目:一個整數,它加上100后是一個完全平方數,再加上168又是一個完全平方數,請問該數是多少?

程序分析:假設該數為 x。1、則:x + 100 = n2, x + 100 + 168 = m22、計算等式:m2 - n2 = (m + n)(m - n) = 1683、設置: m + n = i,m - n = j,i * j =168,i 和 j 至少一個是偶數4、可得: m = (i + j) / 2, n = (i - j) / 2,i 和 j 要么都是偶數,要么都是奇數。5、從 3 和 4 推導可知道,i 與 j 均是大於等於 2 的偶數。6、由於 i * j = 168, j>=2,則 1 < i < 168 / 2 + 1。7、接下來將 i 的所有數字循環計算即可

1 for i in range(1,85):
2     if 168 % i == 0:
3         j = 168 / i;
4         if  i > j and (i + j) % 2 == 0 and (i - j) % 2 == 0 :
5             m = (i + j) / 2
6             n = (i - j) / 2
7             x = n * n - 100
8             print(x)
方法一
1 for m in range(168):
2     for n in range(m):
3         if (m+n)*(m-n)==168:
4             x=n**2-100
5             print("符合條件的整數有:",x)
方法二
 1 #思路:根據題意可先求出所求數的最大范圍,並在范圍內部循環測試是否有滿足條件的數字,若有,則打印出來:
 2 
 3 
 4 i = 1
 5 #求出最大范圍
 6 while ((i+1)*(i+1)-i*i) <= 168:
 7       i += 1
 8 #循環測試並打印
 9 for j in range(1,i):
10     for k in range(1,i):     
11         if (k*k - j*j) == 168:
12             print(k*k-268)
方法三

 

 #第四例:

題目:輸入某年某月某日,判斷這一天是這一年的第幾天?

程序分析:以3月5日為例,應該先把前兩個月的加起來,然后再加上5天即本年的第幾天,特殊情況,閏年且輸入月份大於2時需考慮多加一天:

 
 1 year = int(input('year:\n'))
 2 month = int(input('month:\n'))
 3 day = int(input('day:\n'))
 4  
 5 months = (0,31,59,90,120,151,181,212,243,273,304,334)
 6 if 0 < month <= 12:
 7     sum = months[month - 1]
 8 else:
 9     print('data error')
10 sum += day
11 leap = 0
12 if (year % 400 == 0) or ((year % 4 == 0) and (year % 100 != 0)):
13     leap = 1
14 if (leap == 1) and (month > 2):
15     sum += 1
16 print('it is the %dth day.' % sum)
方法一
  1 #參考解法:
  2 
  3 #!/usr/bin/python
  4 # -*- coding: UTF-8 -*-
  5 
  6 #year=int(input("年:\n"))
  7 #month=int(input("月:\n"))
  8 #day=int(input("日:\n"))
  9 #months1=[0,31,60,91,121,152,182,213,244,274,305,335,366] #閏年
 10 #months2=[0,31,59,90,120,151,181,212,243,273,304,334,365] #平年
 11 
 12 #if ((year%4==0)and(year%100!=0)) or((year%100==0)and(year%400==0)):
 13 #    Dth=months1[month-1]+day
 14 #else:
 15 #    Dth=months2[month-1]+day
 16 #print("是該年的第%d天"% Dth)
 17 
 18 
 19 print('------------------------------------------------------------')
 20 
 21 
 22 #閏年需要同時滿足以下條件:
 23 
 24 #    1、年份能被4整除;
 25 #    2、年份若是 100 的整數倍的話需被400整除,否則是平年。
 26 
 27 # 輸入任意年月日,知道是改年第幾天
 28 
 29 #p = [31,28,31,30,31,30,31,31,30,31,30,31] # 平年
 30 #w = [31,29,31,30,31,30,31,31,30,31,30,31] # 閏年
 31 
 32 #year =int(input("請輸入年:"+'\n'))
 33 #month =int(input("請輸入月:"+'\n'))
 34 #day=int(input("請輸入日:"+'\n'))
 35 
 36 #arr=[31,28,31,30,31,30,31,31,30,31,30,31]
 37 #sum=day
 38 #for i in range(0,month-1):
 39 #    sum+=arr[i]
 40 #if year%4==0:
 41 #    if year%100==0 and year%400!=0:
 42 #        print("這是今年的第%d天" % sum)
 43 #    else:
 44 #        sum=sum+1
 45 #        print("這是今年的第%d天" % sum)
 46 #else: 
 47 #    print("這是今年的第%d天" % sum)
 48 
 49 print('---------------------------------------------------------------------')
 50 
 51 #參考解法:
 52 
 53 # 輸入任意年月日,知道是改年第幾天
 54 
 55 #p = [31,28,31,30,31,30,31,31,30,31,30,31] # 平年
 56 #w = [31,29,31,30,31,30,31,31,30,31,30,31] # 閏年
 57 
 58 #year =int(input("年:\n"))
 59 #month =int(input("月:\n"))
 60 #day =int(input("日:\n"))
 61 
 62 # 判斷閏年,平年
 63 
 64 #if year % 100 == 0:
 65 #    if year % 400 == 0:
 66 #        d=w
 67 #    else:
 68 #        d=p
 69 #else:
 70 #    if year % 4 == 0:
 71 #        d=w
 72 #    else:
 73 #        d=p
 74 
 75 # 計算天數
 76 
 77 #days = sum(d[0:month-1])+day
 78 #print("%d.%d.%d是%d年的第%s天。"%(year,month,day,year,days))
 79 
 80 print('--------------------------------------------------------------')
 81 
 82 
 83                   ###   這個方法好  ###
 84 #參考解法:
 85 
 86 #year = int(input('請輸入年份:'))
 87 #month = int(input('請輸入月份:'))
 88 #day = int(input('請輸入日期:'))
 89 #total = 0
 90 #if year%4 == 0:
 91 #    days = 29
 92 #else:
 93 #    days = 28
 94 #if year%4 == 0:
 95 #    print(year, '年是潤年,2月有', days, '天!')
 96 #else:
 97 #    print(year, '年是平年,2月有', days, '天!')
 98 #if month <= 1:
 99 #    total = day
100 #elif month == 2:
101 #    total = 31 + day
102 #else:
103 #    total = (month - 2) * 30 + days + month/2 + day
104 #print(year, '年',month, '月', day, '日,是這一年的第', total, '天!')
105 
106 
107 print('------------------------------------------------------------------')
108 
109 
110 #參考解法:
111 
112 def isLeapYear(a):
113     if (0 == a%4 or 0 == a%400) and 0 != a%100 :
114         return 1
115     else:
116         return 0
117 dict = {1: 31, 2: 28, 3: 31, 4: 30, 5: 31, 6: 30, 7: 31, 8: 31, 9: 30, 10: 31, 11: 30, 12: 31}
118 a = int(input("Input year:"))
119 b = int(input("Input month:"))
120 c = int(input("Input day:"))
121 m = 0
122 k = isLeapYear(a)
123 for i in range(1,b):
124     m = m + dict[i]
125 m = m + isLeapYear(a) + c
126 
127 print(m)
128 
129 print('----------------------------------------------------------------------')
130 
131 
132 #參考方法:
133 
134 year = int(raw_input('year:\n'))
135 month = int(raw_input('month:\n'))
136 day = int(raw_input('day:\n'))
137 days = [31,28,31,30,31,30,31,31,30,31,30,31]
138 if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0):
139     days[2] += 1
140 
141 now = sum(days[0:month-1])+day
142 print('it is the %dth day.' % now)
143 
144 
145 
146 
147 
148 
149 
150 print('----------------------------------------------------------------------')
151 
152 #參考方案:
153 
154 import time
155 import sys
156 
157 reload(sys)
158 sys.setdefaultencoding('utf-8')  # 設置 'utf-8'  
159 a = raw_input("輸入時間(格式如:2017-04-04):")
160 t = time.strptime(a,"%Y-%m-%d")
161 print(time.strftime("今年的第%j天",t).decode('utf-8'))
162 
163 print('----------------------------------------------------------------------')
164 
165 
166 #參考方法:
167 
168 import time
169 
170 D=raw_input("請輸入年份,格式如XXXX-XX-XX:")
171 d=time.strptime( D,'%Y-%m-%d').tm_yday
172 print("the {} day of this year!" .format(d))
173 
174 print('----------------------------------------------------------------------')
175 
176 
177 #Python3 參考解法:
178 
179 #!/usr/bin/python3
180 
181 date = input("輸入年月日(yyyy-mm-dd):")
182 y,m,d = (int(i) for i in date.split('-'))
183 sum=0
184 special = (1,3,5,7,8,10)
185 for i in range(1,int(m)):
186     if i == 2:
187         if y%400==0 or (y%100!=0 and y%4==0):
188             sum+=29
189         else:
190             sum+=28
191     elif(i in special):
192         sum+=31
193     else:
194         sum+=30
195 sum+=d
196 print("這一天是一年中的第%d天"%sum)
197 
198 
199 print('----------------------------------------------------------------------')
200 
201 #真正意義上自己思考寫出來的第一題,撒花*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。
202 
203 #!/usr/bin/python
204 # -*- coding: UTF-8 -*-
205 
206 i= int(input('請輸入年份:'))
207 j= int(input('請輸入月份:'))
208 k= int(input('請輸入天數:'))
209 month = [31,28,31,30,31,30,31,31,30,31,30,31]
210 day = 0
211 if i%4 == 0  or i %400 == 0 and i%100 != 0: #閏年
212     month = month[:j-1]
213     if j >2:    #大於2月份
214         day = sum(month)+1+k
215         
216     elif j== 2 and k ==29:    #剛好在閏年閏天
217         day = sum(month)+1+k
218         
219     else:                            
220         day = sum(month)+k
221 else:    #平年
222     month = month[:j-1]
223     day = sum(month)+k
224     
225 print('這一天是這一年的第{}天'.format(day))
226 
227 print('----------------------------------------------------------------------')
228 
229 參考方法:
230 
231 #!/usr/bin/env python
232 #-*- coding:utf-8 -*-
233 
234 import calendar
235 year = int(input("year: "))
236 month = int(input("month: "))
237 day = int(input("day: "))
238 days = 0
239 if 0 < month <= 12:
240     _, month_day = calendar.monthrange(year, month)
241     if day <= month_day:
242         for m in range(1, month):
243             _, month_day = calendar.monthrange(year, m)
244             days += month_day
245         days += day
246         print days
247     else:
248         print("input day error")
249 else:
250     print("input month error")
251     
252 print('----------------------------------------------------------------------')
253 
254 #通過計算輸入的日期與相應年份1月1日相差的秒數,然后除以每天的秒數3600*24,即可得到輸入日期的天數
255 
256 #!/usr/bin/env python3
257 
258 import time
259 
260 def datecount(date):
261     date0=date[0:4]+"-01-01"
262     datet=time.strptime(date,"%Y-%m-%d")     #將輸入的字符串轉化為時間元組
263     date0t=time.strptime(date0,"%Y-%m-%d")  
264     dates=time.mktime(datet)                #將時間元組轉化為時間戳
265     date0s=time.mktime(date0t)
266     count=(dates-date0s)/(3600*24)          #輸入日期的時間戳減當前年份0101的時間戳除以每天秒數
267     return count+1
268 
269 a=input("請輸入日期:格式如2017-06-16\n")
270 print("{}是{}年第{}天".format(a,a[0:4],int(datecount(a))))
271 
272 print('----------------------------------------------------------------------')
273 
274 #考慮實際的情況,比如輸入月份為13月或輸入天數為65天時候報錯(日期僅校對0-31天,未按照實際日期校對):
275 
276 #!/usr/bin/env python
277 #-*- coding:utf-8 -*-
278 
279 print('輸入年月日以查看某一日期是當年第幾天\n')
280 year = int(input('請輸入年份:\n'))
281 month = int(input('請輸入月份:\n'))
282 day = int(input('請輸入日期:\n'))
283 months = [31,28,31,30,31,30,31,31,30,31,30,31]
284 d = 0
285 
286 if 0<month<=12:
287     if 0<day<=31:
288         d = d + day
289         if month > 2:
290             if (year % 400 == 0) or ((year % 4 == 0) and (year % 100 != 0)):
291                 d = d + 1
292         for i in range(12):
293             if (i+1) < month:
294                 d = d + months[i]
295                 i = i + 1
296         print(d)
297     else:
298         print('輸入的日期有錯誤')
299 else:
300     print('輸入的月份有錯誤')
301 
302     
303 print('----------------------------------------------------------------------')
304 
305 #通過輸入時間點的unix時間戳和輸入年份首日的Unix時間戳之間的差,來計算經過的時間
306 
307 #coding=utf-8
308 import time
309 print "Please Enter full number just like 02 01 03"
310 y = int(raw_input('Enter the year:'))  #分別輸入年月日
311 m = int(raw_input('Enter the month:'))
312 d = int(raw_input('Enter the day:'))
313 a = (y,m,d,00,00,00,00,00,00)  #要求長度為9
314 b = (y,01,01,00,00,00,00,00,00)  #輸入年份的第一天
315 timestampa = time.mktime(a)      #兩個都轉換為Unix時間戳,即1970.1.1到現在經過的秒數
316 timestampb = time.mktime(b)
317 timec = int((timestampa - timestampb)/(3600*24))  #輸入的時間戳減去年份首天的時間戳等於經過的秒數,再換算成天,取整
318 print("There are {} days goes by!".format(timec))
319 
320 print('----------------------------------------------------------------------')
參考解法

 

#第五例:

題目:輸入三個整數x,y,z,請把這三個數由小到大輸出。

程序分析:我們想辦法把最小的數放到x上,先將x與y進行比較,如果x>y則將x與y的值進行交換,然后再用x與z進行比較,如果x>z則將x與z的值進行交換,這樣能使x最小。

1 l = []
2 for i in range(3):
3     x = int(input('integer:\n'))
4     l.append(x)
5 l.sort()
6 print(l)
方法一
  1 #其他參考解法:
  2 
  3 #!/usr/bin/python
  4 # -*- coding: UTF-8 -*-
  5 
  6 x = int(input("x:"))
  7 y = int(input("y:"))
  8 z = int(input("z:"))
  9 a = {"x":x,"y":y,"z":z}  #字典
 10 print('--------分割線--------')
 11 for w in sorted(a, key=a.get):  #a.get是字典的用法,字典有key鍵,vlaue值
 12     print(w, a[w])
 13 
 14 print('======================================================')
 15 #參考解法:
 16 
 17 
 18 a=[1,3,5,2,4,5,7]
 19 
 20 n=len(a)
 21 
 22 for i in range(0,n):
 23   for j in range(i,n) :
 24      if (a[i] >= a[j] ):
 25          tmp =a[i]
 26          a[i]=a[j]
 27          a[j]=tmp
 28 
 29 print(a)
 30 print('======================================================')
 31 #參考解法:
 32 
 33 
 34 x= input("int1:")
 35 y= input("int2:")
 36 Max = max(x,y)
 37 Min = min(x,y)
 38 z= input("int3:")
 39 if z > Max :
 40     print(Min,Max,z)
 41 elif z < Min :
 42     print(z,Min,Max)
 43 else :
 44     print(Min,z,Max)
 45 print('======================================================')
 46 #Python3.x 版本下使用利用冒泡排序方法:
 47 
 48 #!/usr/bin/env python3
 49 
 50 # 利用冒泡排序方法
 51 def Sort(list):
 52     n = len(list)
 53     for i in range(1, n):
 54         # 一次次的將最大的學出來
 55         for j in range(1, n - i + 1):
 56             if list[j - 1] > list[j]:
 57                 list[j - 1], list[j] = list[j], list[j - 1]
 58             # 打印排序過程
 59             print(list)
 60     for i in range(0, n):
 61         print(list[i])
 62 
 63 # 讀入數據
 64 def inputData():
 65     list_first = []
 66     while True:
 67         a = input("please input num:".strip())
 68         if len(a) == 0:
 69             return list_first
 70         else:
 71             list_first.append(int(a))
 72 
 73 if __name__ == '__main__':
 74     lt = inputData()
 75     print(lt)
 76     Sort(lt)
 77 print('======================================================')
 78 
 79 #使用 列表 sort=,可接受參數 reverse,默認為布爾值 false,按升序排序,設置為 true 則按降序排序
 80 
 81 #!/usr/bin/python
 82 # -*- coding: UTF-8 -*-
 83 
 84 x = int(input('x='))
 85 y = int(input('y='))
 86 z = int(input('z='))
 87 num = [x, y, z]
 88 num.sort()          # 對列表進行升序排序
 89 print('這三個數由小到大的順序為:',num)
 90 rnum = [x, y, z]                  # 對列表進行降序排序
 91 rnum.sort(reverse=True)
 92 print('這三個數由大到小的順序為:',rnum)
 93 
 94 print('======================================================')
 95 #參考方法:
 96 
 97 #!/usr/bin/env python
 98 #coding:utf-8
 99 
100 D=input("請輸入三個數字,格式如 'a,b,c':")
101 li=D.split(",")
102 li2=[int(i) for i in li]
103 li2.sort()
104 print(li2)
105 
106 print('======================================================')
107 
108 #對輸入類型進行了控制,如果輸入錯誤,就提示用戶,讓用戶再次輸入,直到正確輸入整數為止。
109 
110 #!/usr/bin/env python
111 #coding:utf-8
112 #輸入三個整數x,y,z,請把這三個數由小到大輸出。
113 while 1:
114     try:
115         x = int(input("plz input x: "))
116         y = int(input("plz input y: "))
117         z = int(input("plz input z: "))
118         list1 = [x, y, z]
119         print(sorted(list1))
120         break
121     except:
122         print("請輸入整數")
123 print('======================================================')
124 #參考方法:
125 
126 #! /usr/bin/python
127 # -*- coding:UTF-8 -*-
128 a = int(input("請輸入:"))
129 b = int(input("請輸入:"))
130 c = int(input("請輸入:"))
131 if a>b and a>c:
132     x = a
133     a = c
134 elif b>a and b>c:
135     x = b
136     b = c
137 else:
138     x = c
139 if a>b:
140     print(b,a,x)
141 else:
142     print(a,b,x)
143     
144 print('======================================================')
145 
146 #參考方法:
147 
148 #!/usr/bin/python
149 # -*- coding: UTF-8 -*-
150 
151 x = int(input('x->'))
152 y = int(input('y->'))
153 z = int(input('z->'))
154 arr = [x,y,z]
155 for i in range (0,3):
156     for o in range (0,3):
157         for p in range (0,3):
158             if arr[i] > arr[o] > arr[p]:
159                 print(arr[i],arr[o],arr[p])
160 
161 
162 print('======================================================')
163 
164 
165 #參考方法:
166 
167 # -*- coding: utf-8 -*-
168 
169 import numpy as np
170 x=int(input('請輸入一個整數:\n'))
171 y=int(input('請輸入一個整數:\n'))
172 z=int(input('請輸入一個整數:\n'))
173 l = [x,y,z]
174 for i in range(len(l)):
175     a = np.argmin(l)
176     print(l[a])
177     del l[a]
參考解法

 

#第六例:

題目:斐波那契數列。


程序分析:斐波那契數列(Fibonacci sequence),又稱黃金分割數列,指的是這樣一個數列:0、1、1、2、3、5、8、13、21、34、……。

在數學上,費波那契數列是以遞歸的方法來定義:

F0 = 0     (n=0)
F1 = 1    (n=1)
Fn = F[n-1]+ F[n-2](n=>2)

 1 '''
 2 #使用數學的通項公式:
 3 
 4 # 輸出第n個數
 5 
 6 n = int(input("第幾個數: "))
 7 
 8 # 斐波那契數列的通項公式
 9 f =(1/(5**0.5))*(((1+(5**0.5))/2)**n - ((1-(5**0.5))/2)**n)
10 print("第%d個數:"%n,int(f))
11 
12 # 輸出前n個數列:
13 l=[1]
14 for i in range(1,n+1):
15     f=(1/(5**0.5))*(((1+(5**0.5))/2)**i - ((1-(5**0.5))/2)**i)
16     l.append(int(f))
17 
18 
19 print("==================")
20 #斐波拉契數列---使用生成器
21 def fib(max):
22     n,a,b = 0,0,1
23     while n < max:
24         yield b
25         a,b = b,a+b
26         n += 1
27 max = int(input('input max num :'))
28 for n in fib(max):
29     print(n)
30 
31 print("==============================")
32 '''
33 list = []
34 a = 1
35 list.append(a)    # 第一個
36 b = 1
37 list.append(b)    # 第二個
38 for i in range(1,20):  # 再輸出接下來的 19 個
39     c = list[i-1]+list[i]
40     list.append(c)
41 print(list)   # 輸出 21 個
42 
43 
44 print("==================")
45 #這種函數應該使用修飾器加上緩存
46 
47 #!/usr/bin/python3
48 
49 from functools import lru_cache
50 
51 @lru_cache(None)
52 def f(n):
53     assert n >= 0
54     return n if n <= 1 else f(n - 1) + f(n - 2)
55 
56 
57 print(f(10))
58 
59 print("====")
60 #Python3 下參考方法:
61 
62 #!/usr/bin/env python3
63 # -*- coding:utf-8 -*-
64 
65 class Fibs:
66     def __init__(self, n = 10):
67         self.a = 0
68         self.b = 1
69         self.n = n
70         self.i = 0
71     def __iter__(self):
72         return self
73     def __next__(self):
74         self.a, self.b = self.b, self.a+self.b
75         self.i += 1
76         if self.i > self.n:
77             raise StopIteration
78         return self.a
79 fibs=Fibs(10)
80 for i in fibs:
81     print (i)
82 
83 
84 print("==================")
85 fe_list = [0, 1]
86 for i in range(1,11):
87     fe_list.append(sum(fe_list[(i-1):(i+1)]))
88 
89 print(fe_list)
多種解法
  1 #方法一:
  2 '''
  3 def fib(n):
  4     a,b = 1,1
  5     print(a,b)
  6     for i in range(n-1):
  7         a,b = b,a+b
  8         print(a,b)
  9     return a
 10 
 11 # 輸出了第10個斐波那契數列
 12 print(fib(10))
 13 '''
 14 print("=========================")
 15 for i in range(3):
 16     print(i)
 17     
 18 print("=============")
 19 
 20 # 使用遞歸
 21    #PS:遞歸有很多重復計算,比方說你計算f(5)時要去計算f(4)和f(3),
 22    #而計算f(4)時又要去計算f(3),這樣f(3)就重復計算了
 23 
 24 def fib(n):
 25     if n==1 or n==2:
 26         return 1
 27     return fib(n-1)+fib(n-2)
 28  
 29 # 輸出了第10個斐波那契數列
 30 print(fib(10))  #如果這里數字改成0那么他會無限遞歸
 31 
 32 #解析
 33 #次數     return的值
 34 #fib(1)         1
 35 #fib(2)         1
 36 #fib(3)      2+1=1+1=2   #fib(2)+fib(1)=1+1=2
 37 #4           3+2=2+1=3
 38 #5           4+3=3+2=5
 39 
 40 #結果:1,1,2,3,5
 41 '''
 42 for a in range(fib(10)):
 43     print(a)
 44 
 45 print(fib(1))
 46 print(fib(2))
 47 print(fib(3))
 48 print(fib(4))
 49 print(fib(5))
 50 print(fib(6))
 51 print(fib(7))
 52 print(fib(8))
 53 print(fib(9))
 54 print(fib(10))
 55 '''
 56 
 57 print("============================")
 58 
 59 #方法三
 60 #迭代
 61 def fib(n):
 62     if n == 1:
 63         return [1]
 64     if n == 2:
 65         return [1, 1]
 66     fibs = [1, 1]
 67     for i in range(2, n):
 68         print(i)
 69         fibs.append(fibs[-1] + fibs[-2])  #-1,-2分別意味着列表里的倒數第一個,倒數第二個數
 70         print(fibs)
 71     return fibs
 72  
 73 # 輸出前 10 個斐波那契數列
 74 print("哎嘿")
 75 print(fib(10))
 76 
 77 #解析:
 78 #上面的結果為:(根據fibs.append(fibs[-1] + fibs[-2])得出)
 79 #2
 80 #[1, 1, 2] #1+2=3迭代給下面
 81 #3
 82 #[1, 1, 2, 3]  #2+3=5迭代給下面
 83 #4
 84 #[1, 1, 2, 3, 5]#...
 85 #5
 86 #[1, 1, 2, 3, 5, 8]#.....
 87 #6
 88 #[1, 1, 2, 3, 5, 8, 13] #8+13=21迭代給下面
 89 #7
 90 #[1, 1, 2, 3, 5, 8, 13, 21]
 91 #8
 92 #[1, 1, 2, 3, 5, 8, 13, 21, 34]
 93 #9
 94 #[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
 95 
 96 #for b in range(2,5):
 97 #    print(b)
 98 
 99 print("==============")
100 #使用迭代會更加高效,以下函數會返回一個列表:
101 
102 def fibo(num):
103     numList = [0,1]
104 
105     for i in range(num - 2):
106         numList.append(numList[-2] + numList[-1])
107     return numList
108 print(fibo(10))
109 
110 #另外一種方式如下,該函數只返回某一項:
111 
112 def fibo(n):
113     x, y = 0, 1
114 
115     while(n):
116         x,y,n = y, x+y, n - 1
117     return x
118 print(fibo(10))
119 
120 #采用尾遞歸的方式來編寫
121 
122 def fibo(n):
123     def fib_iter(n,x, y):
124         if n == 0:
125             return x
126         else:
127             return fib_iter(n-1, y, x+y)
128 
129     return fib_iter(n, 0, 1)
130 
131 print(fibo(10))
參考解法

 

 #第七例:

題目:將一個列表的數據復制到另一個列表中。
程序分析:使用列表[:]。

1 a = [1, 2, 3]
2 b = a[:]
3 print(b)
方法一
  1 '''
  2 使用 Python2 的參考解法:
  3 
  4 >>> import copy
  5 >>> a = [1, 2, 3]
  6 >>> b=copy.copy(a)
  7 >>> print(b)
  8 [1, 2, 3]
  9 
 10 使用 Python3 的參考解法:
 11 
 12 >>> a = [1, 2, 3]
 13 >>> b=a.copy()
 14 >>> print(b)
 15 [1, 2, 3]
 16 '''
 17 
 18 #pythou3
 19 
 20 a = [1,2,3]
 21 b = a.copy()
 22 print(b)
 23 
 24 print("========")
 25 
 26 #使用 for 循環出列表元素,並逐以放到新的列表中:
 27 l = [1,2,3,4,5]
 28 p = []
 29 for i in range(len(l)):    
 30     p.append(l[i])
 31 print(p)
 32 
 33 print("========")
 34 
 35 #使用列表生成式:
 36 
 37 a=[1,2,3,4]
 38 b=[i for i in a]
 39 print(b)
 40 
 41 print("========")
 42 
 43 """將一個列表的數據復制到另一個列表中。"""
 44 
 45 """
 46 使用[:]
 47 
 48 """
 49 
 50 a = [1,2,3]
 51 b = a[:]
 52 print(b)       # 將a的數據賦值給b 當a的數值發生改變時b不變
 53 
 54 print("#")
 55 
 56 a = [1,2,3]
 57 b = a
 58 print(b)       # 將a的地址賦值給b 當a的數值發生改變時b隨之改變
 59 
 60 print("#")
 61 
 62 a = [1,2,3]
 63 b = a[:]
 64 print(b)
 65 a[0] = 0
 66 print(a)        # 將a的數據賦值給b 當a的數值發生改變時b不變
 67 print(b)
 68 
 69 print("#")
 70 
 71 a = [1,2,3]
 72 b = a
 73 print(b)
 74 a[0] = 0
 75 print(a)         # 將a的地址賦值給b 當a的數值發生改變時b隨之改變
 76 print(b)
 77 
 78 print("===================")
 79 
 80 a=[1,2,3,4,5]
 81 b=list()
 82 for i in a:b.append(i)
 83 print(b)
 84 
 85 print("===================")
 86 
 87 #表1拓展到表2中
 88 
 89 list1 = [1,2,3]
 90 list2=[]
 91 list2.extend(list1)
 92 print(list2)
 93 list1[0] = 0
 94 print(list1)
 95 print(list2)
 96 
 97 
 98 
 99 print("===================")
100 
101 #補充一個深拷貝與淺拷貝的問題
102 '''
103 >>> import copy
104 >>> a = [1,2,3,4,5]
105 >>> b = ["A","B",a]
106 >>> #淺拷貝
107 >>> c = b[:]
108 >>> c
109 ['A', 'B', [1, 2, 3, 4, 5]]
110 >>> a[0] = 11
111 >>> c
112 ['A', 'B', [11, 2, 3, 4, 5]]
113 >>> #此時a變化c跟着變化
114 >>> #深拷貝
115 >>> c = copy.deepcopy(b)
116 >>> c
117 ['A', 'B', [11, 2, 3, 4, 5]]
118 >>> a[0] = 111
119 >>> a
120 [111, 2, 3, 4, 5]
121 >>> c
122 ['A', 'B', [11, 2, 3, 4, 5]]
123 >>> #此時c中數據不受a影響
124 >>>
125 
126 '''
參考解法

 

#第八例:

題目:輸出 9*9 乘法口訣表。
程序分析:分行與列考慮,共9行9列,i控制行,j控制列。

 1 '''
 2 for i in range(1, 10):
 3     for j in range(1, i+1):
 4         print("%d*%d=%d" % (i, j, i*j))
 5 
 6 '''
 7 
 8 
 9 #python3改版
10 
11 
12 for i in range(1, 10):
13     for j in range(1, i+1):                        #end='\t' 作用是使代碼在同一行,並且代碼之間有空行,取消了換行的作用。
14         print("%d*%d=%d" % (i, j, i*j),end='\t') #\t可以換成空格一行,但是用\t,打印出來的表更好看
15     print(" ")  #與一個for對齊了,起到了換行的作用。
方法一
 1 '''
 2  #使用 Python3 測試輸出 9*9 乘法口訣表。
 3 
 4 #使用while循環。
 5 
 6 #!/usr/bin/python3
 7 i=0
 8 j=0
 9 while i<9:
10     i+=1
11     while j<9:
12         j+=1
13         print(j,"x",i,"=",i*j,"\t",end="")
14         if i==j:
15             j=0  #清零    #該方法與下面的方法原理是一樣的
16             print("")
17             break
18 #使用for循環:
19 
20 for i in range(1,10):
21     for j in range(1,10):
22         print(j, "x", i, "=", i * j,"\t",end="")
23         if i==j:
24             #print(i,j)   #這一句就可以理解了
25             print("")#這里也起到的換行的作用。
26             break
27 
28 print("=================")
29 #Python3 參考解法:
30 
31 #!/usr/bin/python3
32 
33 for i in range(1,10):
34     for j in range(1,i+1):
35         print("%d*%d=%d" % (i,j,i*j),end=" ")
36     print()
37 '''
38 print("=================")
39 
40 for i in range(1,10):
41     l=[]
42     for j in range(1,i+1):
43         l.append(str(j)+"*"+str(i)+"="+str(i*j))
44     print("\t".join(l)) #join函數
45 
46 print("=================")
47 
48 #Python2.x 與 Python3.x 兼容方法:
49 
50 #!/usr/bin/python
51 # -*- coding: UTF-8 -*-
52 
53 ls = []
54 for i in range(9):
55     s = []
56     for j in range(i+1):
57         s.append("{}*{}={}".format(i+1, j+1, (i+1)*(j+1)))#因為i,j都是從0開始的所以要都加上1
58     s = ' '.join(s)
59     ls.append(s)
60     if i != 8:
61         ls.append('\n')
62 print(''.join(ls))
63 
64 print("=================")
65 
66 #Python3 測試實例:
67 
68 for j in range(9):
69     i = 1
70     j = j + 1
71     while(i<=j):
72         s = j*i
73         print('%dx%d=%d'%(i,j,s),end=' ')
74         i = i + 1
75     print(' ')
76 
77 print("=================")
78 
79 #Python3 測試:
80 
81 for i in range(1,10):
82     for j in range(1,i+1):
83         k=i*j
84         print('{}*{}={}'.format(j,i,k),end='\t')
85     print('')
參考解法
 1 '''
 2 i = 1
 3 while i<9:
 4     #i+=1
 5     for j in range(1,10):
 6         print("%d*%d=%d" % (i,j,i*j),end="\t")
 7     #print("")
 8     i+=1
 9 print("")
10 '''
11 
12 
13 j=1
14 i = 1
15 while i<=9:
16     #i+=1
17     for j in range(1,j+1):
18         print("%d*%d=%d" % (i,j,i*j),end="\t")
19         j +=1
20     #print("")
21     i+=1
22     print("")
23 #print("")
24 
25 print("\n")
26 print("=======================兩種不同的乘法表==========================")
27 print("\n")
28 
29 j=1
30 i = 1
31 while i<=9:
32     for j in range(1,j+1):
33         print("%d*%d=%d" % (j,i,i*j),end="\t") #這里注意i與j的位置換一下
34         j +=1
35     i+=1
36     print("")
先while后for版

 

 #第九例:

 題目:暫停一秒輸出。
程序分析:使用 time 模塊的 sleep() 函數。

1 import time
2  
3 myD = {1: 'a', 2: 'b'}
4 for key, value in dict.items(myD):
5     print(key, value)
6     time.sleep(1) # 暫停 1 秒
方法一
1 #每隔一秒輸出列表一個元素:
2 
3 import time
4 
5 l=[1,2,3,4]
6 for i in range(len(l)):
7     print(l[i])
8     time.sleep(1)  # 暫停一秒輸出
參考解法

 

#第十例:

題目:暫停一秒輸出,並格式化當前時間。
程序分析:無。

1 import time
2  
3 print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))
4  
5 # 暫停一秒
6 time.sleep(1)
7  
8 print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))
方法一
1 import time,datetime
2 
3 
4 TIME = datetime.datetime.now()
5 print(TIME.strftime("%Y.%m.%d %H-%M-%S"))
6 
7 time.sleep(1)
8 TIME = datetime.datetime.now()
9 print(TIME.strftime("%Y.%m.%d %H-%M-%S"))
參考解法

 

 附贈:Python100經典練習題------若鏈接掛了,請提醒我。

鏈接:https://pan.baidu.com/s/1l6R4KnHNJ7eGBzUqQ-sSXQ 密碼:fz1x

#待續:


免責聲明!

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



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