Skip to content

Commit 94a6b85

Browse files
committed
p3
1 parent 5ded379 commit 94a6b85

File tree

3 files changed

+228
-42
lines changed

3 files changed

+228
-42
lines changed

205.md

Lines changed: 147 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,33 @@
22
33
#函数练习
44

5-
已经学习了函数的基本知识,现在练习练习。完成下面练习的原则:
5+
仅仅知道函数的知识,是远远不够的,必须要勤练习、多敲代码,才能有体会,熟能生巧,熟能有感悟。
66

7-
1. 请读者先根据自己的设想写下代码,然后运行调试,检查得到的结果是否正确
7+
首先声明,一下对每个问题的解决方案,不一定是最优的。
8+
9+
读者在完成本节练习的时候,请遵守如下规则(全看你的自我控制能力了,自控能力强的胜出,不要欺骗哦,因为上帝在看着你呢):
10+
11+
1. 先根据自己的设想写下代码,然后运行调试,检查得到的结果是否正确
812
2. 我也给出参考代码,但是,参考代码并不是最终结果
9-
3. 读者可以在上述基础上对代码进行完善
13+
3. 可以在上述基础上对代码进行完善
1014
4. 如果读者愿意,可以将代码提交到github上,或者到我的QQ群(群号:26913719)中跟大家分享讨论
1115

1216
##解一元二次方程
1317

14-
解一元二次方程,是初中数学中的基本知识,一般来讲解法有:公式法、因式分解法等。读者可以根据自己的理解,写一段求解一元二次方程的程序。
18+
解一元二次方程,是初中数学中的基本知识,一般来讲解法有公式法、因式分解法等。读者可以根据自己的理解,写一段求解一元二次方程的程序。
1519

1620
最简单的思路就是用公式法求解,这是普适法则(普世法则?普适是否等同于普世?)。
1721

18-
古巴比伦留下的陶片显示,在大约公元前2000年(2000BC)古巴比伦的数学家就能解一元二次方程了。在大约公元前480年,中国人已经使用配方法求得了二次方程的正根,但是并没有提出通用的求解方法。公元前300年左右,欧几里得提出了一种更抽象的几何方法求解二次方程。
22+
>古巴比伦留下的陶片显示,在大约公元前2000年(2000BC)古巴比伦的数学家就能解一元二次方程了。在大约公元前480年,中国人已经使用配方法求得了二次方程的正根,但是并没有提出通用的求解方法。公元前300年左右,欧几里得提出了一种更抽象的几何方法求解二次方程。
1923
20-
7世纪印度的婆罗摩笈多(Brahmagupta)是第一位懂得用使用代数方程,它同时容许有正负数的根。
24+
>7世纪印度的婆罗摩笈多(Brahmagupta)是第一位懂得用使用代数方程,它同时容许有正负数的根。
2125
22-
11世纪阿拉伯的花拉子密 独立地发展了一套公式以求方程的正数解。亚伯拉罕·巴希亚(亦以拉丁文名字萨瓦索达著称)在他的著作Liber embadorum中,首次将完整的一元二次方程解法传入欧洲。。(源自《维基百科》)
26+
>11世纪阿拉伯的花拉子密 独立地发展了一套公式以求方程的正数解。亚伯拉罕·巴希亚(亦以拉丁文名字萨瓦索达著称)在他的著作Liber embadorum中,首次将完整的一元二次方程解法传入欧洲。。(源自《维基百科》)
2327
2428
参考代码:
2529

30+
Python 2:
31+
2632
#!/usr/bin/env python
2733
# coding=utf-8
2834

@@ -54,42 +60,81 @@
5460
else:
5561
print "this equation has no solution."
5662

63+
Python 3:
64+
65+
#!/usr/bin/env python
66+
# coding=utf-8
67+
68+
"""
69+
solving a quadratic equation
70+
"""
71+
72+
import math
73+
74+
def quadratic_equation(a,b,c):
75+
delta = b*b - 4*a*c
76+
if delta<0:
77+
return False
78+
elif delta==0:
79+
return -(b/(2*a))
80+
else:
81+
sqrt_delta = math.sqrt(delta)
82+
x1 = (-b + sqrt_delta)/(2*a)
83+
x2 = (-b - sqrt_delta)/(2*a)
84+
return x1, x2
85+
if __name__ == "__main__":
86+
print("a quadratic equation: x^2 + 2x + 1 = 0")
87+
coefficients = (1, 2, 1)
88+
roots = quadratic_equation(*coefficients)
89+
if roots:
90+
print("the result is:{}".format(roots))
91+
else:
92+
print("this equation has no solution.")
93+
5794
保存为20501.py,并运行之:
5895

