1、分支结构
其他程序语言,一般需要用花括号{}来构造分支结构,但python主要靠缩进,相同缩进的程序为同一个代码块。这个特性,使python具有非常好的可读性。
一般建议代码块的缩进4个空格,不要使用tab键。条件分支常用if ... esif...else。另外,需要注意python没有unless,也不用!取“否”逻辑。可以用if not代替。
2、循环结构
python中的循环结构主要有for .. in ..和while两个。其中,while可通过构建死循环、达到条件退出循环,来构建程序。循环结构中,continue代替了perl里的next,break跳出当前循环。具体用法可见下面的示例。
3、构造程序
当学习完元素、条件结构、循环结构以后,就可以写出一些可用的程序了。下面我们使用python程序,解决一些经典问题。
1、寻找水仙花数
说明:水仙花数也被称为超完全数字不变数、自恋数、自幂数、阿姆斯特朗数,它是一个3位数,该数字每个位上数字的立方之和正好等于它本身,例如:。
import re
j = 1
for i in range(100,1000):
i_search = re.search(r"(\d)(\d)(\d)",str(i)) #将int型转换为string,进行正则表达式匹配
ba = i_search.group(1)
sh = i_search.group(2)
ge = i_search.group(3)
mi = int(ba)**3 + int(sh)**3 + int(ge)**3 #将string型转换为int型,进行幂运算
if mi == i:
print("第",j,"个水仙花数是:",i)
j += 1
#Print
#第 1 个水仙花数是: 153
#第 2 个水仙花数是: 370
#第 3 个水仙花数是: 371
#第 4 个水仙花数是: 407
这里我用了正则表达式确定百位、十位和个位的数字,原作者使用的是整除和模运算,三位数对100整除//,得到百位数,三位数对10取模的个位数%,先对10整除,再对10取模得十位数 num // 10 % 10。
2、百钱百鸡问题
说明:百钱百鸡是我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?翻译成现代文是:公鸡5元一只,母鸡3元一只,小鸡1元三只,用100块钱买一百只鸡,问公鸡、母鸡、小鸡各有多少只?
#百钱百鸡问题
for i in range(0,21):
for j in range(0,34):
for f in range(0,101):
if i + j +f == 100 and 5*i +3*j +1/3*f == 100:
print("分别可以买到公鸡、母鸡、小鸡:",i,"、",j,"、",f,"只")
#Result
#分别可以买到公鸡、母鸡、小鸡: 0 、 25 、 75 只
#分别可以买到公鸡、母鸡、小鸡: 4 、 18 、 78 只
#分别可以买到公鸡、母鸡、小鸡: 8 、 11 、 81 只
#分别可以买到公鸡、母鸡、小鸡: 12 、 4 、 84 只
3、CRAPS赌博游戏
说明:CRAPS又称花旗骰,是美国拉斯维加斯非常受欢迎的一种的桌上赌博游戏。该游戏使用两粒骰子,玩家通过摇两粒骰子获得点数进行游戏。简单的规则是:玩家第一次摇骰子如果摇出了7点或11点,玩家胜;玩家第一次如果摇出2点、3点或12点,庄家胜;其他点数玩家继续摇骰子,如果玩家摇出了7点,庄家胜;如果玩家摇出了第一次摇的点数,玩家胜;其他点数,玩家继续要骰子,直到分出胜负。
#CRAPS赌博游戏
import random
print("来玩CRAPS赌博游戏吧")
input("游戏开始,你是玩家,请你开始掷骰子:")
tou1 = random.randint(1,6)
tou2 = random.randint(1,6)
First_dian = tou1 + tou2
print("你分别掷出了",tou1,"和",tou2,"点")
print("第一次掷出的点数为:",tou1+tou2,"点")
if tou1 + tou2 == 7 or tou1 + tou2 == 11:
print("恭喜你,你掷出了",tou1+tou2,"点,你获得了胜利")
elif tou1+tou2 == 2 or tou1+tou2 == 3 or tou1+tou2 ==12:
print("很遗憾,你掷出了",tou1+tou2,"点,庄家获得了胜利")
else:
while True:
print("掷出的点数为",tou1+tou2,",没人获得胜利")
input("继续掷骰子吧:")
tou1 = random.randint(1,6)
tou2 = random.randint(1,6)
print("你分别掷出了",tou1,"和",tou2,"点")
if tou1+tou2 == 7:
print("很遗憾,你掷出了",tou1+tou2,"点,庄家获得了胜利")
break
elif tou1+tou2 == First_dian:
print("恭喜你,你掷出了",tou1+tou2,"点,和第一次的点数相同,你获得了胜利")
break
4、生成斐波那契数列的前20项
斐波那契数列的特点是数列的前两个数都是1,从第三个数开始,每个数都是它前面两个数的和
#生成斐波那契数列
i = 1
a = 1
b = 1
Fib = [a,b]
while i <= 20 :
c = a + b
a = b
b = c
i +=1
Fib = Fib + [c]
print("斐波那契数列的前20项为:",Fib)
#斐波那契数列的前20项为: [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711]
5、找出10000内的完美数
说明:完美数又称为完全数或完备数,它的所有的真因子(即除了自身以外的因子)的和(即因子函数)恰好等于它本身。例如:6()和28()就是完美数。完美数有很多神奇的特性,有兴趣的可以自行了解。
#寻找10000以内的完美数
wanm = []
for i in range(2,10001):
yin = []
for j in range(1,i):
if(i % j ==0):
yin = yin + [j]
if sum(yin) == i:
wanm = wanm + [i]
print("10000以内的完美数有:",wanm)
#10000以内的完美数有: [6, 28, 496, 8128]
6、输出100内的所有素数
说明:素数指的是只能被1和自身整除的正整数(不包括1)。
#输出100内的所有素数
su = []
for i in range(2,100):
count = 0
for j in range(1,i):
if i % j == 0:
continue
else:
count = count + 1
if count + 2 == i:
su = su + [i]
print("100内的素数有:",su)
#100内的素数有: [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]