已经学习了函数的基本知识,现在练习练习。完成下面练习的原则:

请读者先根据自己的设想写下代码,然后运行调试,检查得到的结果是否正确

我也给出参考代码,但是,参考代码并不是最终结果

读者可以在上述基础上对代码进行完善

如果读者愿意,可以将代码提交到 github 上,或者到我的 QQ 群(群号:26913719)中跟大家分享讨论

解一元二次方程

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

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

古巴比伦留下的陶片显示,在大约公元前 2000 年(2000 BC)古巴比伦的数学家就能解一元二次方程了。在大約公元前 480 年,中國人已经使用配方法求得了二次方程的正根,但是并没有提出通用的求解方法。公元前 300 年左右,欧几里得提出了一种更抽象的几何方法求解二次方程。

7 世紀印度的婆罗摩笈多(Brahmagupta)是第一位懂得用使用代数方程,它同时容许有正负数的根。

11 世紀阿拉伯的花拉子密 独立地发展了一套公式以求方程的正数解。亚伯拉罕·巴希亚(亦以拉丁文名字萨瓦索达著称)在他的著作 Liber embadorum 中,首次将完整的一元二次方程解法传入欧洲。(源自《维基百科》)

参考代码:

#!/usr/bin/env Python

# coding=utf-8

"""

solving a quadratic equation

"""

from __future__ import division

import math

def quadratic_equation(a,b,c):

delta = b*b - 4*a*c

if delta<0:

return False

elif delta==0:

return -(b/(2*a))

else:

sqrt_delta = math.sqrt(delta)

x1 = (-b + sqrt_delta)/(2*a)

x2 = (-b - sqrt_delta)/(2*a)

return x1, x2

if __name__ == "__main__":

print "a quadratic equation: x^2 + 2x + 1 = 0"

coefficients = (1, 2, 1)

roots = quadratic_equation(*coefficients)

if roots:

print "the result is:",roots

else:

print "this equation has no solution."

保存为 20501.py,并运行之:

$ python 20501.py

a quadratic equation: x^2 + 2x + 1 = 0

the result is: -1.0

能够正常运行,求解方程。

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

如果不小心将第一个系数(a)的值输入了 0,程序肯定会报错。如何避免之?要记住,任何人的输入都是不可靠的。

结果貌似只能是小数,这在某些情况下是近似值,能不能得到以分数形式表示的精确结果呢?

复数,Python 是可以表示复数的,如果 delta<0,是不是写成复数更好,毕竟我是学过高中数学的。

读者是否还有其它改进呢?你能不能进行改进,然后跟我和其他朋友一起来分享你的成就呢?

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

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

统计考试成绩

每次考试之后,教师都要统计考试成绩,一般包括:平均分,对所有人按成绩从高到低排队,谁成绩最好,谁成绩最差。还有其它的统计项,暂且不做了。只统计这几项吧。下面的任务就是读者转动脑筋,思考如何用程序实现上面的统计。为了简化,以字典形式表示考试成绩记录,例如:{"zhangsan":90, "lisi":78, "wangermazi":39},当然,也许不止这三项,可能还有,每个老师所处理的内容稍有不同,因此字典里的键值对也不一样。

怎么做?

有几种可能要考虑到:

最高分或者最低分,可能有人并列。

要实现不同长度的字典作为输入值。

输出结果中,除了平均分,其它的都要有姓名和分数两项,否则都匿名了,怎么刺激学渣,表扬学霸呢?

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

参考代码:

#!/usr/bin/env Python

# coding=utf-8

"""

统计考试成绩

"""

from __future__ import division

def average_score(scores):

"""

统计平均分.

"""

score_values = scores.values()

sum_scores = sum(score_values)

average = sum_scores/len(score_values)

return average

def sorted_score(scores):

"""

对成绩从高到低排队.

"""

score_lst = [(scores[k],k) for k in scores]

sort_lst = sorted(score_lst, reverse=True)

return [(i[1], i[0]) for i in sort_lst]

def max_score(scores):

