那些数学不好的程序员,最后都怎么样了?

网上曾流传着这样的段子,戏说程序员中的等级:

一流程序员靠数学,二流靠算法,三流靠逻辑,四流靠SDK,五流靠Google和StackOverFlow,六流靠百度和CSDN。低端的看高端的就是黑魔法!

玩笑里藏的是残忍的现实,异步君不禁流下泪水。虽然整个大学就在被高等数学、离散数学、微积分、线性代数等数学课支配的恐惧中度过,但还是总在挂科的边缘徘徊,根本没有重视数学。

在管理学上有一个著名的“木桶理论”,是指用一个木桶来装水,如果组成木桶的木板参差不齐,那么、这个木桶能装多少水,只能由这个木桶中最短的木板决定。

对普通编程来说,高中数学成绩不错就可以了。但涉及到高端编程就吃力了,比如算法、深度学习等。不得不说,数学这块“木板”往往决定了程序员能否往更高层次进阶。

年少不知数学重要,长大方悔没学好。

当然,只要肯学习,未来一切皆有可能。今天异步君给大家分享几个数学计算程序,帮助大家理解数学在编程中的应用。

生成乘法表

考虑三个数字 a、b 和 n,其中 n 是整数,使得 a×n = b。此处我们可以说,b是 a 的第 n 个倍数。例如,4 是 2 的第二个倍数,1024 是 2 的第 512 个倍数。

一个数字的乘法表列出了该数字的所有倍数。例如,2 的乘法表是这样的(这里给出了 2 的前三个倍数):

2×1=2

2×2=4

2×3=6

我们的下一个程序就是为用户输入的任何数字生成最大到乘数 10 的乘法表。

在这个程序中,我们将使用 format()函数与 print()函数来使程序的输出看起来更友好、更可读。下面简要介绍一下它的工作原理。

format()函数可以插入标签并对其进行设置,以获得一个友好的、可读的字符串

输出。例如,假设我们有在杂货店购买的所有水果的名称,并为每种水果创建了单独的标签,现在想输出一个连贯的句子,可以使用 format()函数:

>>> item1 = 'apples'
>>> item2 = 'bananas'
>>> item3 = 'grapes'
>>> print('At the grocery store, I bought some {0} and {1} and {2}'.format(item1, item2, item3))
At the grocery store, I bought some apples and bananas and grapes

首先,我们创建了三个标签(item1、item2 和 item3),每个标签指代不同的字符串(苹果、香蕉和葡萄)。然后,在 print()函数中,我们键入字符串,它包含了三个在大括号中的占位符,分别为{0}、{1}和{2}。接下来是.format(),它的参数为之前创建的三个标签,这会告诉 Python 按照列出的顺序,用这些标签保存的值来填充这三个占位符,因此,在 Python 的输出文本中,第一个标签的内容替换了{0},第二个标签的内容替换了{1},依此类推。

使用标签指向我们要输出的值并非必要,我们可以在.format()中直接键入值,
如下例所示:

>>> print('Number 1: {0} Number 2: {1} '.format(1, 3.578)) Number 1: 1 Number 2: 3.578 

请注意,占位符的数量和标签(或键入值)的数量必须相等。
了解了 format()的工作原理之后,接下来让我们看看生成乘法表的程序:

Multiplication table printer
def multi_table(a):
? for i in range(1, 11):
print('{0} x {1} = {2}'.format(a, i, a*i))
if __name__ == '__main__':
a = input('Enter a number: ')
multi_table(float(a))
multi_table()函数实现程序的主要功能,它将输出 a 的乘法表(a 也是参数)。

因为我们要输出从 1 到 10 的乘法表,所以在?处有一个 for 循环,它将迭代这些数字中的每一个数字,输出它本身和数字 a 的乘积。
当你执行程序时,它会让你输入一个数字,然后该程序输出其乘法表:

Enter a number : 5
5.0 x 1 = 5.0
5.0 x 2 = 10.0
5.0 x 3 = 15.0
5.0 x 4 = 20.0
5.0 x 5 = 25.0
5.0 x 6 = 30.0
5.0 x 7 = 35.0
5.0 x 8 = 40.0
5.0 x 9 = 45.0
5.0 x 10 = 50.0

看到这张清晰又有秩序的乘法表了吗?这正是我们使用了.format()函数,根据
可读、统一的模板输出的内容。
你可以使用 format()函数来进一步控制数字输出的形式。例如,如果希望数字
只有两位小数,可以参考下面的例子:

Enter a number : 5
>>> '{0}'.format(1.25456)
'1.25456'
>>> '{0:.2f}'.format(1.25456)
'1.25'

第一个 format 语句将我们输入的数字原封不动地输出。在第二个语句中,我们
将占位符修改为{0:.2f},这意味着我们只需要小数点后面的两个数字,其中 f 表示一个浮点数。如你所见,在下一个输出中,小数点后只有两个数字。请注意,如果数字小数点后的位数多于你指定的位数,则该数字将四舍五入,例如:

>>>'{0:.2f}'.format(1.25556)
'1.26'