5996
$ python 20501.py
6097
a quadratic equation: x^2 + 2x + 1 = 0
6198
the result is: -1.0
6299

63-
能够正常运行,求解方程
100+
得到了方程的根
64101

65-
但是,如果再认真思考,发现上述代码是有很大改进空间的。至少我发现
102+
但是,如果再认真思考,发现上述代码是有很大改进空间的:
66103

67104
- 如果不小心将第一个系数(a)的值输入了0,程序肯定会报错。如何避免之?要记住,任何人的输入都是不可靠的。
68105
- 结果貌似只能是小数,这在某些情况下是近似值,能不能得到以分数形式表示的精确结果呢?
69-
- 复数,python是可以表示复数的,如果delta<0,是不是写成复数更好,毕竟我是学过高中数学的。
106+
- 复数,Python是可以表示复数的,如果`delta<0`,是不是写成复数更好
70107

71-
读者是否还有其它改进呢?你能不能进行改进,然后跟我和其他朋友一起来分享你的成就呢?
108+
读者是否还有其它改进呢?希望你能优化它,并分享你的成果。
72109

73-
至少要完成上述改进,可能需要其它的有关python知识,甚至于前面没有介绍。这都不要紧,掌握了基本知识之后,在编程的过程中,就要不断发挥google的优势,让她帮助你找寻完成任务的工具。
110+
至少要完成上述改进,可能需要其它的有关知识,甚至还没有介绍。这都不要紧,掌握了基本知识之后,在编程的过程中,就要不断发挥google的优势,让她帮助你找寻完成任务的工具。
74111

75-
>python是一个开发的语言,很多大牛人都写了一些工具,让别人使用,减轻了后人的劳动负担。这就是所谓的第三方模块。虽然python中已经有一些“自带电池”,即默认安装的,比如上面程序中用到的math,但是我们还嫌不够。于是又很多第三方的模块来专门解决某个问题。比如这个解方程问题,就可以使用SymPy(www.sympy.org) 来解决,当然NumPy 也是非常强悍的工具。
112+
>Python是一个开放的语言,很多大牛人都写了一些工具,让别人使用,减轻了后人的劳动负担。这就是所谓的第三方模块。虽然Python中已经有一些“自带电池”,即默认安装的,比如上面程序中用到的math,但是我们还嫌不够。于是又很多第三方的模块来专门解决某个问题。比如这个解方程问题,就可以使用SymPy(www.sympy.org) 来解决,当然NumPy 也是非常强悍的工具。
76113
77114
##统计考试成绩
78115

79-
每次考试之后,教师都要统计考试成绩,一般包括:平均分,对所有人按成绩从高到低排队,谁成绩最好,谁成绩最差。还有其它的统计项,暂且不做了。只统计这几项吧。下面的任务就是读者转动脑筋,思考如何用程序实现上面的统计。为了简化,以字典形式表示考试成绩记录,例如:`{"zhangsan":90, "lisi":78, "wangermazi":39}`,当然,也许不止这三项,可能还有,每个老师所处理的内容稍有不同,因此字典里的键值对也不一样。
116+
每次考试之后,就知道年级一共有多少人了。
117+
118+
现在我们就帮着老师来做成绩统计,这项工作,对学霸来讲是快乐的,因为可以提前享受成功的喜悦;对学渣来讲是痛并快乐着,因为晚痛不如早痛。
119+
120+
所以,要快乐地敲代码。
80121

81-
怎么做?
122+
为了简化,以字典形式表示考试成绩记录,例如:`{"zhangsan":90, "lisi":78, "wangermazi":39}`,当然,也许不止这三项,可能还有,每个老师所处理的内容稍有不同,因此字典里的键值对也不一样。
82123

83124
有几种可能要考虑到:
84125

85126
- 最高分或者最低分,可能有人并列。
86127
- 要实现不同长度的字典作为输入值。
87128
- 输出结果中,除了平均分,其它的都要有姓名和分数两项,否则都匿名了,怎么刺激学渣,表扬学霸呢?
88129

89-
不管你是学渣还是学霸,都能学好python。请思考后敲代码调试你的程序,调试之后再阅读下文。
130+
不管是学渣还是学霸,都能学好Python。
131+
132+
请思考后敲代码调试你的程序,调试之后再阅读下文。
90133

91134
参考代码:
92135

