友情提示:380元/半年,儿童学编程,就上码丁实验室。
有这样一个故事,说的是阿基米德与国王下棋,国王输了,国王问阿基米德要什么奖赏?阿基米德对国王说:“我只要在棋盘上第一格放一粒米,第二格放二粒,第三格放四粒,第四格放八粒,第五个格子放十六粒米…按这个方式放满整个棋盘就行。” 他们下的是国际象棋,有八八六十四个格子。
国王听了以后,不以为然,认为用不了多少粮食就可以打发他。可是算完以后,却是一个惊人的天文数字,整个国家的粮仓里的米都不够。
这到底是怎么回事,今天我们来研究一下:
首先,我们来看看开始的几格是多少粒米。看格子1,2,3,4,5的米粒数:1,2,4,8,16。我们可以看出格子号与米粒数的关系是2的幂。
可以写成这样:2**0=1, 2**1=2, 2**2=4, 2**3=8, 2**4=16。那么最后一格的米粒数则为2**63。(注意:平时我们数数往往是从1开始,但是在程序里面往往是从0开始的。当然如果我们需要从1开始,是可以设定的。这里2**0恰好等于1,所以我们要从0开始。也就是程序里是从0数到63,而不是从1数到64。)
顺便解释一下幂或叫乘方或叫几次方,请看,小黑板上在右上角写一个小小的数字,那是指数,下面那个数叫底数,这是数学里的写法,与Python不同。
左边第一列是用乘法的形式,第二列是乘方或幂的数学表示方式,第三列是乘方或幂的Python的表示方式,最后是结果。
我们在Python中运行一下:
>>> 2**2
4
>>> 2**3
8
>>> 2**4
16
>>> 2**63
9223372036854775808
>>> 2**1
2
>>> 2**0
1
>>> 2*2
4
>>> 2*2*2
8
>>> 2
2
任何数的0次方都等于1。可以自己去试试其他的。
这道题是把64个格子都要放,再加起来的。在Python里面sum()就是用来求总和的。也就是1+2+4+8+16+……。
我们来看一个sum()运行的例子:
我们再来看每一格按照规律放下去的情况,在Python中是这样的:
range后面的(64)也可以写成(0,64)。在Python中取值,按规定是从0起,取到63止,没有包括64,这是Python的规则。我们取的这个值就是下面的i。在下面这句for i in range(64):的程序中,i的值依次从0取到63,变了64次,得出2**i的64个结果。for是表示循环取值的命令。
下面是运行后输出的结果,也就是每一格上要放的米粒数:
1
2
4
8
16
32
64
128
256
512
1024
2048
4096
8192
16384
32768
65536
131072
262144
524288
1048576
2097152
4194304
8388608
16777216
33554432
67108864
134217728
268435456
536870912
1073741824
2147483648
4294967296
8589934592
17179869184
34359738368
68719476736
137438953472
274877906944
549755813888
1099511627776
2199023255552
4398046511104
8796093022208
17592186044416
35184372088832
70368744177664
140737488355328
281474976710656
562949953421312
1125899906842624
2251799813685248
4503599627370496
9007199254740992
18014398509481984
36028797018963968
72057594037927936
144115188075855872
288230376151711744
576460752303423488
1152921504606846976
2305843009213693952
4611686018427387904
9223372036854775808
下面的写法是一次性求出总和:
对比上面的两个程序格式,一个因为print(sum)是处于for的循环内,与上面的sum()左对齐。所以会反复打印输出。
另一个print(sum)已经跳出了循环,与for左对齐,即只求最后结果。所以,在Python书写的格式很重要。我们必须按Python规定的格式写程序。
最后再感觉一下for是起什么作用的,就是循环输出。在IDLE中输入下面的程序试试:
>>> for i in [3,4,5,6]:
print(i)
3
4
5
6
>>> for i in (3,4,5,6):
print(i)
3
4
5
6
>>> for i in range(6):
print(i)
0
1
2
3
4
5
>>> for x in range(0,6):
print(x)
0
1
2
3
4
5
>>> for a in range(10):
print(a*3)
0
3
6
9
12
15
18
21
24
27
>>> for a in range(0,10):
a += 5
print(a)
5
6
7
8
9
10
11
12
13
14
本课内容完。