在这里,1.25556 向上取整到最接近的百分位,并输出为 1.26。如果将.2f 应用
到整数上,则会在小数点后面添加零:

>>>'{0:.2f}'.format (1 )
'1.00'

添加两个零是因为我们指定在小数点后输出两个数字。

计算整数因子

当非零整数 a 除另一个整数 b,余数为 0 时,a 称为 b 的因子。例如,2 是所有 偶数整数的因子。我们可以编写下面的函数来确定非零整数 a 是否是另一个整数 b 的因子:

>>> def is_factor(a, b):
         if b % a == 0:
             return True
         else:
             return False 

我们使用%运算符来计算余数。如果你发现自己在问“4 是不 是 1024 的因子”这类问题,可以使用 is_factor()函数得到答案:

is_factor(4, 1024)
True
对于任何正整数 n,如何找到其所有的正因子?对于 1 和 n 之间的每个整数, 我们检查 n 除以该整数后的余数。如果余数为 0,那么这个整数就是一个因子。使 用 range()函数来编写一个程序,它将遍历 1 到 n 之间的每个数字。

在编写完整的程序之前,先来看看 range()如何工作。range()函数的典型用法如下所示:

>`i in range(1, 4):
         print(i)
 1
 2
 3

在这里,我们设置了一个 for 循环,并给 range()函数传入了两个参数。range() 函数从第一个整数参数(起始值)开始,一直到第二个整数参数(停止值)截止。 在这个例子中,我们告诉 Python 输出该范围内的数字,从 1 开始,到 4 停止。注意, 这意味着 Python 不会输出 4,所以后输出的数字是停止值之前的数字 3。同时也 要注意,range()函数只接收整数作为参数。

你也可以不指定 range()函数的起始值,在这种情况下,起始值被假定为 0。 例如:

>>> for i in range(5):
         print(i) 
0 
1
2
3 
4

由 range()函数产生的两个连续整数之间的差称为步长值(step value)。默认情 况下,步长值为 1。要定义其他的步长值,请将其指定为第三个参数(这时,需指 定起始值)。例如,下面的程序将输出 10 以下的奇数:

>>> for i in range(1,10,2):
         print(i) 
1 
3 
5 
7 
9 

我们已经了解了 range()函数是如何工作的,接下来考虑一个因子计算程序。因 为我们将要编写一个相当长的程序,所以在 IDLE 编辑器里编写,而不是在交互式 的 IDLE 界面中。你可以在 IDLE 中选择 File->New Window(或者 New File)来启 动编辑器。请注意,我们首先用三个单引号(’)来注释代码,这些引号之间的文本 不会被 Python 作为程序的一部分执行,它们只是我们对程序的注释。

‘’’
Find the factors of an integer
‘’’

def factors(b):

 for i in range(1, b+1):
        if b % i == 0:
          print(i) 

if name == ‘main’:

   b = input('Your Number Please: ')
   b = float(b) 

 if b > 0 and b.is_integer():
         factors(int(b))
    else:
         print('Please enter a positive integer') 

factors()函数定义了一个 for 循环,在n处,该循环使用 range()函数对 1 和输入 的数字之间的每个整数迭代一次。这里,我们要迭代到用户输入的整数 b,所以停 止值被设置为 b+1。对于每个整数 i,程序检查输入数字 b 除以 i 后是否没有余数, 如果没有余数,就输出 i。

当你运行此程序(选择 Run->Run Module)时,它会要求你输入一个数字。如 果你输入的数字是正整数,程序会输出其因子,例如:

Your Number Please: 25
1
5
25
如果输入的是非整数或负整数,程序会输出一条错误信息,并要求你输入一 个正整数:

Your Number Please: 15.5
Please enter a positive integer
在这个例子中,我们通过检查程序的无效输入,使程序对用户更加友好。因为 我们的程序仅用于查找正整数的因子,所以要检查输入的数字是否大于 0 并且 使用 is_integer()函数检查输入的数是否是整数,以确保输入有效。

如果输入的数不是正整数,程序将输出一个用户友好的指令,而不是一长串的错误信息。

-END-

最后,异步君给大家推荐一本书,可以将程序设计和数学巧妙地结合起来,从简单的项目开始,应用Python解决高中和大学低年级的数学问题,比如几何、概率、统计以及微积分等,为进一步学习更复杂的数学内容以及Python编程语言打下坚实的基础。

本书也可作为Python初学者的入门读物,通过学习书中的示例程序和完成那些编程挑战,读者可以提高自己的编程能力和技巧。

关注“异步图书”微信公众号,回复“52271”领取本书配套源代码;

回复 “VIP” 免费领取VIP会员卡,畅读近千门电子书。

今日福利

《Python数学编程》

阿米特·萨哈(Amit Saha) 著

许杨毅,刘旭华 译

那些数学不好的程序员,最后都怎么样了?_第1张图片

如何获得:关注公众号:异步图书,在看+参与话题留言+转发本文至朋友圈,2月20日,异步君将抽取2名读者赠送《Python数学编程》。

今日互动话题:

“你认为数学对编程有哪些好处呢?”

你可能感兴趣的:(赠书)