|
2 | 2 |
|
3 | 3 | #函数练习
|
4 | 4 |
|
5 |
| -已经学习了函数的基本知识,现在练习练习。完成下面练习的原则: |
| 5 | +仅仅知道函数的知识,是远远不够的,必须要勤练习、多敲代码,才能有体会,熟能生巧,熟能有感悟。 |
6 | 6 |
|
7 |
| -1. 请读者先根据自己的设想写下代码,然后运行调试,检查得到的结果是否正确 |
| 7 | +首先声明,一下对每个问题的解决方案,不一定是最优的。 |
| 8 | + |
| 9 | +读者在完成本节练习的时候,请遵守如下规则(全看你的自我控制能力了,自控能力强的胜出,不要欺骗哦,因为上帝在看着你呢): |
| 10 | + |
| 11 | +1. 先根据自己的设想写下代码,然后运行调试,检查得到的结果是否正确 |
8 | 12 | 2. 我也给出参考代码,但是,参考代码并不是最终结果
|
9 |
| -3. 读者可以在上述基础上对代码进行完善 |
| 13 | +3. 可以在上述基础上对代码进行完善 |
10 | 14 | 4. 如果读者愿意,可以将代码提交到github上,或者到我的QQ群(群号:26913719)中跟大家分享讨论
|
11 | 15 |
|
12 | 16 | ##解一元二次方程
|
13 | 17 |
|
14 |
| -解一元二次方程,是初中数学中的基本知识,一般来讲解法有:公式法、因式分解法等。读者可以根据自己的理解,写一段求解一元二次方程的程序。 |
| 18 | +解一元二次方程,是初中数学中的基本知识,一般来讲解法有公式法、因式分解法等。读者可以根据自己的理解,写一段求解一元二次方程的程序。 |
15 | 19 |
|
16 | 20 | 最简单的思路就是用公式法求解,这是普适法则(普世法则?普适是否等同于普世?)。
|
17 | 21 |
|
18 |
| -古巴比伦留下的陶片显示,在大约公元前2000年(2000BC)古巴比伦的数学家就能解一元二次方程了。在大约公元前480年,中国人已经使用配方法求得了二次方程的正根,但是并没有提出通用的求解方法。公元前300年左右,欧几里得提出了一种更抽象的几何方法求解二次方程。 |
| 22 | +>古巴比伦留下的陶片显示,在大约公元前2000年(2000BC)古巴比伦的数学家就能解一元二次方程了。在大约公元前480年,中国人已经使用配方法求得了二次方程的正根,但是并没有提出通用的求解方法。公元前300年左右,欧几里得提出了一种更抽象的几何方法求解二次方程。 |
19 | 23 |
|
20 |
| -7世纪印度的婆罗摩笈多(Brahmagupta)是第一位懂得用使用代数方程,它同时容许有正负数的根。 |
| 24 | +>7世纪印度的婆罗摩笈多(Brahmagupta)是第一位懂得用使用代数方程,它同时容许有正负数的根。 |
21 | 25 |
|
22 |
| -11世纪阿拉伯的花拉子密 独立地发展了一套公式以求方程的正数解。亚伯拉罕·巴希亚(亦以拉丁文名字萨瓦索达著称)在他的著作Liber embadorum中,首次将完整的一元二次方程解法传入欧洲。。(源自《维基百科》) |
| 26 | +>11世纪阿拉伯的花拉子密 独立地发展了一套公式以求方程的正数解。亚伯拉罕·巴希亚(亦以拉丁文名字萨瓦索达著称)在他的著作Liber embadorum中,首次将完整的一元二次方程解法传入欧洲。。(源自《维基百科》) |
23 | 27 |
|
24 | 28 | 参考代码:
|
25 | 29 |
|
| 30 | +Python 2: |
| 31 | + |
26 | 32 | #!/usr/bin/env python
|
27 | 33 | # coding=utf-8
|
28 | 34 |
|
|
54 | 60 | else:
|
55 | 61 | print "this equation has no solution."
|
56 | 62 |
|
| 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 | + |
57 | 94 | 保存为20501.py,并运行之:
|
58 | 95 |
|
59 | 96 | $ python 20501.py
|
60 | 97 | a quadratic equation: x^2 + 2x + 1 = 0
|
61 | 98 | the result is: -1.0
|
62 | 99 |
|
63 |
| -能够正常运行,求解方程。 |
| 100 | +得到了方程的根。 |
64 | 101 |
|
65 |
| -但是,如果再认真思考,发现上述代码是有很大改进空间的。至少我发现: |
| 102 | +但是,如果再认真思考,发现上述代码是有很大改进空间的: |
66 | 103 |
|
67 | 104 | - 如果不小心将第一个系数(a)的值输入了0,程序肯定会报错。如何避免之?要记住,任何人的输入都是不可靠的。
|
68 | 105 | - 结果貌似只能是小数,这在某些情况下是近似值,能不能得到以分数形式表示的精确结果呢?
|
69 |
| -- 复数,python是可以表示复数的,如果delta<0,是不是写成复数更好,毕竟我是学过高中数学的。 |
| 106 | +- 复数,Python是可以表示复数的,如果`delta<0`,是不是写成复数更好? |
70 | 107 |
|
71 |
| -读者是否还有其它改进呢?你能不能进行改进,然后跟我和其他朋友一起来分享你的成就呢? |
| 108 | +读者是否还有其它改进呢?希望你能优化它,并分享你的成果。 |
72 | 109 |
|
73 |
| -至少要完成上述改进,可能需要其它的有关python知识,甚至于前面没有介绍。这都不要紧,掌握了基本知识之后,在编程的过程中,就要不断发挥google的优势,让她帮助你找寻完成任务的工具。 |
| 110 | +至少要完成上述改进,可能需要其它的有关知识,甚至还没有介绍。这都不要紧,掌握了基本知识之后,在编程的过程中,就要不断发挥google的优势,让她帮助你找寻完成任务的工具。 |
74 | 111 |
|
75 |
| ->python是一个开发的语言,很多大牛人都写了一些工具,让别人使用,减轻了后人的劳动负担。这就是所谓的第三方模块。虽然python中已经有一些“自带电池”,即默认安装的,比如上面程序中用到的math,但是我们还嫌不够。于是又很多第三方的模块来专门解决某个问题。比如这个解方程问题,就可以使用SymPy(www.sympy.org) 来解决,当然NumPy 也是非常强悍的工具。 |
| 112 | +>Python是一个开放的语言,很多大牛人都写了一些工具,让别人使用,减轻了后人的劳动负担。这就是所谓的第三方模块。虽然Python中已经有一些“自带电池”,即默认安装的,比如上面程序中用到的math,但是我们还嫌不够。于是又很多第三方的模块来专门解决某个问题。比如这个解方程问题,就可以使用SymPy(www.sympy.org) 来解决,当然NumPy 也是非常强悍的工具。 |
76 | 113 |
|
77 | 114 | ##统计考试成绩
|
78 | 115 |
|
79 |
| -每次考试之后,教师都要统计考试成绩,一般包括:平均分,对所有人按成绩从高到低排队,谁成绩最好,谁成绩最差。还有其它的统计项,暂且不做了。只统计这几项吧。下面的任务就是读者转动脑筋,思考如何用程序实现上面的统计。为了简化,以字典形式表示考试成绩记录,例如:`{"zhangsan":90, "lisi":78, "wangermazi":39}`,当然,也许不止这三项,可能还有,每个老师所处理的内容稍有不同,因此字典里的键值对也不一样。 |
| 116 | +每次考试之后,就知道年级一共有多少人了。 |
| 117 | + |
| 118 | +现在我们就帮着老师来做成绩统计,这项工作,对学霸来讲是快乐的,因为可以提前享受成功的喜悦;对学渣来讲是痛并快乐着,因为晚痛不如早痛。 |
| 119 | + |
| 120 | +所以,要快乐地敲代码。 |
80 | 121 |
|
81 |
| -怎么做? |
| 122 | +为了简化,以字典形式表示考试成绩记录,例如:`{"zhangsan":90, "lisi":78, "wangermazi":39}`,当然,也许不止这三项,可能还有,每个老师所处理的内容稍有不同,因此字典里的键值对也不一样。 |
82 | 123 |
|
83 | 124 | 有几种可能要考虑到:
|
84 | 125 |
|
85 | 126 | - 最高分或者最低分,可能有人并列。
|
86 | 127 | - 要实现不同长度的字典作为输入值。
|
87 | 128 | - 输出结果中,除了平均分,其它的都要有姓名和分数两项,否则都匿名了,怎么刺激学渣,表扬学霸呢?
|
88 | 129 |
|
89 |
| -不管你是学渣还是学霸,都能学好python。请思考后敲代码调试你的程序,调试之后再阅读下文。 |
| 130 | +不管是学渣还是学霸,都能学好Python。 |
| 131 | + |
| 132 | +请思考后敲代码调试你的程序,调试之后再阅读下文。 |
90 | 133 |
|
91 | 134 | 参考代码:
|
92 | 135 |
|
| 136 | +Python 2: |
| 137 | + |
93 | 138 | #!/usr/bin/env python
|
94 | 139 | # coding=utf-8
|
95 | 140 | """
|
|
145 | 190 | xuezha = min_score(examine_scores)
|
146 | 191 | print "Xuzha is: ",xuezha #学渣们
|
147 | 192 |
|
| 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 | + |
148 | 249 | 保存为20502.py,然后运行:
|
149 | 250 |
|
150 | 251 | $ python 20502.py
|
|
153 | 254 | Xueba is: [('facebook', 99), ('apple', 99), ('amazon', 99)]
|
154 | 255 | Xuzha is: [('yahoo', 49)]
|
155 | 256 |
|
156 |
| -貌似结果还不错。不过,还有改进余地,看看现实,就感觉不怎么友好了。看官能不能优化一下?当然,里面的函数也不一定是最好的方法,你也可以修改优化。期盼能够在我上面公布的途径中交流一二。 |
| 257 | +貌似结果还不错。不过,还有改进余地,看看现实,就感觉不怎么友好了。能不能优化一下? |
157 | 258 |
|
158 | 259 | ##找素数
|
159 | 260 |
|
160 | 261 | 这是一个比较常见的题目。我们姑且将范围缩小一下,找出100以内的素数吧。
|
161 | 262 |
|
162 |
| -还是按照前面的管理,读者先做,然后我提供参考代码,然后自行优化。 |
| 263 | +依照惯例,读者先做,然后我提供参考代码,最后思考如何优化。 |
163 | 264 |
|
164 |
| ->质数(Prime number),又称素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个因数的数) |
| 265 | +>质数(Prime number),又称素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个因数的数)。 |
165 | 266 |
|
166 | 267 | >哥德巴赫猜想是数论中存在最久的未解问题之一。这个猜想最早出现在1742年普鲁士人克里斯蒂安·哥德巴赫与瑞士数学家莱昂哈德·欧拉的通信中。用现代的数学语言,哥德巴赫猜想可以陈述为:“任一大于2的偶数,都可表示成两个素数之和。”。哥德巴赫猜想在提出后的很长一段时间内毫无进展,直到二十世纪二十年代,数学家从组合数学与解析数论两方面分别提出了解决的思路,并在其后的半个世纪里取得了一系列突破。目前最好的结果是陈景润在1973年发表的陈氏定理(也被称为“1+2”)。(源自《维基百科》)
|
167 | 268 |
|
168 |
| -对这个练习,我的思路是先做一个函数,用它来判断某个整数是否是素数。然后循环即可。参考代码: |
| 269 | +对这个练习,我的思路是先做一个函数,用它来判断某个整数是否是素数。然后循环即可。 |
| 270 | + |
| 271 | +参考代码: |
169 | 272 |
|
170 | 273 | #!/usr/bin/env python
|
171 | 274 | # coding=utf-8
|
|
188 | 291 | return True
|
189 | 292 |
|
190 | 293 | 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) |
193 | 296 |
|
194 | 297 | 代码保存后运行:
|
195 | 298 |
|
|
198 | 301 |
|
199 | 302 | 打印出了100以内的质数。
|
200 | 303 |
|
201 |
| -还是前面的观点,这个程序你或许也发现了需要进一步优化的地方,那就太好了。另外,关于判断质数的方法,还有好多种,读者可以自己创造或者网上搜索一些,拓展思路。 |
| 304 | +你或许也发现了需要进一步优化的地方,那就太好了。 |
202 | 305 |
|
203 |
| -#网友frankwang分享一段关于素数的代码,供各位参考: |
| 306 | +另外,关于判断质数的方法,还有好多种,读者可以自己创造或者网上搜索一些,拓展思路。 |
204 | 307 |
|
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分享一段关于素数的代码,供各位参考: |
215 | 309 |
|
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) |
220 | 320 |
|
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) |
225 | 326 |
|
| 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] |
226 | 331 |
|
227 | 332 | ##编写函数的注意事项
|
228 | 333 |
|
|
0 commit comments