Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python 阶段编程练习(二十三)

Python 阶段编程练习(二十三)

作者头像
Zkeq
发布于 2022-05-18 05:30:58
发布于 2022-05-18 05:30:58
33600
代码可运行
举报
文章被收录于专栏:ZkeqZkeq
运行总次数:0
代码可运行

作业案例1

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# coding:utf-8

import logging
import json
import os

'''
   学生信息库
   1: 将学生信息存入一个json文件中, 添加读与写json的函数
   2: 我们要将用户添加修改和删除的行为记录到日志中,添加与修改都用info代表
      而delete将要用warn警告来提示
'''

class NotArgError(Exception):
    def __init__(self, message):
        self.message = message

class MissPathError(Exception):
    def __init__(self, message):
        self.message = message

class FormatError(Exception):
    def __init__(self, message):
        self.message = message

class StudentInfo(object):
    def __init__(self, students_path, log_path):
        self.students_path = students_path
        self.log_path = log_path
        self.log = self.__log()

        self.__init_path()
        self.__read()

    def __log(self):
        if os.path.exists(self.log_path):
            mode = 'a'
        else:
            mode = 'w'
        logging.basicConfig(
            level=logging.DEBUG,
            format='%(asctime)s-%(filename)s-%(lineno)d-%(levelname)s-%(message)s',
            filename=self.log_path,
            filemode=mode
        )
        return logging

    def __init_path(self):
        if not os.path.exists(self.students_path):
            raise MissPathError('没有相关的地址文件 %s' % self.students_path)

        if not os.path.isfile(self.students_path):
            raise TypeError('当前的studentspath不是一个文件')

        if not self.students_path.endswith('.json'):
            raise FormatError('当前不是一个json文件')

    def __read(self):
        with open(self.students_path, 'r') as f:
            try:
                data = f.read()
            except Exception as e:
                raise e
        self.students = json.loads(data)

    def __save(self):
        with open(self.students_path, 'w') as f:
            json_data = json.dumps(self.students)
            f.write(json_data)


    def get_by_id(self, student_id):
        return self.students.get(student_id)

    def get_all_students(self):
        for id_, value in self.students.items():
            print('学号:{}, 姓名:{}, 年龄:{}, 性别:{}, 班级:{}'.format(
                id_, value['name'], value['age'], value['sex'], value['class_number']
            ))
        return self.students

    def add(self, **student):
        try:
            self.check_user_info(**student)
        except Exception as e:
            raise e
        self.__add(**student)
        self.__save()
        self.__read()

    def adds(self, new_students):
        for student in new_students:
            try:
                self.check_user_info(**student)
            except Exception as e:
                print(e, student.get('name'))
                continue
            self.__add(**student)
        self.__save()
        self.__read()

    def __add(self, **student):
        if len(self.students) == 0:
            new_id = 1
        else:
            keys = list(self.students.keys())
            _keys = []
            for item in keys:
                _keys.append(int(item))
            new_id = max(_keys) + 1
        self.students[new_id] = student
        self.log.info('学生%s被注册了' % student['name'])

    def delete(self, student_id):
        if student_id not in self.students:
            print('{} 并不存在'.format(student_id))
        else:
            user_info = self.students.pop(student_id)
            print('学号是{}, {}同学的信息已经被删除了'.format(student_id, user_info['name']))
            self.log.warning('学号是{}, {}同学的信息已经被删除了'.format(student_id, user_info['name']))
        self.__save()
        self.__read()
    def deletes(self, ids):
        for id_ in ids:
            if id_ not in self.students:
                print(f'{id_} 不存在学生库中')
                continue
            student_info = self.students.pop(id_)
            print(f'学号{id_} 学生{student_info["name"]} 已被移除')
            self.log.warning(f'学号{id_} 学生{student_info["name"]} 已被移除')
        self.__save()
        self.__read()

    def update(self, student_id, **kwargs):
        if student_id not in self.students:
            print('并不存在这个学号:{}'.format(student_id))
        try:
            self.check_user_info(**kwargs)
        except Exception as e:
            raise e

        self.students[student_id] = kwargs
        self.__save()
        self.__read()
        print('同学信息更新完毕')

    def updates(self, update_students):
        for student in update_students:
            try:
                id_ = list(student.keys())[0]
            except IndexError as e:
                print(e)
                continue
            if id_ not in self.students:
                print(f'学号{id_} 不存在')
                continue
            user_info = student[id_]
            try:
                self.check_user_info(**user_info)
            except Exception as e:
                print(e)
                continue
            self.students[id_] = user_info
        print('所有用户信息更新完成')
        self.__save()
        self.__read()

    def search_users(self, **kwargs):

        assert len(kwargs) == 1, '参数数量传递错误'

        values = list(self.students.values())
        key = None
        value = None
        result = []

        if 'name' in kwargs:
            key = 'name'
            value = kwargs[key]
        elif 'sex' in kwargs:
            key = 'sex'
            value = kwargs['sex']
        elif 'class_number' in kwargs:
            key = 'class_number'
            value = kwargs[key]
        elif 'age' in kwargs:
            key = 'age'
            value = kwargs[key]
        else:
            raise NotArgError('没有发现搜索的关键字')

        for user in values:  # [{name, sex, age, class_number}, {}]
            if value in user[key]:
                result.append(user)
        return result

    def check_user_info(self, **kwargs):
        assert len(kwargs) == 4, '参数必须是4个'

        if 'name' not in kwargs:
            raise NotArgError('没有发现学生姓名参数')
        if 'age' not in kwargs:
            raise NotArgError('缺少学生年龄参数')
        if 'sex' not in kwargs:
            raise NotArgError('缺少学生性别参数')
        if 'class_number' not in kwargs:
            raise NotArgError('缺少学生班级参数')

        name_value = kwargs['name']  # type(name_value)
        age_value = kwargs['age']
        sex_value = kwargs['sex']
        class_number_value = kwargs['class_number']
        # isinstace(对比的数据, 目标类型) isinstance(1, str)

        if not isinstance(name_value, str):
            raise TypeError('name应该是字符串类型')
        if not isinstance(age_value, int):
            raise TypeError('age 应该是整型')
        if not isinstance(sex_value, str):
            raise TypeError('sex应该是字符串类型')
        if not isinstance(class_number_value, str):
            raise TypeError('class_number应该是字符串类型')



