Python 05
原创2023年5月24日大约 7 分钟...约 2142 字
Question 1
##描述
##恺撒密码是古罗马凯撒大帝用来对军事情报进行加解密的算法,
#它采用了替换方法对信息中的每一个英文字符循环替换为字母表序列中该字符后面的
#第三个字符,即,字母表的对应关系如下:
##
##原文: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
##
##密文: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
##
##对于原文字符P,其密文字符C满足如下条件:C = (P+3) mod 26
##
##上述是凯撒密码的加密方法,解密方法反之,即:P = (C-3) mod 26
##
##假设用户可能使用的输入仅包含西文字母,即英文大小写字母a~zA~Z和特殊字符,
#请编写一个程序,对输入字符串进行凯撒密码加密,直接输出结果,其中特殊字符
#不进行加密处理。
##
##
plaintext = input("请输入明文文本: ")
for p in plaintext:
# 判断小写字母a到z
if "a" <= p <= "z":
print(chr(ord("a")+(ord(p)-ord("a")+3)%26), end='')
# 判断大写字母A到Z
elif "A" <= p <= "Z":
print(chr(ord("A")+(ord(p)-ord("A")+3)%26), end='')
# 其它字符直接进行输出
else:
print(p, end='')
Question 2
##4.2
##描述
##有3扇关闭的门,一扇门后面停着汽车,其余门后是山羊,只有主持人知道每扇门后面是什么。
##参赛者可以选择一扇门,在开启它之前,主持人会开启另外一扇门,露出门后的山羊,
##然后允许参赛者更换自己的选择。
##输入格式
##输入一个大于3000的正整数。
##输出格式
##输出不换和换情况下得到汽车的概率,保留一位小数
from random import*
TIMES = eval(input())
my_first_choice_n=0#初始化不改选择的次数
my_change_choice_n=0#初始化更改选择的次数
for i in range(TIMES):
a="羊1","羊2","车"
car_inDoor=choice(a)
my_guess=choice(a)
if car_inDoor==my_guess:
my_first_choice_n+=1
else:
my_change_choice_n+=1
print("不换选择得到汽车的机会:{:.1f}".format(my_first_choice_n/TIMES))
print("换选择得到汽车的机会:{:.1f}".format(my_change_choice_n/TIMES))
Question 3
# getnumber()函数负责获取用户输入的数字,并将它们存储在一个列表中。如果用户没有输入任何内容(即输入为空字符串),则停止获取输入。
def getnumber():
a = [] # 创建一个空列表来保存用户输入的数字
while True: # 创建一个无限循环,直到用户不再输入数字为止
s = input("请输入一个数字(留空结束):") # 请求用户输入
if s == "": # 如果用户没有输入任何内容(输入为空字符串),则退出循环
break
try: # 尝试将用户输入的字符串转换为浮点数
a.append(float(s)) # 如果成功,则将此数字添加到列表中
except ValueError: # 如果转换失败(即用户输入的不是数字),则打印一条错误消息并请求新的输入
print("输入的不是一个有效的数字,请重新输入.")
return a # 返回包含所有用户输入数字的列表
# lengthnumber()函数返回给定列表中的数字数量,即列表的长度。
def lengthnumber(numbers):
return len(numbers)
# total()函数返回给定列表中所有数字的总和。
def total(numbers):
return sum(numbers)
# mean()函数返回给定列表中所有数字的平均值,即数字总和除以数字数量。
def mean(numbers):
return sum(numbers)/len(numbers)
# dev()函数返回给定列表中所有数字的样本标准差,即每个数字与平均值的差的平方的平均值的平方根。
def dev(numbers, mean):
sdev = sum((x-mean)**2 for x in numbers) # 计算每个数字与平均值的差的平方的总和
return pow(sdev/(len(numbers)-1), 0.5) # 计算平方和的平均值的平方根
# median()函数返回给定列表中所有数字的中位数,即数字排序后位于中间位置的数字。如果数字数量为偶数,则中位数为中间两个数字的平均值。
def median(numbers):
numbers.sort() # 将数字排序
n = len(numbers) # 获取数字数量
m = n - 1 # 计算索引的最大值
return (numbers[m//2] + numbers[(m+1)//2]) / 2 # 计算中位数
# 获取用户输入的数字
n = getnumber()
# 计算数字的平均值
m = mean(n)
# 打印数字的数量、总和、平均值、标准差和中位数
print("数量:{}, 总和:{}, 平均值:{}, 方差:{}, 中位数:{}".format(lengthnumber(n), total(n), mean(n), dev(n, m), median(n)))
Question 4
# 定义一个递归函数来计算斐波那契数列
def fibonacci(n):
# 基础情况
if n <= 0:
return 0
elif n == 1:
return 1
# 递归情况
else:
return fibonacci(n-1) + fibonacci(n-2)
# 获取用户输入的n值
n = int(input("请输入一个整数:"))
# 初始化一个空列表来存储所有不超过n的斐波那契数
fib_numbers = []
i = 0
while True:
fib_number = fibonacci(i)
if fib_number <= n:
fib_numbers.append(fib_number)
i += 1
else:
break
# 计算斐波那契数的总和
total = sum(fib_numbers)
# 计算平均值
average = total / len(fib_numbers)
# 打印所有不超过n的斐波那契数、总和和平均值
print(', '.join(map(str, fib_numbers)), total, average)
Question 5
# 导入jieba模块,用于中文文本的分词处理。
import jieba
# 打开"AllManAreBrothers.txt"文件,以UTF-8的编码方式读取文件内容并将其存储在变量txt中。
txt=open("AllManAreBrothers.txt","r",encoding="utf-8").read()
# 设置一个变量n,定义要打印出的最常见单词的数量。
n=10
# 设置一个集合excludes,其中包含要从分析中排除的单词。这些单词主要是停用词,也就是那些在文本中经常出现但并不具有很大意义的单词。
excludes = {"两个", "一个", "只见", "如何", "那里", "哥哥","说道","军马","头领","众人","这里","兄弟","出来","小人","梁山泊","这个","今日","妇人","先锋","好汉","便是","问道","人马","起来","甚么","却是","我们","因此","正是","三个","如此","且说","不知","不是","只是","次日","不曾","不得","一面","看时","不敢","如今","来到","当下","原来","将军","山寨"}
# 使用jieba的lcut()函数将文本txt进行分词,并将得到的单词列表存储在变量words中。
words = jieba.lcut(txt)
# 初始化一个空字典counts,用于存储每个单词的出现次数。
counts = {}
# 遍历单词列表words,对每个单词进行处理并记录其出现次数。
for word in words:
# 如果单词的长度为1,则忽略它并继续下一个单词的处理。
if len(word)==1:
continue
# 如果单词是"宋江道"或"呼延",则将其替换为"宋江"或"呼延灼",因为这是同一人的不同称呼。
elif word == "宋江道":
rword = "宋江"
elif word == "呼延":
rword = "呼延灼"
else:
rword = word
# 更新字典counts,将单词rword的出现次数增加1。如果单词rword在字典中不存在,则首先将其添加到字典中并设置其出现次数为0。
counts[rword] = counts.get(rword, 0) + 1
# 如果单词rword在集合excludes中,即它是一个要排除的单词,则从字典counts中删除它。
if rword in excludes:
del counts[rword]
# 将字典counts的项(键-值对)转换为列表,并按照单词的出现次数从高到低进行排序。
items=list(counts.items())
items.sort(key=lambda x:x[1],reverse=True)
# 打印出现次数最多的n个单词及其出现次数。
for i in range(n):
word,count=items[i]
print("{0:<10}{1:>5}".format(word,count))
公众号:AI悦创【二维码】

AI悦创·编程一对一
AI悦创·推出辅导班啦,包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」,全部都是一对一教学:一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然,还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线,随时响应!微信:Jiabcdefh
C++ 信息奥赛题解,长期更新!长期招收一对一中小学信息奥赛集训,莆田、厦门地区有机会线下上门,其他地区线上。微信:Jiabcdefh
方法一:QQ
方法二:微信:Jiabcdefh