"""

成绩最高的姓名和分数.

"""

lst = sorted_score(scores) #引用分数排序的函数 sorted_score

max_score = lst[0][1]

return [(i[0],i[1]) for i in lst if i[1]==max_score]

def min_score(scores):

"""

成绩最低的姓名和分数.

"""

lst = sorted_score(scores)

min_score = lst[len(lst)-1][1]

return [(i[0],i[1]) for i in lst if i[1]==min_score]

if __name__ == "__main__":

examine_scores = {"google":98, "facebook":99, "baidu":52, "alibaba":80, "yahoo":49, "IBM":70, "android":76, "apple":99, "amazon":99}

ave = average_score(examine_scores)

print "the average score is: ",ave #平均分

sor = sorted_score(examine_scores)

print "list of the scores: ",sor #成绩表

xueba = max_score(examine_scores)

print "Xueba is: ",xueba #学霸们

xuezha = min_score(examine_scores)

print "Xuzha is: ",xuezha #学渣们

保存为 20502.py,然后运行:

$ python 20502.py

the average score is: 80.2222222222

list of the scores: [('facebook', 99), ('apple', 99), ('amazon', 99), ('google', 98), ('alibaba', 80), ('android', 76), ('IBM', 70), ('baidu', 52), ('yahoo', 49)]

Xueba is: [('facebook', 99), ('apple', 99), ('amazon', 99)]

Xuzha is: [('yahoo', 49)]

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

找素数

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

还是按照前面的管理,读者先做,然后我提供参考代码,然后自行优化。

質數(Prime number),又称素数,指在大於1的自然数中,除了 1 和此整数自身外,無法被其他自然数整除的数(也可定義為只有 1 和本身两个因数的数)。

哥德巴赫猜想是数论中存在最久的未解问题之一。这个猜想最早出现在 1742 年普鲁士人克里斯蒂安·哥德巴赫与瑞士数学家莱昂哈德·欧拉的通信中。用现代的数学语言,哥德巴赫猜想可以陈述为:“任一大于 2 的偶数,都可表示成两个质数之和。”。哥德巴赫猜想在提出后的很长一段时间内毫无进展,直到二十世纪二十年代,数学家从组合数学与解析数论两方面分别提出了解决的思路,并在其后的半个世纪里取得了一系列突破。目前最好的结果是陈景润在 1973 年发表的陈氏定理(也被称为“1+2”)。(源自《维基百科》)

对这个练习,我的思路是先做一个函数,用它来判断某个整数是否是素数。然后循环即可。参考代码:

#!/usr/bin/env Python

# coding=utf-8

"""

寻找素数

"""

import math

def is_prime(n):

"""

判断一个数是否是素数

"""

if n <= 1:

return False

for i in range(2, int(math.sqrt(n) + 1)):

if n % i == 0:

return False

return True

if __name__ == "__main__":

primes = [i for i in range(2,100) if is_prime(i)] #从 2 开始,因为 1 显然不是质数

print primes

代码保存后运行:

$ python 20503.py

[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]

打印出了 100 以内的质数。

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

编写函数的注意事项

编写函数,在开发实践中是非常必要和常见的,一般情况,你写的函数应该是:

尽量不要使用全局变量。

如果参数是可变类型数据,在函数内,不要修改它。

每个函数的功能和目标要单纯,不要试图一个函数做很多事情。

函数的代码行数尽量少。

函数的独立性越强越好,不要跟其它的外部东西产生关联。

如果你认为有必要打赏我,请通过支付宝:qiwsir@126.com,不胜感激。