students = {
    1: {
        'name': 'dewei',
        'age': 33,
        'class_number': 'A',
        'sex': 'boy'
    },
    2: {
        'name': '小慕',
        'age': 10,
        'class_number': 'B',
        'sex': 'boy'
    },
    3: {
        'name': '小曼',
        'age': 18,
        'class_number': 'A',
        'sex': 'girl'
    },
    4: {
        'name': '小高',
        'age': 18,
        'class_number': 'C',
        'sex': 'boy'
    },
    5: {
        'name': '小云',
        'age': 18,
        'class_number': 'B',
        'sex': 'girl'
    }
}


if __name__ == '__main__':
    student_info = StudentInfo('students.json')
    user = student_info.get_by_id(1)
    student_info.add(name='dewei', age=34, class_number='A', sex='boy')
    users = [
        {'name': 'xiaoming', 'age': 17, 'class_number': 'B', 'sex': 'boy'},
        {'name': 'xiaohong', 'age': 18, 'class_number': 'C', 'sex': 'girl'}
    ]
    student_info.adds(users)
    student_info.get_all_students()
    print('------')
    student_info.deletes([7, 8])
    student_info.get_all_students()
    print('-------')
    student_info.updates([
        {1: {'name': 'dewei.zhang', 'age': 18, 'class_number': 'A', 'sex': 'boy'}},
        {2: {'name': '小慕同学', 'age': 18, 'class_number': 'A', 'sex': 'boy'}}
    ])
    student_info.get_all_students()
    result = student_info.search_users(name='d')
    print(result)
    result = student_info.search_users(name='小')
    print(result)
    print('------')
    result = student_info.search_users(name='')
    print(result)
    result = student_info.search_users(name='小')
    print(result)
    print('-----')
    result = student_info.search_users (name='')
    print(result)

