Python Lab
Question 1
编写身份证脱敏程序。身份证脱敏是指将身份证中有关出生年月日的信息,用表示,并将脱敏后的数据保存在文件中。如:350101********1234
。
# -*- coding: utf-8 -*-
# @Time : 2023/5/25 17:15
# @Author : AI悦创
# @FileName: file.py
# @Software: PyCharm
# @Blog :https://bornforthis.cn/
def desensitize_id_no_re(filepath, new_filepath):
with open(filepath, 'r', encoding='utf-8') as f:
lines = f.readlines()
new_lines = []
for line in lines:
if "身份证号" in line:
id_pos = line.index(':')
id_number = line[id_pos + 1:].strip()
desensitized_id = id_number[:6] + '*' * 8 + id_number[-4:]
new_line = line[:id_pos + 1] + desensitized_id + '\n'
new_lines.append(new_line)
else:
new_lines.append(line)
with open(new_filepath, 'w', encoding='utf-8') as f:
for line in new_lines:
f.write(line)
# 调用函数进行脱敏处理
desensitize_id_no_re('sfz.txt', 'sfz_desensitized.txt')
Question 2
编写随机抽奖程序。随机抽取班上学生,其中:三等奖3名、二等奖2名、一等奖1名,将获奖的学生姓名显示出来,并保存在文件中。
import random
# 读取文件
with open('建筑学.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
# 提取学生名字
students = [line.split('\t')[1].strip() for line in lines]
# 打乱名字列表
random.shuffle(students)
# 抽取奖项
third_prize = students[:3]
second_prize = students[3:5]
first_prize = students[5:6]
# 打印并保存结果
with open('抽奖结果.txt', 'w', encoding='utf-8') as f:
print('一等奖:', ', '.join(first_prize))
f.write('一等奖:' + ', '.join(first_prize) + '\n')
print('二等奖:', ', '.join(second_prize))
f.write('二等奖:' + ', '.join(second_prize) + '\n')
print('三等奖:', ', '.join(third_prize))
f.write('三等奖:' + ', '.join(third_prize) + '\n')
Question 3
生日悖论分析。生日悖论指如果一个房间里有23人或以上,那么至少有两个人生日相同的概率大于50%。编写程序,输出在不同随机样本数量下,23个人中至少两个人生日相同的概率。
import random
def has_duplicate(lst):
# 这个函数检查一个列表是否有重复元素
return len(lst) != len(set(lst))
simulations = 10000 # 我们要进行的模拟次数
successes = 0 # 记录有至少一个重复生日的模拟次数
for _ in range(simulations):
birthdays = [random.randint(1, 365) for _ in range(23)]
if has_duplicate(birthdays):
successes += 1
probability = successes / simulations
print(f"Estimated probability: {probability:.2f}")
# 引入数学库,虽然在这个例子中,我们实际上并没有用到它
import math
# 定义一个函数来计算生日悖论的概率
def birthday_paradox(n):
# 初始概率为1
probability = 1.0
# 对每个人,我们计算他/她的生日不与之前的任何人生日相同的概率
for i in range(n):
# 每个人的生日都不同的概率为 (365-i)/365,我们把所有这些概率相乘
probability *= (365-i)/365
# 我们用1减去所有人生日都不同的概率,得到至少有两个人生日相同的概率
return 1 - probability
# 创建一个列表,包含1到100的所有数字,代表不同的人数
people = list(range(1, 101))
# 使用列表推导式,对每个人数,计算至少有两个人生日相同的概率
probabilities = [birthday_paradox(n) for n in people]
# 使用zip函数,将人数和对应的概率打包在一起,然后打印每个人数对应的概率
for p, prob in zip(people, probabilities):
# 概率乘以100,转换为百分比形式,保留两位小数
print(f"{p} people: {prob*100:.2f}% chance of shared birthday")
你的代码问题
你的代码有两个主要问题:
你假设每个月都有31天,这是不准确的。比如,2月通常只有28天(闰年有29天),而4月、6月、9月和11月都只有30天。这可能导致你的结果偏离实际值。
你在代码中生成了23个随机的生日,并试图检查是否有重复的生日。然后,你把重复的生日数量除以23,得到的值赋给
s
。但是这并不等于生日重复的概率。这只是在一次模拟中有多少重复的生日,而不是在大量模拟中的平均值。要得到准确的概率,你需要进行大量的模拟(比如10000次),然后计算其中有多少次模拟出现了至少一个重复的生日。
下面是一个修改过的代码,解决了上述问题:
import random
def has_duplicate(lst):
# 这个函数检查一个列表是否有重复元素
return len(lst) != len(set(lst))
simulations = 10000 # 我们要进行的模拟次数
successes = 0 # 记录有至少一个重复生日的模拟次数
for _ in range(simulations):
birthdays = [random.randint(1, 365) for _ in range(23)]
if has_duplicate(birthdays):
successes += 1
probability = successes / simulations
print(f"Estimated probability: {probability:.2f}")
这个代码首先定义了一个函数 has_duplicate
,用于检查一个列表是否有重复的元素。然后,它进行了 simulations
次模拟,每次模拟生成23个随机的生日(假设一年有365天),然后检查是否有重复的生日。最后,它计算了有至少一个重复生日的模拟次数占总模拟次数的比例,这就是至少有两个人生日相同的概率。
实数和虚部
在数学中,复数是一个可以写作 a + bi 的数,其中 a 和 b 是实数,i 是虚数单位,有性质 i² = -1。复数的实部是 a,虚部是 b。
让我们来看一些基本概念:
实数:我们平常用到的大部分数字,如整数、小数,以及无理数(比如根号2,π等),都属于实数。
虚数:i 是虚数单位,它的平方等于-1(即i² = -1)。因此,任何与虚数单位i的乘积(例如2i,-3.5i等)都是虚数。
复数:复数是由实部和虚部组成的,形式为a + bi,其中 a 是实部,b 是虚部。注意,实数和虚数都可以视为复数。比如,对于实数 5,我们可以认为它的虚部为0,所以它也是一个复数5 + 0i;对于虚数 2i,我们可以认为它的实部为0,所以它也是一个复数0 + 2i。
总的来说,实部和虚部是复数的两个组成部分。我们通过这两部分来完整地描述一个复数。
studs = [{'sid': '103', 'Chinese': 90, 'Math': 95, 'English': 92},
{'sid': '101', 'Chinese': 80, 'Math': 85, 'English': 83},
{'sid': '102', 'Chinese': 78, 'Math': 92, 'English': 97}]
scores = {}
for d in studs:
scores[d["sid"]] = [d["Chinese"], d["Math"], d["English"]]
# print(scores)
# print(scores.items())
d = sorted(scores.items(), key=lambda x: x[0])
print(dict(d))
公众号:AI悦创【二维码】
AI悦创·编程一对一
AI悦创·推出辅导班啦,包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」,全部都是一对一教学:一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然,还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线,随时响应!微信:Jiabcdefh
C++ 信息奥赛题解,长期更新!长期招收一对一中小学信息奥赛集训,莆田、厦门地区有机会线下上门,其他地区线上。微信:Jiabcdefh
方法一:QQ
方法二:微信:Jiabcdefh
- 0
- 0
- 0
- 0
- 0
- 0