跳至主要內容

Python Lab

AI悦创原创福州大学 Python福州大学福州大学 Python福州大学大约 6 分钟...约 1809 字

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个人中至少两个人生日相同的概率。

1
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}")

你的代码问题

你的代码有两个主要问题:

  1. 你假设每个月都有31天,这是不准确的。比如,2月通常只有28天(闰年有29天),而4月、6月、9月和11月都只有30天。这可能导致你的结果偏离实际值。

  2. 你在代码中生成了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

方法一:QQopen in new window

方法二:微信:Jiabcdefh

上次编辑于:
贡献者: AndersonHJB
你认为这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度