作业

亲爱的朋友们,经过这一阶段的学习,大家已经掌握了在Python中如何进行函数的定义与调用、文件基本操作、模块化思想······,也熟悉了Python中一些基本的内置函数和方法的运用,接下来让我们动手实践下——编写“数字猜猜猜”小游戏。

题目要求:

根据现实生活中的猜数字游戏的游戏规则,运用Python语言模拟实现猜数字游戏的的基本功能,请学员们参考真实的猜数字游戏规则和如下的程序运行效果图进行代码编写,以实现“数字猜猜猜”小游戏的基本功能。游戏规则介绍如下:

玩家根据提示进行数字区间起始位置和终止位置的输入

  1. 依据 1 中输入的数字区间,产生该区间内一个随机数,用于进行猜测比对的终值
  2. 提示用户输入所猜测的数字,与 2 中产生的随机数字进行比对,并将相应的信息写入指定的日志文件(日志文件名称:record.txt;日志文件路径:与.py文件处于同一级目录)
  3. 依据 3 中的比对结果。若两者不等,打印友好提示,重复 3、4 步骤;若两者相等,则退出该函数,执行下列语句
  4. 当猜测的值不在指定区间内时,不需要统计次数和记录
  5. 打印如效果图所示,用以提示游戏结束的信息
运行效果图:
  1. 成功运行效果图:
  1. 输入区间起始值和区间终止值相等效果图:

2. 输入区间起始值大于区间终止值效果图:

3. 输入区间起始值和终止值为非数字字符效果图:

代码(不想写了,包括上面那个..都不是我写的, 好累 好困 去睡了 回头再看)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time     : 2021/8/27 21:38
# @Author   : InsaneLoafer
# @File     : mooc_test.py

import logging
import os
import random


def init_log(path):
    if os.path.exists(path):
        mode = 'a'
    else:
        mode = 'w'
    logging.basicConfig(
        level=logging.INFO,
        format='%(asctime)s %(filename)s %(lineno)d %(message)s',
        filename=path,
        filemode=mode
    )
    return logging

def guess_number():
    print('********************欢迎进入数字踩踩踩游戏********************')
    start = input('数字区间起始值:')
    end = input('数字区间终止值:')
    if not start.isdigit() or not end.isdigit():
        print('您输入的区间数字为非数字字符!!请重新启动程序。')
        exit()
    else:
        start = int(start)
        end = int(end)
        count = 0
        if start == end:
            print('您输入的区间数字相同!!请重新启动程序。')
            exit()
        elif start > end:
            print('您输入的区间数字大小有误!!请重新启动程序。')
            exit()

        else:
            print('所产生的的随机数字区间为:[{}, {}]'.format(start, end))
            random_number = random.randint(start, end)

            while True:
                count += 1
                number = int(input('请继续输入您猜测的数字:'))
                if number not in range(start,end+1):
                    print('对不起您输入的数字未在指定区间内!!!')
                    continue
                elif number > random_number:
                    init_log('record.txt')
                    print('*********')
                    print('Higher than the anwser')
                    continue
                elif number < random_number:
                    init_log('record.txt')
                    print('*********')
                    print('Lower than the anwser')
                    continue
                elif number == random_number:
                    init_log('record.txt')
                    print('*********')
                    print('恭喜你!只用了{}次就赢得了游戏'.format(count))
                    break

if __name__ == '__main__':
    guess_number()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-11-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
