【学习笔记】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