Python课程设计 第 19 / 52 篇

模块对象-参考答案

作业1

  1. 文件内容如下,标题为:姓名,性别,年纪,薪资
    albert male 18 3000
    james male 38 30000
    林志玲 female 28 20000
    新垣结衣 female 28 10000
    要求从文件中取出每一条记录放入列表中,列表的每个元素都是如下格式:

{‘name’:‘albert’,‘sex’:‘male’,‘age’:18,‘salary’:3000}

f = open('info.txt', 'r')
list_info = []
for line in f:
    data_info = line.split(' ')
    name = data_info[0]
    sex = data_info[1]
    age = data_info[2]
    salary = data_info[3]
    people = {'name': name, 'sex': sex, 'age': int(age), 'salary': int(salary)}
    list_info.append(people)
f.close()

print(list_info)

作业2

根据题目1得到的列表,取出薪资最高的人的信息

# 方式一 :手写算法
def get_the_richest(list1):
    richest = list1[0]
    for i in range(len(list1)):
        if list1[i]['salary'] > richest['salary']:
            richest = list1[i]
    return richest

# 方式二:使用内置函数max与lambda组合
print('内置函数', max(list_info, key=lambda x: x['salary']))

作业3

根据题目1得到的列表,取出最年轻的人的信息

def get_the_youngest(list1):
    youngest = list1[0]
    for i in range(len(list1)):
        if list1[i]['age'] < youngest['age']:
            youngest = list1[i]
    return youngest

print(min(list_info, key=lambda x: x['age']))

作业4

根据题目1得到的列表,将每个人的信息中的名字映射成首字母大写的形式

def change_capitalize(list1):
    for i in range(len(list1)):
        if 'a' <= list1[i]['name'][0] <= 'z':
            list1[i]['name'] = list1[i]['name'].capitalize()
    return list1

res1 = change_capitalize(list_info)
print(res1)

# need to create redundant joint
res2 = map(lambda x: x['name'].capitalize(), list_info)
print(list(res2))

作业5

根据题目1得到的列表,过滤掉名字以a开头的人的信息

def filter_a(list1):
    list2 = []
    for i in range(len(list1)):
        if list1[i]['name'][0] != 'a':
            list2.append(list1[i])
    return list2

print(list(filter(lambda x: not x['name'].startswith('a'), list_info)))

作业6

使用递归打印斐波那契数列(前两个数的和得到第三个数,如:0、 1、1、2、3、5、8、13、21…)

def Fibonacci(n):
    if n < 1:
        return
    elif n == 1:
        return 1
    elif n == 2:
        return 1
    else:
        return Fibonacci(n - 1) + Fibonacci(n - 2)

for i in range(1, 20):
    print(Fibonacci(i))

作业7

使用random模块写一个随机生成8位验证码的程序,验证码中有随机大小写字母和数字

def get_verification():
    verification_code = ''
    for i in range(8):
        alpha1 = chr(random.randint(65, 90))
        alpha2 = chr(random.randint(97, 122))
        number = random.randint(0, 9)
        verification_code += random.choice([alpha1, alpha2, str(number)])
    return verification_code

print((get_verification()))

作业8

写一个模拟撞库的程序,假如密码都是用md5加密的,没有加盐,撞库就是用多个猜测的密码是尝试比对正确的密码,比对过程一定是用md5来进行。

import random
import hashlib

def get_password_violently():
    while True:
        
        password = ''

        # imagine password is formed by 4 numbers or alphas
        for i in range(4):
            random_alpha = chr(random.randint(65, 90))
            random_number = random.randint(0, 9)
            password += random.choice([random_alpha, str(random_number)])

        # md5 processing...
        m = hashlib.md5()
        m.update(password.encode('utf-8'))
        md5_password = m.hexdigest()

        all_alpha_number = list(map(lambda x: chr(x), range(48, 122)))

        # simulate user input password
        for a in all_alpha_number:
            for b in all_alpha_number:
                for c in all_alpha_number:
                    for d in all_alpha_number:
                        input_password = a + b + c + d

                        m = hashlib.md5()
                        m.update(input_password.encode('utf-8'))
                        input_md5_password = m.hexdigest()

                        if input_md5_password == md5_password:
                            return password

res = get_password_violently()
print("user's password", res)

作业9

使用re模块写一个验证手机号码是否有效的程序

首先准备了一个通讯录文件,嫩模联系方式.txt,以下是文件内容:

姓名        地区    身高    体重    电话

况咏蜜     北京    171    48    11151054608

王心颜     上海    169    46    13813234424

马纤羽     深圳    173    50    137234523

乔亦菲     广州    172    52    15823423525

罗梦竹     北京    175    49    38623423421

刘诺涵     北京    170    48    22623423765

岳妮妮     深圳    177    54    18835324553

贺婉萱     深圳    174    52    10933434452

叶梓萱    上海    171    49    16742432324

杜姗姗    北京    167    49       13324523342

我们按照中国大陆的手机号标准来比对验证,输出有效的号码,你有兴趣也可以打过去了解一下。

import re

def get_model_phone(file):
    invalid_data = {}
    with open(file, 'r', encoding='utf-8') as f:
        for line in f:
            model_data_list = line.split()
            name = model_data_list[0]
            phone = model_data_list[-1]
            valid_phone = re.findall('13\d\d\d\d\d\d\d\d\d', phone)
            if valid_phone:
                invalid_data[name] = valid_phone[0]
        return invalid_data

res = get_model_phone('info2.txt')
print(res)