编辑精选文章
换一批
Python 学生信息库的优化
学生信息库的优化 # coding:utf-8 """ 学生信息库 """ class StudentInfo(object): def __init__(self, students): self.students = students def get_by_id(self, student_id): return self.students.get(student_id) def get_all_students(self):
Zkeq
2022/05/18
2340
Python 学生信息库的优化
Python 断言
断言 断言的功能与用法 断言的功能–assert 用于判断一个表达式,在表达式条件为false的时候触发异常 用法 assert expression, message 参数 expression:表达式,一般是判断相等,或者判断是某种数据类型的bool判断的语句 message:具体的错误信息 返回值 无返回值 代码(学生信息库升级) # coding:utf-8 """ 学生信息库 """ class NotArgError(Exception): def __init__(self
Zkeq
2022/05/18
6740
Python [案例]实现学生信息库
[案例]实现学生信息库 # coding:utf-8 """ 学生信息库 """ students = { 1: { 'name': 'dewei', 'age': 33, 'class_number': 'A', 'sex': 'boy' }, 2: { 'name': '小慕', 'age': 10, 'class_number': 'B',
Zkeq
2022/05/18
3190
Python [案例]实现学生信息库
[Python零基础入门篇③⓪] - 函数的定义与使用
什么是函数? --- > 函数是具有某种特定功能的代码块,可以重复使用(在前面数据类型相关章节,其实已经出现了很多 Python 内置函数了)。它使得我们的程序更加模块化,不需要编写大量重复的代码。
哈哥撩编程
2024/07/10
2460
[Python零基础入门篇③⓪] - 函数的定义与使用
02.Python 数据类型详解
复数由实部和虚部组成,用 j 或 J 表示虚部。在科学计算、信号处理等领域有广泛应用。
全栈若城
2025/02/23
940
02.Python 数据类型详解
django-rest-framework框架学习
现在新一代web应用都开始采用前后端分离的方式来进行,淘汰了以前的服务器端渲染的方式。前后端分离方式有许多好处,比如 1、可以前后端并行开发,提高开发效率 2、页面都在客户端进行渲染,提高了渲染速度,减小了服务器的压力 3、一套api提供给多个客户端使用,而且不限制客户端的类型(web,app均可)
earthchen
2020/09/24
1.5K0
穿越技术迷雾:一键解锁智体开发 “财富密码”,开启技术跃迁的高能征途
在人工智能技术飞速发展的今天,智能体 (Agent) 作为能够感知环境并自主决策的程序实体,正逐渐成为解决复杂问题的核心工具。对于大学生而言,智能体开发不仅是锻炼编程能力的途径,更是探索 AI 应用边界的重要实践。然而,传统智能体开发面临模型训练资源不足、算法优化困难等挑战。蓝耘科技推出的 MaaS (Model as a Service) 平台,为大学生提供了低成本、高效率的智能体开发解决方案。
羑悻的小杀马特.
2025/05/30
980
穿越技术迷雾:一键解锁智体开发 “财富密码”,开启技术跃迁的高能征途
python_学生信息管理实例
---- """提示:代码中的内容均被注释,请参考,切勿照搬""" """注意:代码切勿照搬,错误请留言指出""" ---- 1 class Student: 2 def __init__(self,No,name,sex,age): 3 self.No = No 4 self.name = name 5 self.sex = sex 6 self.age = age 7 8 def show(
Mirror王宇阳
2020/11/10
4310
用Python写个学生宿舍管理系统(附源码)
学生宿舍管理系统可以包括学生信息管理、宿舍信息管理、评价管理等功能。以下是一个简单的Python实现:
Python小二
2023/11/22
7840
用Python写个学生宿舍管理系统(附源码)
Python面向对象编程实战:从类定义到高级特性的进阶之旅(2/10)
面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,它将数据和操作数据的方法封装在一起,以对象为核心来组织和设计程序。在 OOP 中,程序被看作是一系列相互交互的对象集合,每个对象都有自己的状态(属性)和行为(方法)。类(Class)是创建对象的模板,它定义了对象的属性和方法,而对象(Object)是类的具体实例,一个类可以创建多个对象。
正在走向自律
2025/05/04
1910
Python面向对象编程实战:从类定义到高级特性的进阶之旅(2/10)
python 面向对象之继承实例讲解
        --- info of Student:ChenRonghua ---
py3study
2018/08/02
6820
最新Python大数据之Python基础【十】学生管理系统面向对象版
文章目录 1、在子类中调用父类方法 2、多态 3、类属性 4、类方法 5、静态方法 6、面向对象案例 7、异常捕获 8、捕获指定类型的异常 9、else 和 finally 10、自定义异常抛出 11、模块的导入 12、自定义模块 13、模块查询顺序 14、`__all__`的使用方式 15、包的的导入 16、学生管理系统面向对象版 1、在子类中调用父类方法 super().方法名() 类名.方法名(self) spuer(要从哪一个类的上一级类开始查找, self).方法名() 子类调
Maynor
2023/01/14
1.1K0
Java课程设计【学生信息管理系统】[通俗易懂]
如何实现一个功能简单的学生信息管理系统,能够对学生信息(包括照片)进行添加、删除、修改和查询等操作。
全栈程序员站长
2022/11/03
5.9K0
Java课程设计【学生信息管理系统】[通俗易懂]
解锁函数的魔力:Python 中的多值传递、灵活参数与无名之美
在 Python 编程中,函数是构建模块化、简洁代码的核心工具。Python 的函数功能不仅强大,还非常灵活:从多值返回到多种参数传递,再到匿名函数 lambda,Python 允许我们用更少的代码实现丰富的功能。掌握这些函数进阶技巧,不仅能提升代码的可读性和复用性,还能让我们更优雅地解决复杂问题。在这篇文章中,我们将深入探索 Python 函数的高阶特性,一步步提升你的编程技巧。
suye
2024/11/19
2420
学生管理系统
python,以目前的能力编写一套实现学生信息增删改查的数据库系统。或许后续会不断提升不断完整的搞出这一套简单的系统(增删改查功能),还差得很多。加油……
cuijianzhe
2022/06/14
3K0
Deep Learning Chapter02:Python基础语法回顾
由于一年多没有接触python,现在恶补了下python基础语法,为以后的深度学习打下基础。现总结如下,希望对大家有所帮助。
北山啦
2022/10/31
1.1K0
Deep Learning Chapter02:Python基础语法回顾
python 从入门到实战(基础知识复习和回顾)
叫我詹躲躲 ​原创:叫我詹躲躲 来源:掘金 链接:https://juejin.im/post/5f05e168f265da22dd7dccf2 1编写第一个程序(python 3) print('hello world!') 2.查看python 版本号 python -v 3.使用变量 message = 'hello world!' print(message) 4.字符串 name = 'jetty' print(name.title()) #Jetty 首字母大写 print(
微芒不朽
2022/09/06
5030
python 从入门到实战(基础知识复习和回顾)
优雅的异常处理方式
1、在springboot项目里我们一般都希望调用接口时返回的数据包含至少以下三个属性:
周三不加班
2019/09/03
7870
优雅的异常处理方式
CodeBuddy:现代教育技术中的编程助手新革命
我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴
Lethehong
2025/05/19
1410
CodeBuddy:现代教育技术中的编程助手新革命
【重学 MySQL】六十三、唯一约束的使用
在 MySQL 中,唯一约束(UNIQUE Constraint)用于确保数据库表中的一列或多列的数据在整个表中是唯一的,即不允许有重复的值。唯一约束不仅可以在创建表时定义,也可以在表创建后通过修改表结构来添加。
用户11332765
2024/10/28
2670
【重学 MySQL】六十三、唯一约束的使用
推荐阅读
相关推荐
Python 学生信息库的优化
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验