教材《Python语言程序设计基础》
第二章作业(9.15实训)
2.2
TempStr = input("请输入带有符号的温度值:")
if TempStr[-1] in ['F','f']:
C = (eval(TempStr[0:-1])-32)/1.8
print("转换后的温度是{:.2f}C".format(C))
elif TempStr[-1] in ['C','C']:
F=1.8*eval(TempStr[0:-1])+32
print("转换后的温度是{:.2f}F".format(F))
else:
print("输入格式错误")
TempStr = input("请输入带有符号的金额:")
if TempStr[-1] in ['$']:
C = (eval(TempStr[0:-1]))*6
print("该金额对应的人民币额度是{:.2f}¥".format(C))
elif TempStr[-1] in ['¥']:
F=(eval(TempStr[0:-1]))/6
print("该金额对应的美元额度是{:.2f}$".format(F))
else:
print("输入格式错误")
2.3
import turtle
turtle.setup(650,350,200,200)
turtle.penup()
turtle.fd(-250)
turtle.pendown()
turtle.pensize(25)
turtle.pencolor("purple")
turtle.seth(-40)
for i in range(4):
turtle.circle(40,80)
turtle.circle(-40,80)
turtle.circle(40,80/2)
turtle.fd(40)
turtle.circle(16,180)
turtle.fd(40*2/3)
import turtle
a=['green','red','yellow','pink']
turtle.setup(650, 350, 200, 200)
turtle.penup()
turtle.fd(-250)
turtle.pendown()
turtle.pensize(25)
turtle.seth(-40)
for i in range(4):
turtle.pencolor(a[i])
turtle.circle(40, 80)
turtle.circle(-40, 80)
turtle.pencolor("purple")
turtle.circle(40, 80/2)
turtle.fd(40)
turtle.circle(16, 180)
turtle.fd(40 * 2/3)
turtle.exitonclick()
2.4
import turtle
for i in range(3):
turtle.seth(i*120)
turtle.fd(100)
turtle.exitonclick()
2.5
import turtle
turtle.setup(800, 600)
#turtle.pensize(20)
# 设置画笔大小
#turtle.pencolor('pink')
# 设置颜色
for i in range(7):
# 绘制外层大三角形
if i < 3:
turtle.fd(200)
turtle.left(120)
# 每次前进之后转向
# 绘制内层小三角形
elif i < 5:
turtle.fd(100)
turtle.left(120)
else:
turtle.left(120)
turtle.fd(100)
turtle.left(120)
turtle.done()
turtle.exitonclick()
2.6
import turtle
turtle.pensize(2)
turtle.seth(0)
for i in range(1,5):
turtle.penup()
turtle.forward(20)
turtle.pendown()
turtle.forward(100)
turtle.penup()
turtle.forward(20)
turtle.pendown()
turtle.left(90)
turtle.done()
2.7
import turtle
turtle.pensize(2)
turtle.seth(30)
turtle.forward(100)
turtle.right(120)
turtle.forward(100)
turtle.right(120)
turtle.forward(100)
turtle.penup()
turtle.seth(0)
turtle.forward(115.6)
turtle.pendown()
turtle.seth(150)
turtle.forward(100)
turtle.left(120)
turtle.forward(100)
turtle.left(120)
turtle.forward(100)
turtle.exitonclick()
2.8
import turtle
turtle.pensize(2)
for x in range(100):
turtle.forward(2*x)
turtle.left(90)
turtle.done()
turtle.exitonclick()
第三章作业
3.1重量计算
月球上物体的体重是在地球上的16.5%,假如你在地球上每年增长0.5kg,编写程序输出未来10年你在地球和月球上的体重状况。
m=65
n=0
for i in range(1,11):
m+=0.5
n = 0.165*m
print("未来第{:d}年我在地球上的体重是{:.2f}kg".format(i,m))
print("未来第{:d}年我在月球上的体重是{:.2f}kg".format(i,n))
未来第1年我在地球上的体重是65.50kg
未来第1年我在月球上的体重是10.81kg
未来第2年我在地球上的体重是66.00kg
未来第2年我在月球上的体重是10.89kg
未来第3年我在地球上的体重是66.50kg
未来第3年我在月球上的体重是10.97kg
未来第4年我在地球上的体重是67.00kg
未来第4年我在月球上的体重是11.05kg
未来第5年我在地球上的体重是67.50kg
未来第5年我在月球上的体重是11.14kg
未来第6年我在地球上的体重是68.00kg
未来第6年我在月球上的体重是11.22kg
未来第7年我在地球上的体重是68.50kg
未来第7年我在月球上的体重是11.30kg
未来第8年我在地球上的体重是69.00kg
未来第8年我在月球上的体重是11.38kg
未来第9年我在地球上的体重是69.50kg
未来第9年我在月球上的体重是11.47kg
未来第10年我在地球上的体重是70.00kg
未来第10年我在月球上的体重是11.55kg
3.2天天向上续(一)
假设能力增长符合如下带有平台期的模型:以七天为一个周期,连续学习3天能力值不变,从第四天至第七天每天能力增长为前一天的1%。
如果7天有一天间断学习,则周期从头计算。
请编写程序回答,如果初始能力值为1,连续学习365天后能力值为多少?
m=1
n=0
for i in range(1,366):
n+=1
if n>3:
m=1.01*m
print("连续学习{:d}天后能力值是{:.2f}".format(i,m))
连续学习365天后能力值是36.67
3.3天天向上续(二)
如果初始能力值为1,固定每10天休息1天,365天后能力值是多少?15天休息一天呢?
m=1
n=0
for i in range(1,366):
n+=1
if n>3:
m=1.01*m
if n==11:
n=0
print("连续学习{:d}天后能力值是{:.2f}".format(i,m))
连续学习365天后能力值是13.83
3.4 回文数判断
设n是任意自然数,如果n的各位数字反向排列所得自然数与n相等,则n被称为回文数。
从键盘输入一个5位数字,请编写程序判断这个数字是不是回文数。
m=(input("请输入5位整数:"))
n=eval(m)
if(10000<n and n<100000):
if m == m[::-1]:
print("是回文数")
else:
print("不是回文数")
# print("连续学习{:d}天后能力值是{:.2f}".format(i,m))
else:
print("输入格式错误")
请输入5位整数:12321
是回文数
3.5田字格的输出:
a = " + "
b = " "
c = " — "
d = " | "
for h in range(1,12): #田字格有11行
for l in range(1,12): #田字格有11列
if h in [1,6,11] and l in [1,6,11]:
print(a,end="")
if h in [1,6,11] and l not in [1,6,11]:
print(c,end="")
if h not in [1,6,11] and l in [1,6,11]:
print(d,end="")
if h not in [1,6,11] and l not in [1,6,11]:
print(b,end="")
if l==11 :
print()
+ — — — — + — — — — +
| | |
| | |
| | |
| | |
+ — — — — + — — — — +
| | |
| | |
| | |
| | |
+ — — — — + — — — — +
进程已结束,退出代码0
3.6文本进度条
import time
scale = 10
print("staring",end="")
for i in range(scale+1):
a = '·'
# b = ' . . ' * (scale - 1)
c = (i / scale) * 100
print(" {}".format(a),end="")
time.sleep(0.1)
print("Done!")
3.7文本风格
while True:
for i in ["/","-","|","\\","|"]:
print("%s\r" %i,end='')
3.8tqdm
from tqdm import tqdm
from time import sleep
for i in tqdm(range(1,100)):
sleep(0.01)
第四章作业
4.1猜数游戏
在程序中预设一个0~9之间的整数,让用户通过键盘输入所猜的数,如果大于预设的数,显示“遗憾,太大了”;小于预设的数,显示“遗憾,太小了”,如此循环,直至猜中该数,显示“预测N次,你猜中了!”,其中N是用户输入数字的计数。
import random
r= random.randrange(0,9,1)
i=1
while(1):
g=eval(input("输入猜的数"))
if(g>r):
print("阿巴阿巴,大了")
i+=1
continue
elif(g<r):
print("欸嘿,小了")
i+=1
continue
else:
print(" 预测{}次后,你猜中了".format(i))
break
4.2统计不同字符个数
用户从键盘输入一行字符,编写一个程序,统计并输出其中英文字符、数字、空格和其他字符的个数。
s=input("输入一行字符:")
alpha,number,space,other=0,0,0,0
for i in s:
if('a'<= i<='z' or 'A'<=i<='Z' ):
alpha+=1
elif('0'<=i<='9'):
number+=1
elif(i==' '):
space+=1
else:
other+=1
print("字母有{}个,数字有{}个,空格有{}个,其他有{}个".format(alpha,number,space,other))
4.3最大公约数计算
从键盘接受两个整数,编写程序求出这两个整数的最大公约数和最小公倍数
(提示:求最大公约数可用辗转相除法,求最小公倍数则用两数的积除以最大公约数即可)
a=int(input("输入第一个数:"))
b=int(input("输入第二个数:"))
m=max(a,b)
n=min(a,b)
t=m%n
while t!=0:
m,n=n,t
t=m%n
s=int(a*b/n)
print("{}和{}的最大公约数为{}".format(a,b,n))
print("{}和{}的最小公倍数为{}".format(a,b,s))
4.4猜数游戏续(一)
改编4.1,让计算机能够随机产生一个预设数字,范围在0~100之间,其他游戏规则不变。
import random
r= random.randrange(0,100,)
i=1
while(1):
g=eval(input("输入猜的数"))
if(g>r):
print("阿巴阿巴,大了")
i+=1
continue
elif(g<r):
print("欸嘿,小了")
i+=1
continue
else:
print(" 预测{}次后,你猜中了".format(i))
break
4.5猜数游戏续(二)
对于4.4,当用户输入的不是整数(如字母、浮点数等)时,程序会终止执行并退出。改编该程序,当用户输入出错时给出“输入内容必须为整数!”的提示,并让用户重新输入。
import random
r= random.randrange(0,100,)
i=1
while(1):
g=(input("输入猜的数"))
if '0'<g and g<'9':
g=eval(g)
if(g>r):
print("阿巴阿巴,大了")
i+=1
continue
elif(g<r):
print("欸嘿,小了")
i+=1
continue
else:
print(" 预测{}次后,你猜中了".format(i))
break
else:
print("输入内容必须为整数!")
4.6羊车门问题
有三扇关闭的门,一扇门后面停着汽车、其余门后是山羊,只有主持人知道每扇门后面是什么。参赛者可以选择一扇门,在开启它之前,主持人会开启另一扇门,露出门后的山羊,然后允许参赛者更换自己的选择。
请问,参赛者更换选择后能否增加猜中汽车的机会?
请使用random库对这个随机事件进行预测,分别输出参赛者改变选择和坚持选择获胜的几率。
import random
n=0
m=0
for i in range(100000):
a=random.randint(1,3)#规定1后面是车,23后面是羊,随机选择
if a==1:
n=n+1
print("不更改选中车的概率:{}".format(n/100000))
for j in range(100000):
b=random.randint(1,3)
if b==1:#换后选中车建立在第一次选中羊的基础上
continue
else:#23等价,翻开的定义为3,选中的定义为2
c=random.randint(1,2)#问题变为在两扇门间选择,且已经选中羊,更换必中车
m=m+1
print("更改选中车的概率:{}".format(m/(100000)))
4.7异常处理
请用异常处理改造实例(根据圆的半径计算圆的面积和周长),使其能够接收并处理用户的任何输入。
import math
try:
r=eval(input("请输入半径:"))
c=math.pi *r*2
s=math.pi *(r**2)
print("周长是{:.2f},面积为{:.2f}".format(c,s))
except NameError:
print("请输入正整数")
except:
print("其他错误")
第五章作业
5.1 更大田字格
仿造习题3.5输出一个更大的田字格,用函数简化其代码,田字格为4x4
a,b,c,d='+ ','-- ','|',' '
def line(m):
for i in range(m*5+1):
print("{}".format(a if i%5==0 else b),end='')
print()
def littlesquare(m):
line(m)
for j in range((m+2)*4):
print("{}{}".format(c,d*13),end='') if j%(m+2)!=m+1 else print("")
def tsquare(m,n):
for i in range(n):
littlesquare(m)
line(m)
tsquare(4,4)
5.2 isOdd()函数
实现isOdd()函数,参数为整数,如果整数为奇数,返回True,否则返回False
def isOdd(a):
if a%2 !=0:
print("True")
return True
else:
print("False")
return False
isOdd(3)
isOdd(4)
5.3 isNum()函数
参数为一个字符串,如果这个字符串属于整数、浮点数或复数的表示,返回True,否则返回False
def isOdd(a):
if type(a) == int or type(a) == float or type(a) == complex:
print("True")
return True
else:
print("False")
return False
isOdd('m')
isOdd(3)
5.4 multi()函数
参数个数不限,返回所有参数的乘积
def multi():
try:
str=input("输入要相乘的参数,用空格隔开:")
c=1
for item in str.split():
c=c*int(item)
print(c)
except:
print("error")
multi()
5.5 isPrime()函数
参数为整数,要有异常处理。如果整数是质数,返回True,否则返回False。
import math
def isPrime(n):
try:
if n <= 1:
print("请输入大于一正整数")
for i in range(2, int(math.sqrt(n) + 1)):
if n % i == 0:
print("非质数")
return False
print("是质数")
return True
except:
print("error")
isPrime(3)
isPrime(4)
isPrime(5)
5.6 datetime库
使用datetime库,对自己的生日输出不少于10种日期格式。
5.7 汉诺塔
def hanoi(n,A,B,C): #定义汉诺塔函数,参数n是圆盘数,A、B、C是3根柱
if n==1: #判断圆盘数,如果等于1,递归条件
print(A,'-->',C,' ',n) # 直接将A柱上的圆盘移动到C柱上
else: #否则,进行递归移动
hanoi(n-1,A,C,B) #递归将A柱最上方的n-1个盘子落在B柱
print(A,'-->',C,' ',n) # 输出将A柱上的圆盘移动到C柱上,也就是将A柱的最小面盘子落在C柱
hanoi(n-1,B,A,C) #递归将B柱上的n-1个盘子,落在C柱
hanoi(6,'A','B','C') #调用函数
D:\coder\randomnumbers\venv\Scripts\python.exe D:/coder/randomnumbers/chengxusheji.py
A --> B 1
A --> C 2
B --> C 1
A --> B 3
C --> A 1
C --> B 2
A --> B 1
A --> C 4
B --> C 1
B --> A 2
C --> A 1
B --> C 3
A --> B 1
A --> C 2
B --> C 1
A --> B 5
C --> A 1
C --> B 2
A --> B 1
C --> A 3
B --> C 1
B --> A 2
C --> A 1
C --> B 4
A --> B 1
A --> C 2
B --> C 1
A --> B 3
C --> A 1
C --> B 2
A --> B 1
A --> C 6
B --> C 1
B --> A 2
C --> A 1
B --> C 3
A --> B 1
A --> C 2
B --> C 1
B --> A 4
C --> A 1
C --> B 2
A --> B 1
C --> A 3
B --> C 1
B --> A 2
C --> A 1
B --> C 5
A --> B 1
A --> C 2
B --> C 1
A --> B 3
C --> A 1
C --> B 2
A --> B 1
A --> C 4
B --> C 1
B --> A 2
C --> A 1
B --> C 3
A --> B 1
A --> C 2
B --> C 1
八皇后问题
参考:
https://blog.youkuaiyun.com/Wangtuo1115/article/details/106862490?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166565012216800180668737%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=166565012216800180668737&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-2-106862490-null-null.142v55control,201v3add_ask&utm_term=%E5%85%AB%E7%9A%87%E5%90%8E%E9%97%AE%E9%A2%98python&spm=1018.2226.3001.4187
def conflict(state, nextColumn):
"""
判断是否冲突
因为坐标是从0开始的,所以state的长度代表了下一行的行坐标
:param state:(7,4,6,0,2) 标记每行皇后所在的位置 (0,7)一行八列 (2,4) (3,6) (4,0) (5,2)
:param nextColumn:下一行的列坐标
:return:
"""
nextRow = rows = len(state) # 5
for row in range(rows): # 0,1,2,3,4
# 获取当前行的列
column = state[row]
"""
如何判断是否冲突:
1. 如果列的差值为0,说明两皇后在同一列
2. 如果列的差值等于行的差值,说明两皇后在对角线上
"""
if abs(column - nextColumn) in [0, nextRow - row]:
return True
return False
# 采用生成器的方式来产生每一个皇后的位置,并用递归来实现下一个皇后的位置
def queens(num, state=()):
"""
基于递归采用回溯算法,算出每一种结果
:param num: 皇后的数量 8
:param state: 列坐标。初始为空。参数为元组不为列表,因为参数只能为不可变数据类型
:return:
"""
# 每一行的列坐标都是从0:7的
# 0,1,2,3,4,5,6,7
for pos in range(num):
# 默认state为空。长度为0,但是是不冲突的
# 判断是否冲突,state为空时不冲突
if not conflict(state, pos): # 回溯法的体现
# 如果state的长度为7,即到达了倒数第二行,也就是前7行皇后都已经找到了位置,最后一行又没有冲突,返回最后一行的列坐标
if len(state) == num - 1:
# 最后一行的(pos,)=最后一行的result,然后再递归回去求倒数第二行的result
yield (pos,)
else:
for result in queens(num, state + (pos,)):
"""
递归实现求state:
1. 向下递归
第一次(行): pos=0,刚开始不会进入if len(state) == num - 1,进入执行else,会执行queens(num, state + (pos, )),
第二次(行): 进入else,再调用queens(num, state + (pos, )),递归执行queens(num, state + (pos,) + (pos,))
第三次(行): 进入else,再调用queens(num, state + (pos,) + (pos,),递归执行queens(num, state + (pos,) + (pos,) + (pos,))
...
第七次(行): 执行和上面的一样,不过此时state的长度为7
第八次(行): 执行f len(state) == num - 1:求出最后一行的列坐标(pos,)
2.向上递归
求出第八行的列坐标,就可以求出第七行的(pos,),返回的是第七行和第八行的列坐标((pos,) + result)
根据下一行的结果依次求出上一行的结果;
....
最后求出第一行的列坐标,返回整体结果
"""
yield (pos,) + result
def prettyprint(solution):
"""
进行友好展示:为了至关表现棋盘,用X表示皇后的位置
:param solution:
:return:
"""
def line(pos, length=len(solution)):
return '.' * (pos) + '@' + '.' * (length - pos - 1)
for pos in solution:
print(line(pos))
if __name__ == '__main__':
solutions = queens(8)
for index, solution in enumerate(solutions):
print('第%d种解决方案:' % (index + 1), solution)
prettyprint(solution)
print('*' * 50)
第六章作业
6.1 随机密码生成
编写程序,在26个字母大小写和9个数字组成的列表中随机生成10个8位密码。
import random
letter = ['a','b','c','d','e','f','g','h','i',
'j','k','l','m','n','o','p','q','r',
's','t','u','v','w','x','y','z',
'A','B','C','D','E','F','G','H','I',
'J','K','L','M','N','O','P','Q','R',
'S','T','U','V','W','X','Y','Z',
1,2,3,4,5,6,7,8,9]
i = 0
while i < 10:
password = []
p = 0
while p < 8:
s = random.randint(1,60)
password.append(letter[s])
p += 1
i += 1
print("生成的随机密码是:{}{}{}{}{}{}{}{}".format(password[0],password[1],password[2],
password[3],password[4],password[5],password[6],password[7]))
6.2 重复元素判定
编写一个函数,接受列表作为参数,如果一个元素在列表中出现了不止一次,则返回True,但不要改变原来列表的值。同时编写调用这个函数和测试结果的程序。
str1=input('输入以英文逗号分隔列表元素')
list1=str1.split(',')
##print(tongji(list1))
def tongji(list1):
set1=set(list1)
if len(set1)<len(list1): #小于表示有重复元素,集合可以去除重复元素
return True
else:
return('列表没有重复元素')
print(tongji(list1))
def tongji(list1):
for p in list1:
num=list1.count(p)
if num>1:
return True
else:
continue
str1=''
while True:
str2=input('输入列表元素,以回车结束')
str1+=str2
if str2=='':
break
print(str1)
list1=list(str1)
print(tongji(list1))
输入列表元素,以回车结束1
输入列表元素,以回车结束2
输入列表元素,以回车结束3
输入列表元素,以回车结束
123
None
6.3 重复元素判定(续)
利用集合的无重复性改写6.2,获得一个更快更简洁的版本。
6.4 文本字符分析
编写程序接收字符串,按字符出现频率的降序打印字母。分别尝试录入一些中英文文章片段,比较不同语言之间字符频率的差别。
#文本字符分析
#统计输入的字符串,按字符出现频率并按照降序方式打印字母
text = input("请输入一段文本(回车退出):")
while text != '':#如果为空则退出循环
d = {}
for word in text:
d[word] = d.get(word,0) + 1
#转为列表类型对其排序
ls = list(d.items())
ls.sort(key=lambda x:x[1],reverse = True)#以记录第二列排序
for i in range(len(ls)):
word, count = ls[i]
print("{0:<10}{1:>5}".format(word,count))
text = input("请输入一段文本(回车退出):")
请输入一段文本(回车退出):玛娜桓那兰那阿薛那
那 3
玛 1
娜 1
桓 1
兰 1
阿 1
薛 1
6.5 生日悖论分析
生日悖论指如果一个房间里有23人或以上,那么至少有两个人生日相同的概率大于50%。
编写程序中,输出在不同随机样本数量下,23个人中至少有两个人生日相同的概率。
import random
def duplicate(lst):
lst1=set(lst)
if len(lst)>len(lst1):
return True
else:
return False
def generate(numbers):
birthday=[]
for i in range(numbers):
birthday.append(random.randint(1,365))
return birthday
def match(students,samples):
count=0
birthday=[]
for i in range(samples):
birthday=generate(students)
if duplicate(birthday):
count+=1
return count
students=23
simulations=100000
count=match(students,simulations)
rate=(float(count)/simulations)*100
print("rate is %f%%"%rate)
rate is 50.736000%
6.6 《红楼梦》人物统计
编写程序统计红楼梦中前20位出场最多的人物。
第七章作业
7.1Python源文件改写
编写一个程序,读取一个Python源程序文件,将文件中所有除保留字外的小写字母换成大写字母,生成后的文件要能够被Python解释器正确执行。
7.2 图像文件压缩
使用PIL库对图片进行等比例压缩,无论压缩前文件大小如何,压缩后文件小于10KB.
7.3 中文字符画
参考实例12,编写程序合理选取中文字符构造字符表,生成中文字符画。
7.4 CSV解析
改编实例14,使得对CSV的转换能够识别并保留数据内部的逗号。
7.5 制作英文学习词典
7.6 多重释义
修改7.5,使其能够对单词添加多重释疑义,不同释义用逗号分开
类
from math import *
class Circle2D(object):
def __init__(self,x=0,y=0,radius=1):
self.radius=radius
self.x=x
self.y=y
def getArea(self): #返回圆面积
radius=self.radius
a=pi*radius*radius
print("面积是{}".format(a))
def getPerimeter(self):#返回周长
radius = self.radius
b=2*pi*radius
print("周长是{}".format(b))
def contains(self,a,b): #判断是否在圆内
radius = self.radius
x=self.x
y=self.y
m=((x-a)**2+(y-b)**2)*0.5
if m < radius:
return True
else:
return False
c=Circle2D(2,2,5.5)
print(c.getArea())
print(c.getPerimeter())
print(c.contains(3,3))
D:\coder\randomnumbers\venv\Scripts\python.exe D:/coder/randomnumbers/chengxusheji.py
面积是95.03317777109123
None
周长是34.55751918948772
None
True