136+
Python 2:
137+
93138
#!/usr/bin/env python
94139
# coding=utf-8
95140
"""
@@ -145,6 +190,62 @@
145190
xuezha = min_score(examine_scores)
146191
print "Xuzha is: ",xuezha #学渣们
147192

193+
Python 3:
194+
195+
#!/usr/bin/env python
196+
# coding=utf-8
197+
"""
198+
统计考试成绩
199+
"""
200+
201+
def average_score(scores):
202+
"""
203+
统计平均分.
204+
"""
205+
score_values = scores.values()
206+
sum_scores = sum(score_values)
207+
average = round(sum_scores/len(score_values), 2) # round(a,2) 保留两位小数
208+
return average
209+
210+
def sorted_score(scores):
211+
"""
212+
对成绩从高到低排队.
213+
"""
214+
score_lst = [(scores[k],k) for k in scores]
215+
sort_lst = sorted(score_lst, reverse=True)
216+
return [(i[1], i[0]) for i in sort_lst]
217+
218+
def max_score(scores):
219+
"""
220+
成绩最高的姓名和分数.
221+
"""
222+
lst = sorted_score(scores) #引用分数排序的函数sorted_score
223+
max_score = lst[0][1]
224+
return [(i[0],i[1]) for i in lst if i[1]==max_score]
225+
226+
def min_score(scores):
227+
"""
228+
成绩最低的姓名和分数.
229+
"""
230+
lst = sorted_score(scores)
231+
min_score = lst[len(lst)-1][1]
232+
return [(i[0],i[1]) for i in lst if i[1]==min_score]
233+
234+
if __name__ == "__main__":
235+
examine_scores = {"google":98, "facebook":99, "baidu":52, "alibaba":80, "yahoo":49, "IBM":70, "android":76, "apple":99, "amazon":99}
236+
237+
ave = average_score(examine_scores)
238+
print("the average score is:{}".format(ave)) #平均分
239+
240+
sor = sorted_score(examine_scores)
241+
print("list of the scores:{}".format(sor)) #成绩表
242+
243+
xueba = max_score(examine_scores)
244+
print("Xueba is:{}".format(xueba)) #学霸们
245+
246+
xuezha = min_score(examine_scores)
247+
print("Xuzha is:{}".format(xuezha)) #学渣们
248+
148249
保存为20502.py,然后运行:
149250

150251
$ python 20502.py
@@ -153,19 +254,21 @@
153254
Xueba is: [('facebook', 99), ('apple', 99), ('amazon', 99)]
154255
Xuzha is: [('yahoo', 49)]
155256

156-
貌似结果还不错。不过,还有改进余地,看看现实,就感觉不怎么友好了。看官能不能优化一下?当然,里面的函数也不一定是最好的方法,你也可以修改优化。期盼能够在我上面公布的途径中交流一二。
257+
貌似结果还不错。不过,还有改进余地,看看现实,就感觉不怎么友好了。能不能优化一下?
157258

158259
##找素数
159260

160261
这是一个比较常见的题目。我们姑且将范围缩小一下,找出100以内的素数吧。
161262

162-
还是按照前面的管理,读者先做,然后我提供参考代码,然后自行优化
263+
依照惯例,读者先做,然后我提供参考代码,最后思考如何优化
163264

164-
>质数(Prime number),又称素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个因数的数)
265+
>质数(Prime number),又称素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个因数的数)
165266
166267
>哥德巴赫猜想是数论中存在最久的未解问题之一。这个猜想最早出现在1742年普鲁士人克里斯蒂安·哥德巴赫与瑞士数学家莱昂哈德·欧拉的通信中。用现代的数学语言,哥德巴赫猜想可以陈述为:“任一大于2的偶数,都可表示成两个素数之和。”。哥德巴赫猜想在提出后的很长一段时间内毫无进展,直到二十世纪二十年代,数学家从组合数学与解析数论两方面分别提出了解决的思路,并在其后的半个世纪里取得了一系列突破。目前最好的结果是陈景润在1973年发表的陈氏定理(也被称为“1+2”)。(源自《维基百科》)
167268
168-
对这个练习,我的思路是先做一个函数,用它来判断某个整数是否是素数。然后循环即可。参考代码:
269+
对这个练习,我的思路是先做一个函数,用它来判断某个整数是否是素数。然后循环即可。
270+
271+
参考代码:
169272

170273
#!/usr/bin/env python
171274
# coding=utf-8
@@ -188,8 +291,8 @@
188291
return True
189292

190293
if __name__ == "__main__":
191-
primes = [i for i in range(2,101) if is_prime(i)] #从2开始,因为1显然不是质数
192-
print primes
294+
primes = [i for i in range(2, 101) if is_prime(i)] #从2开始,因为1显然不是质数
295+
print primes #Python 3: print(primes)
193296

194297
代码保存后运行:
195298

@@ -198,31 +301,33 @@
198301

199302
打印出了100以内的质数。
200303

201-
还是前面的观点,这个程序你或许也发现了需要进一步优化的地方,那就太好了。另外,关于判断质数的方法,还有好多种,读者可以自己创造或者网上搜索一些,拓展思路
304+
你或许也发现了需要进一步优化的地方,那就太好了。
202305

203-
#网友frankwang分享一段关于素数的代码,供各位参考:
306+
另外,关于判断质数的方法,还有好多种,读者可以自己创造或者网上搜索一些,拓展思路。
204307

205-
def find_primes(n):
206-
primesList = []
207-
for x in range(2, n+1):
208-
isPrime = True
209-
for y in range(2, int(x**0.5) + 1): #x**0.5 相当于math.sqrt(x)
210-
if x % y == 0:
211-
isPrime = False
212-
break
213-
if isPrime:
214-
primesList.append(x)
308+
网友frankwang分享一段关于素数的代码,供各位参考:
215309

216-
print(primesList)
217-
if __name__ == "__main__":
218-
max = int(input('Find primes up to: '))
219-
find_primes(max)
310+
def find_primes(n):
311+
primes_list = []
312+
for x in range(2, n+1):
313+
is_prime = True
314+
for y in range(2, int(x**0.5) + 1): #x**0.5 相当于math.sqrt(x)
315+
if x % y == 0:
316+
is_prime = False
317+
break
318+
if is_prime:
319+
primes_list.append(x)
220320

221-
代码保存后运行:
222-
# 打印结果如下:
223-
Find primes up to: 100
224-
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
321+
print(primes_list) #Python 2: print primes_list
322+
323+
if __name__ == "__main__":
324+
max = int(input('Find primes up to: '))
325+
find_primes(max)
225326

327+
代码保存后运行,打印结果如下:
328+
329+
Find primes up to: 100
330+
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
226331

227332
##编写函数的注意事项
228333

2code/20501p3.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#!/usr/bin/env python
2+
# coding=utf-8
3+
4+
"""
5+
solving a quadratic equation
6+
"""
7+
8+
import math
9+
10+
def quadratic_equation(a,b,c):
11+
delta = b*b - 4*a*c
12+
if delta<0:
13+
return False
14+
elif delta==0:
15+
return -(b/(2*a))
16+
else:
17+
sqrt_delta = math.sqrt(delta)
18+
x1 = (-b + sqrt_delta)/(2*a)
19+
x2 = (-b - sqrt_delta)/(2*a)
20+
return x1, x2
21+
if __name__ == "__main__":
22+
print("a quadratic equation: x^2 + 2x + 1 = 0")
23+
coefficients = (1, 2, 1)
24+
roots = quadratic_equation(*coefficients)
25+
if roots:
26+
print("the result is:{}".format(roots))
27+
else:
28+
print("this equation has no solution.")

2code/20502p3.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
#!/usr/bin/env python
2+
# coding=utf-8
3+
"""
4+
统计考试成绩
5+
"""
6+
7+
def average_score(scores):
8+
"""
9+
统计平均分.
10+
"""
11+
score_values = scores.values()
12+
sum_scores = sum(score_values)
13+
average = round(sum_scores/len(score_values), 2) # round(a,2) 保留两位小数
14+
return average
15+
16+
def sorted_score(scores):
17+
"""
18+
对成绩从高到低排队.
19+
"""
20+
score_lst = [(scores[k],k) for k in scores]
21+
sort_lst = sorted(score_lst, reverse=True)
22+
return [(i[1], i[0]) for i in sort_lst]
23+
24+
def max_score(scores):
25+
"""
26+
成绩最高的姓名和分数.
27+
"""
28+
lst = sorted_score(scores) #引用分数排序的函数sorted_score
29+
max_score = lst[0][1]
30+
return [(i[0],i[1]) for i in lst if i[1]==max_score]
31+
32+
def min_score(scores):
33+
"""
34+
成绩最低的姓名和分数.
35+
"""
36+
lst = sorted_score(scores)
37+
min_score = lst[len(lst)-1][1]
38+
return [(i[0],i[1]) for i in lst if i[1]==min_score]
39+
40+
if __name__ == "__main__":
41+
examine_scores = {"google":98, "facebook":99, "baidu":52, "alibaba":80, "yahoo":49, "IBM":70, "android":76, "apple":99, "amazon":99}
42+
43+
ave = average_score(examine_scores)
44+
print("the average score is:{}".format(ave)) #平均分
45+
46+
sor = sorted_score(examine_scores)
47+
print("list of the scores:{}".format(sor)) #成绩表
48+
49+
xueba = max_score(examine_scores)
50+
print("Xueba is:{}".format(xueba)) #学霸们
51+
52+
xuezha = min_score(examine_scores)
53+
print("Xuzha is:{}".format(xuezha)) #学渣们

0 commit comments

Comments
 (0)