构造程序逻辑

对于编程语言的初学者来说,在学习了Python的核心语言元素(变量、类型、运算符、表达式、分支结构、循环结构等)之后,必须做的一件事情就是尝试用所学知识去解决现实中的问题,换句话说就是锻炼自己把用人类自然语言描述的算法(解决问题的方法和步骤)翻译成Python代码的能力,而这件事情必须通过大量的练习才能达成。

经典的例子

  1. 寻找水仙花数

    说明:水仙花数也被称为超完全数字不变数、自恋数、自幂数、阿姆斯特朗数,它是一个3位数,该数字每个位上数字的立方之和正好等于它本身,例如:$1^3 + 5^3+ 3^3=153$。

1
2
3
4
5
6
7
8
9
"""
找出所有水仙花数
"""
for num in range(100, 1000):# range建立数组
low = num % 10
mid = num // 10 % 10
high = num // 100
if num == low ** 3 + mid ** 3 + high ** 3:
print(num)

上面的代码中,我们通过整除和求模运算分别找出了一个三位数的个位、十位和百位,这种小技巧在实际开发中还是常用的。用类似的方法,我们还可以实现将一个正整数反转,例如:将12345变成54321,代码如下所示。

1
2
3
4
5
6
num = int(input('num = '))
reversed_num = 0 #reversed反转函数,返回一个反转的迭代器
while num > 0:
reversed_num = reversed_num * 10 + num % 10
num //= 10
print(reversed_num)

百鸡百钱

1
2
3
4
5
6
7
8
9
10
11
12
"""
《百钱百鸡》问题
说明:百钱百鸡是我国古代数学家张丘建在《算经》一书中提出的数学问题:
鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。
百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?翻译成现代文是:公鸡5元一只,母鸡3元一只,小鸡1元三只,
用100块钱买一百只鸡,问公鸡、母鸡、小鸡各有多少只?
"""
for x in range(0,20):
for y in range(0,33):
z= 100-x-y
if 100==5*x+3*y+z/3:
print(x,y,z)

上面使用的方法叫做穷举法,也称为暴力搜索法,这种方法通过一项一项的列举备选解决方案中所有可能的候选项并检查每个候选项是否符合问题的描述,最终得到问题的解。这种方法看起来比较笨拙,但对于运算能力非常强大的计算机来说,通常都是一个可行的甚至是不错的选择,而且问题的解如果存在,这种方法一定能够找到它。

CRAPS赌博游戏

说明:CRAPS又称花旗骰,是美国拉斯维加斯非常受欢迎的一种的桌上赌博游戏。该游戏使用两粒骰子,玩家通过摇两粒骰子获得点数进行游戏。简单的规则是:玩家第一次摇骰子如果摇出了7点或11点,玩家胜;玩家第一次如果摇出2点、3点或12点,庄家胜;其他点数玩家继续摇骰子,如果玩家摇出了7点,庄家胜;如果玩家摇出了第一次摇的点数,玩家胜;其他点数,玩家继续要骰子,直到分出胜负。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
from random import randint #调用随机函数random 数组函数randint

zongzichan=1000 #这是我们的赌博资产,哈哈,就在这个的基础上进行加减,
while zongzichan>0: #外循环,赌资就是我们的入场券,大于0就可以进入赌场了(循环内)
print('你的总资产为',zongzichan) #print 打印输出,告诉我们的资产有多少
bu=False #步,因为游戏规则的限制,所以,我们要在第一轮摇骰子时,
#将第一次判断用不到的放在后面,接着往下看
while True: #嵌套内循环,True让它直接通过,不用再验证
xz=int(input('请下注')) #要下注了,下多少赢回来多少,或者输多少
if 0<xz<=zongzichan: #判断,我们下注是否大于0小于我们的总额度
break #跳出循环,执行下面的程序
dianshu=randint(1,6)+randint(1,6) #因为有两个骰子,所以这里要将两个骰子的数加起来,
#randint建立两个1到6数组
print('玩家摇出了',dianshu,'点') #输出我们摇出来点数
if dianshu==7 or dianshu==11: #判断,当玩家第一次摇出了7或者11点,玩家胜
print('玩家胜')
zongzichan+=xz #给我们的财产加钱,同时进行下一次下注,也就是从上往下重新执行程序
elif dianshu==2 or dianshu==3 or dianshu==12: #或者玩家第一次摇到了2,3,12,点,
#那么庄家胜
print('庄家胜')
zongzichan-=xz #财产-n
else:
bu=True #又或者,上面的几个都没有摇到,
while bu: #进入这个循环
bu=False #复位bu
er=randint(1,6)+randint(1,6) #这里我们就要新建变量,不能用第一次的那个计数的了
# 因为第一次比如摇到了2,3,7,11,12点,这几个在第一次的判断中都是直接通过的,
# 但是没有摇到的话,就会到了这里,
# 比如在这里,第三次第四次都没有摇到与这个循环相匹配的点数,
#那就会一直循环,直到判断成功,决出胜负
print('玩家摇出了',er,'点')
if er==7:
print('庄家胜')
zongzichan-=xz
elif er==dianshu: #这个就是用在这个循环中摇的点数比较前面那个循环之前的点数,
#如果一样,就是玩家胜出
print('玩家胜')
zongzichan+=xz
else:
bu=True #这里起到了关键作用,这个循环内,点数不符合,就会执行它,
#然后重新进入本次循环,知道决出胜负
print('你破产了,等着被收债吧')