python求一元二次方程的解法_函数练习_《从零开始学 python》(第二版)相关推荐

  1. python求一元二次方程的解法_python进行二次方程式计算的实例讲解

    算法,是一种执行步骤,如果我们想要要做一件事情,就会规划好行动步骤.而算法,就是我们所编程序的执行步骤.算法在编程使用过程中至关重要.二次方程式大家很熟悉,是一种整式方程,其未知项的最高次数是2.根的 ...

  2. 小复习1 Python求解一元二次方程解(自定义函数)

    前言 本文实例讲述了Python编程实现数学运算求一元二次方程的实根算法.分享给大家供大家参考,具体如下: 问题 请定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程:a ...

  3. python求一元二次方程实根_Python编程实现数学运算求一元二次方程的实根算法示例...

    本文实例讲述了Python编程实现数学运算求一元二次方程的实根算法.分享给大家供大家参考,具体如下: 问题: 请定义一个函数quadratic(a,b,c),接收3个参数,返回一元二次方程:ax² + ...

  4. Python 求一元二次方程的解

     知识点 调用 math.sqrt() 函数求一个数的平方根: 使用 def 自定义一个函数时,函数返回值使用 return 返回: 函数体内部的语句在执行时,一旦执行到 return 时,函数就执行 ...

  5. Python 求一元二次方程的根(包括虚根)

    如图所示,求一元二次方程的根(包括虚根),代码如下: import math a = float(input()) b = float(input()) c = float(input()) delt ...

  6. 用python求一元二次方程的解

    廖雪峰老师网站上的练习题 题目:定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程: ax2 + bx + c = 0 的两个解. import math def qua ...

  7. python求一元二次方程的解

    求解: X**2+5X+6=0 import math a=1;b=5;c=6 x1=(-b+math.sqrt(b*b-4*a*c))/(2*a) x2=(-b-math.sqrt(b*b-4*a* ...

  8. Python求一元二次方程的根

    首先如图所示敲出下列代码: 即如下 import math a = float(input("请输入a的值:")) b = float(input("请输入b的值:&qu ...

  9. 【Python实践-1】求一元二次方程的两个解

    知识点: import sys, sys模块包含了与Python解释器和它的环境有关的函数. "sys"是"system"的缩写.sys.exit() 中途退出 ...

最新文章

  1. 【考试认证专场】大牛带你全面掌握学习技巧,攻克考试难题(8.2-8.6精品课程限时特惠)...
  2. tempfile PermissionError: [Errno 13] Permission denied
  3. SQL ALTER TABLE 语句
  4. 堆栈图解CSAPP Bomb Lab实验解析
  5. php 换行 PHP_EOL变量
  6. mysql if 多个_MySQL使用IF语句CONCAT多个字段
  7. python删除链表的倒数第k个节点,剑指offer 链表中的倒数第K个节点 Python and C++
  8. 观点:比特币新一轮突破“即将到来”
  9. 腾讯广告X中科院计算所WWW2021论文:在线广告中的探索与优化
  10. 安徽 计算机能力提升,休宁教师“充电”提升信息技术应用能力
  11. 解决百度地图使用出现的has leaked ServiceConnection com.baidu.location.b@4aa5a810 that was originally bound here
  12. oracle中数据泵只导出索引,oracle expdp/impdp exclude=STATISTICS
  13. 为什么要测款,直通车测款怎样设置
  14. windows 两台电脑通过移动热点传输文件
  15. 点对点网络带宽测试软件,iperf点对点网络性能测试工具
  16. windows 系统清理工具
  17. 阿甘本:什么是当代人
  18. 一个web页面的访问的过程
  19. Jpress项目学习纪录片(一) -- 环境搭建
  20. 计算机在手机找不到了怎么办,手机找不到了怎么办 手机找不到了找回方法

热门文章

  1. moment去年的1月1日到12月31日
  2. 2022年全球市场低温真空泵总体规模、主要生产商、主要地区、产品和应用细分研究报告
  3. angular蚂蚁_angular api文档
  4. 生产现场车间数字化可视化管理系统软件
  5. Vivado创建带AXI slave接口的IP—PS控制PL侧的LED
  6. javafx-显卡有关的jvm加速
  7. 微信零钱交易记录怎么彻底删除,这些方法等你来盘
  8. MTK平台 mt6771 GPIO控制
  9. 【基础恶补】JavaScript数组的一些方法,reduce,filter,reverse,map等
  10. 戴尔台式计算机规格型号怎么查,戴尔台式机型号怎么样查看