python例题十讲
李立宗
lilizong@gmail.com
2021年10月16日 版本V1.0
题目1:分组示例
有100个人参加体能测试,将所有人随机分成两组,并统计每组的人数。
分组思路
计算机随机生成100个值为1、2的随机数,分配个每个人。每个人根据编号到所在组报道。
知识点1:随机数
函数random:提供了进行随机选择的工具。
函数randint:生成指定范围内的随机数
语法:random.randint(a,b),生成在[a,b]之间的随机整数。
【例16.1.1】随机生成一个1到10之间的随机数。
import random
x = random.randint(1, 10)
print(x)
输出结果:
一个1到10之间的随机数。
知识点2:结构(循环、分支)
循环结构:for-in循环结构
选择结构:if分支结构
主程序
import random
x = [0, 0]
for i in range(100):
a = random.randint(1, 2)
if a == 1:
x[0] = x[0] + 1
else:
x[1] = x[1] + 1
print("第1组人数:", x[0])
print("第2组人数:", x[1])
输出结果:
第1组人数: 54
第2组人数: 46
每次运行的输出不一样,因为分组是根据随机值划分的。
改进1
将生成的数按照大小进行分组。
import random
x = [0, 0]
for i in range(100):
a = random.randint(0, 100)
if a > 50:
x[0] = x[0] + 1
else:
x[1] = x[1] + 1
print("第1组人数:", x[0])
print("第2组人数:", x[1])
输出结果:
第1组人数: 52
第2组人数: 48
上述是某次运算结果,由于是随机,每次情况略有不同,但是两组值会大体相当。
改进2
将生成的数按照奇数、偶数, 进行分组。
import random
x = [0, 0]
for i in range(100):
a = random.randint(0, 100)
if a % 2 == 0:
x[0] = x[0] + 1
else:
x[1] = x[1] + 1
print("第1组人数:", x[0])
print("第2组人数:", x[1])
输出结果:
第1组人数: 47
第2组人数: 53
题目2:票价示例
某公园,票价策略为:60岁及以上老人半价50元、成年人100元、未成年人免费。
需要有归纳能力,进一步归纳如下:
* >= 60:半价
* [18,60):正常票价
* <18:免费
知识点1:输入
input:读取键盘的输入
int:键盘读取的内容是字符串,需要使用int将其转换为数值类型
【例16.2.1】输入一个数值,观察其在作为字符串与数值时的不同处理结果。
x = input("请输入一个数值:")
print(x + "5")
print(int(x) + 5)
输出
请输入一个数值:10
105
15
知识点2:多分支结构
多分支:包含if…elif…else的分支结构
具体结构:
if 条件A:
语句A
elif 条件B:
语句B
else:
语句C
条件B是在条件A不成立的情况下发生的。
例如,如下的语句"elif x>50"是在“if x>60"不成立的情况下发生的。
因此,“elif x>50"对应的值范围是“在50到60之间(不包含50,包含60)”,即(50,60]。
import random
x = random.randint(0, 100)
print("x=", x)
if x > 60:
print("x>60")
elif x > 50:
print("x在50到60之间(不包含50,包含60)")
else:
print("x<=50")
主程序
x = int(input("请输入您的年龄:"))
print("您输入的年龄是:", x)
if x >= 60:
price = 50
elif x >= 18:
price = 100
else:
price = 0
print("您支付的票价为:", price)
输出:
上述程序,在输入不同年龄时,会对应不同的输出结果。
题目3:身高与票价
某公园规定:随同成人入园身高1.2~1.5米的儿童,应当购买儿童票;超过1.5米时应买全价票。每一成人游客可免费携带一名身高不足1.2米的儿童。
简单来说:归纳如下:
* >1.5:全价票
* [1.2,1.5]:儿童票
* <1.2:免费
或者,归纳如下:
* <1.2:免费
* [1.2,1.5]:儿童票
* >1.5:全价票
知识点1:输入控制
input:读取键盘的输入
int:键盘读取的内容是字符串,需要使用int将其转换为数值类型【针对整数】
float:键盘读取的内容是字符串,需要使用float将其转换为数值类型【针对小数】
【例16.3.1】输入一个数值,观察其在作为字符串与数值时的不同处理结果。
x = input("请输入一个数值:")
print(x + "5")
print(float(x) + 5)
输出
请输入一个数值:1.2
1.25
6.2
知识点2:多分支结构
多分支结构:包含if…elif…else的分支结构
主程序:范例1
- >1.5:全价票
- [1.2,1.5]:儿童票
- <1.2:免费
h = float(input("请输入您的身高:"))
print("您输入的身高是:", h)
if h > 1.5:
price = "全价票"
elif h >= 1.2:
price = "半价票"
else:
price = "免票"
print("您支付的票价为:", price)
输出:
上述程序,在输入不同身高时,会对应不同的输出结果。
主程序:范例2
- <1.2:免费
- [1.2,1.5]:儿童票
- >1.5:全价票
h = float(input("请输入您的身高:"))
print("您输入的身高是:", h)
if h < 1.2:
price = "免票"
elif h <= 1.5:
price = "半价票"
else:
price = "全价票"
print("您支付的票价为:", price)
输出:
上述程序,在输入不同年龄时,会对应不同的输出结果。
题目4:猴子吃桃
猴子第1天摘下若干桃子,当即吃了一半,还不过瘾,就又多吃了一个。第2天早上,将剩下的桃子吃掉一半后,又多吃了一个。以后,每天早上都吃前一天剩下的一半加一个。到第10天早上想再吃时,发现只剩下一个桃子了。求第1天共摘了多少。
问题分析
已知第10天(day10),则第9天(day9),存在如下关系:
d
a
y
9
=
(
d
a
y
10
+
1
)
?
2
day_9=(day_{10}+1)*2
day9?=(day10?+1)?2 实际上,依次类推往前推,每一天都是后一天加上1后的2倍。具体为:
d
a
y
N
?
1
=
(
d
a
y
N
+
1
)
?
2
day_{N-1}=(day_N+1)*2
dayN?1?=(dayN?+1)?2
也就是说,从第10天开始,依次往前推,每一天都是按照上述公式处理。
因此,可以使用循环【for i in range(9, 0, -1)】实现。
主程序
【例16.4.1】根据逻辑关系计算桃子的数量。
定义变量:today、yesterday分别表示今天的桃子数量、昨天的桃子数量。
循环:从当前第10天开始,计算第9天的桃子数量。依次循环。
today = 1
for i in range(9, 0, -1):
yesterday = (today + 1) * 2
today = yesterday
print('第1天共摘了%s个桃子' % yesterday)
【例16.4.2】显示每天的桃子的数量。
使用print语句显示每天的桃子数量。
today = 1
print('第10天吃之前:有1个桃子')
for i in range(9, 0, -1):
yesterday = (today + 1) * 2
today = yesterday
print('第', i, '天吃之前', '有', yesterday, '个桃子')
print('第1天共摘了%s个桃子' % yesterday)
当然,我们平时看到的程序,可能变量的定义比较随意。例如,可能为:
x2 = 1
print('第10天吃之前:有1个桃子')
for i in range(9, 0, -1):
x1 = (x2 + 1) * 2
x2 = x1
print('第', i, '天吃之前', '有', x1, '个桃子')
print('第1天共摘了%s个桃子' % x1)
改进1:使用一个变量。
不需要构造两个变量,仅仅使用一个变量更替实现即可。
具体为:
peach = (peach + 1) * 2
程序如下:
peach = 1
print('第10天吃之前:1个桃子')
for i in range(9, 0, -1):
peach = (peach + 1) * 2
print('第', i, '天吃之前', '有', peach, '个桃子')
print('第1天共摘了%s个桃子' % peach)
改进2:输出控制
使用%控制输出
%d:格式化输出一个整数;
%f:格式化输出浮点数;
%s:格式化输出字符串;
a = 666
print("数值%d表示非常有趣?" % a)
输出结果为:
数值666表示非常有趣?
更具体来说:
%4d:其中的4表示占位长度,占4位,不足在前面补空格;超过4位,全部显示。
%4.2f:数值4表示总长度、2表示2个小数位;
%8s:输出8位字符,不足时前面补空格、超过8位,全部显示;
peach = 1
print('第10天吃之前:1个桃子')
for i in range(9, 0, -1):
peach = (peach + 1) * 2
print('第%2d天吃之前:有%4d个桃子' % (i, peach))
print('第1天共摘了%s个桃子' % peach)
输出结果:
第10天吃之前:1个桃子
第 9天吃之前:有 4个桃子
第 8天吃之前:有 10个桃子
第 7天吃之前:有 22个桃子
第 6天吃之前:有 46个桃子
第 5天吃之前:有 94个桃子
第 4天吃之前:有 190个桃子
第 3天吃之前:有 382个桃子
第 2天吃之前:有 766个桃子
第 1天吃之前:有1534个桃子
第1天共摘了1534个桃子
可以看到输出中对输出的数据宽度进行了控制。
题目5:用户登录
某考试系统,用户名为“李立宗”,密码为“13602153866”。在用户输入正确的用户名和密码后,显示登陆成功;否则,显示“登录显示”。用户有三次试错机会。
知识点1:循环
用户具有三次机会,依靠循环实现。
for i in range(3)
这是典型的循环结构,通过控制range(N)中值N来控制循环的次数。
for i in range(3):
print("你好")
输出结果为:
你好 你好 你好 你好 你好
知识点2: break
关键字break,用于退出循环。
通常情况下,在某个特定条件下,退出循环。
for i in range(3):
if i == 2:
break
print(i)
输出结果为:
0 1
当用户输入正确的用户名和密码后,不再需要循环了,要退出循环。
知识点3:与或关系
与关系:and。两个条件同时成立,结果为真。类似于串联电路。
或关系:or。两个条件,有一个成立,结果为真。类似于并联电路。
与或关系具体示意图如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ckndP48d-1634395880549)(…/typora/image-20211016113042200.png)]
【例16.5.3】当用户名和密码都正确时、输出“登陆成功”;否则,输出“用户名或密码错误”。
name = input("请输入用户名:")
password = input("请输入密码:")
if name == "lilizong" and password == "13602153866":
print("登陆成功")
else:
print("用户名或密码错误")
【例16.5.4】当年龄大于60岁,或者小于18岁,免门票;否则,购买全价票。
age = int(input("请输入年龄:"))
if age > 60 or age < 18:
print("免门票")
else:
print("请购买全价票")
主程序
主程序如下:
for i in range(3):
name = input("请输入用户名:")
password = input("请输入密码:")
if name == "lilizong" and password == "13602153866":
print("登陆成功")
break
else:
print("用户名或密码错误")
题目6:九九乘法表
输入如下所示的九九乘法表。
1*1= 1
2*1= 2 2*2= 4
3*1= 3 3*2= 6 3*3= 9
4*1= 4 4*2= 8 4*3=12 4*4=16
5*1= 5 5*2=10 5*3=15 5*4=20 5*5=25
6*1= 6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1= 7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1= 8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1= 9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
知识点1:输出数据控制在同一行
将循环数据输出在同一行,采用【end=” “】控制每次输出不要换行,而是在输出结果加上空格。
for i in range(1, 10):
print(i, end=" ")
print()
程序输出如下:
1 2 3 4 5 6 7 8 9
需要注意,最后的【print()】表示在输出完所有的数值后,加一个换行。
知识点2:嵌套循环
嵌套循环是在循环里面嵌入循环。将内层循环看成一个独立的整体,更利于理解嵌套循环。
例如,将下面的【例16.6.1.py】内的代码看为一个整体,则可以将【在同一行输出1到9】作为一个整体。
将上述代码,用在一个循环体内,可以将上述代码执行指定的次数。
for j in range(1, 10):
for i in range(1, 10):
print(i, end=" ")
print()
程序输出如下:
1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9
从上述程序可以看到,还需要做两点改进:
**改进1:**将每一行乘以行号:第1行乘以1,第2行乘以2,以此类推。实际上每一行乘以j的值;
**改进2:**控制每一行输出的数值个数,第1行输出1个数值,第2行输出2个数值,以此类推。实际上,每行输出的个数是j个值。
知识点3:嵌套循环内运算
**改进1:**将每一行乘以行号:第1行乘以1,第2行乘以2,以此类推。实际上每一行乘以j的值;
# 例16.6.3.py
for j in range(1, 10):
for i in range(1, 10):
print(i * j, end=" ")
print()
程序输出如下:
1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81
知识点4:嵌套循环次数控制
**改进2:**控制每一行输出的数值个数,第1行输出1个数值,第2行输出2个数值,以此类推。实际上,每行输出的个数是j个值。
for j in range(1, 10):
for i in range(1, j+1):
print(i * j, end=" ")
print()
程序输出如下:
1 2 4 3 6 9 4 8 12 16 5 10 15 20 25 6 12 18 24 30 36 7 14 21 28 35 42 49 8 16 24 32 40 48 56 64 9 18 27 36 45 54 63 72 81
主程序
将乘数加上,结果如下:
# 例16.6.5.py
for i in range(1, 10):
for j in range(1, i + 1):
print(i, '*', j, '=', i * j, end=" ")
print()
输出结果如下:
1 * 1 = 1 2 * 1 = 2 2 * 2 = 4 3 * 1 = 3 3 * 2 = 6 3 * 3 = 9 4 * 1 = 4 4 * 2 = 8 4 * 3 = 12 4 * 4 = 16 5 * 1 = 5 5 * 2 = 10 5 * 3 = 15 5 * 4 = 20 5 * 5 = 25 6 * 1 = 6 6 * 2 = 12 6 * 3 = 18 6 * 4 = 24 6 * 5 = 30 6 * 6 = 36 7 * 1 = 7 7 * 2 = 14 7 * 3 = 21 7 * 4 = 28 7 * 5 = 35 7 * 6 = 42 7 * 7 = 49 8 * 1 = 8 8 * 2 = 16 8 * 3 = 24 8 * 4 = 32 8 * 5 = 40 8 * 6 = 48 8 * 7 = 56 8 * 8 = 64 9 * 1 = 9 9 * 2 = 18 9 * 3 = 27 9 * 4 = 36 9 * 5 = 45 9 * 6 = 54 9 * 7 = 63 9 * 8 = 72 9 * 9 = 81
改进:格式控制
通过格式控制符控制输出的格式:
for i in range(1, 10):
for j in range(1, i + 1):
print("%d*%d=%-2d" % (i, j, i * j), end=" ")
print()
输出结果如下:
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
题目7:平均身高
编写一个程序,能够测量本组同学的平均身高。
知识点1:循环控制
要点1:控制次数。通过读取一个数据n,将n作为控制循环的次数。
要点2:显示当前的次数。实现起来包含两点:
要点2.1:使用str(i+1),将数值转换为字符串,方便后续运算。数值无法与字符串直接运算。
要点2.2:使用加号“+”完成字符串的连接。例如:【“第”+str(i+1)+“次读取数据”】
s = 0
n = int(input("本组同学个数:\n"))
for i in range(n):
print("第"+str(i+1)+"次读取数据")
输出结果如下:
本组同学个数: 3 第1次读取数据 第2次读取数据 第3次读取数据
知识点2:求和
想象有三堆豆子,第1堆有1个,第2堆有2个,第3堆有3个。
拿一个空盒子,分别把豆子装进盒子里。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U9zvjxNB-1634395880555)(…/typora/image-20211016140726080.png)]
步骤1:在第1堆豆子旁,把第1堆里面的一粒豆子,放进盒子。
盒子(新值) = 盒子(原有值) + 1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zGYe75Cl-1634395880557)(…/typora/image-20211016140747332.png)]
步骤2:在第2堆豆子旁,把第2堆里面的2粒豆子,放进盒子。
盒子(新值) = 盒子(原有值) + 2
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zcra0bUy-1634395880559)(…/typora/image-20211016140759031.png)]
步骤3:在第3堆豆子旁,把第3堆里面的3粒豆子,放进盒子。
盒子(新值) = 盒子(原有值) + 3
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vlzOZlZD-1634395880560)(…/typora/image-20211016140814211.png)]
【例16.7.2】设计一个程序,计算1到数值N的和。
s = 0
n = int(input("要加到几:\n"))
for i in range(n+1):
s += i
print("和为:", s)
程序输出如下:
要加到几: 5 和为: 15
【例16.7.3】设计一个程序,计算指定个数的输入数值的和。
s = 0
n = int(input("要计算几个数:\n"))
for i in range(n):
a = float(input('请输入一个数值:'))
s += a
print("和为:", s)
程序输出如下:
要计算几个数: 3 请输入一个数值:6 请输入一个数值:9 请输入一个数值:8 和为: 23.0
主程序
s = 0
n = int(input("本组同学个数:\n"))
for i in range(n):
h = float(input('请输入身高值:'))
s += h
average = s / n
print("本组同学的平均身高值为:%.2f" % average)
程序输出如下:
本组同学个数:
3
请输入身高值:1.81
请输入身高值:1.65
请输入身高值:1.72
本组同学的平均身高值为:1.73
改进:增加说明
增加输入提示说明
s = 0
n = int(input("本组同学个数:\n"))
for i in range(n):
h = float(input('请输入第' + str(i+1) + '个同学的身高:'))
s += h
average = s / n
print("本组同学的平均身高值为:%.2f" % average)
程序输出结果如下:
本组同学个数: 3 请输入第1个同学的身高:1.81 请输入第2个同学的身高:1.62 请输入第3个同学的身高:1.78 本组同学的平均身高值为:1.74
题目8:猜数字游戏
设计一个猜数字游戏。计算机随机生成一个数字,用户猜测该数字值。计算机针对用户的猜测结果报告“比这个数值小”,或者“比这个数值大”;直到用户猜对了,提示“完全正确”。
import random
guess = 0
result = random.randint(0, 100)
time = 0
while guess != result:
time += 1
guess = int(input('请输入您的猜测值(0-100之间的整数):'))
if guess > result:
print('您的猜测比答案大')
elif guess < result:
print('您的猜测比答案小')
else:
print('预测' + str(time) + '次,你猜中了!')
break
题目9:数值各位和
随机生成一个三位数,计算其各个位上数值的和。
例如,数值168其各位和为“1+6+8=15”。
计算个位:使用求余数“%”,计算得到。例如,168%10=8
计算十位:使用求整除“//”和求余数“%”,计算得到。例如,首先计算“168//10=16”,接下来计算“16%10=6”。
计算百位:使用整除“//”,计算得到。例如,168//100=1
主程序
import random
x = random.randint(100, 999)
gewei = x % 10
shiwei = x // 10 % 10
baiwei = x // 100
sum = gewei + shiwei + baiwei
print("随机数为:%d,其各个位上和为:%d" % (x, sum))
输出结果:
随机数为:339,其各个位上和为:15
拓展:不同方式计算十位值
计算十位,有两种不同的方式:
方式1:先取到前两位,再取最低位。例如,【168//10=16,16%10=6】。
方式2:先取到后两位,再取最高位。例如,【168%100=68,68//10=6】。
import random
x = random.randint(100, 999)
x1 = x // 10 % 10
x2 = x % 100 // 10
print("随机数为:", x)
print("使用方式1,其十位值为:", x1)
print("使用方式2,其十位值为:", x2)
题目10:半径和直径互换
设计一个程序, 当输入一个半径值时,输出对应的直径值;当输入一个直径值时,输出对应的半径值。
知识点1:eval函数
eval函数将字符转换为数值类型。
x = input('请输入长度值:')
y = eval(x)
print(x + "5.3")
print(y + 5)
输出结果如下:
请输入长度值:1.1 1.15.3 6.1
知识点2:成员运算符
关键字in:
in:某个元素在集合内。例如:
print("张三" in ["张三", "李四", "王五"])
print("赵六" in ["张三", "李四", "王五"])
关键字not in:
not in:某个元素不在集合内。例如:
print("张三" not in ["张三", "李四", "王五"])
print("赵六" not in ["张三", "李四", "王五"])
主程序
value = eval(input('请输入长度值:'))
x = input('请输入值的含义(r或d):')
if x in ['r', 'R', '半径']:
d = value * 2
print('该半径所对应的直径值为:', d)
elif x in ['d', 'D', '直径']:
r = value / 2
print('该直径所对应的半径值为:', r)
else:
print('输入错误!')
输入直径值时,输出结果如下:
请输入长度值:10.2 请输入值的含义(r或d):d 该直径所对应的半径值为: 5.1
输入半径值时,输出结果如下:
请输入长度值:2.5 请输入值的含义(r或d):r 该半径所对应的直径值为: 5.0
说明
本版本为 1.0,完成于2021年10月6日。
联系我们:lilizong@gmail.com
如诸君认为本书对您略有帮助,不妨扫码请笔者喝杯咖啡 .
严正声明:本书可免费用于学习和研究目的,可自由传播,但切勿擅自用 于商业用途或私自引用,笔者保留著作权相关权利。
关注公众号【计算机视觉之光】,微信号【cvlight】,扫描关注获取源代码等更多资料。 在公众号内回复关键字【python案例十讲】获取源代码及PDF文件。
|