02图书借还/笔记

张开发
2026/4/20 17:20:49 15 分钟阅读

分享文章

02图书借还/笔记
题目描述设计一个简单的图书借阅管理系统。系统初始包含若干本图书每本图书的信息包括书号字符串书名字符串作者字符串库存数量整数另外系统需记录借阅记录列表存储每笔借阅的字典。程序通过菜单实现以下功能查看所有图书以表格形式显示所有图书的书号、书名、作者、库存。借书输入书号和借阅数量如果库存足够则减少库存并添加一条借阅记录包含书号、书名、借阅数量、借阅日期可简化为当天日期字符串。如果库存不足提示失败。还书输入书号和归还数量增加对应图书的库存并从借阅记录中删除相应的借阅按先进先出原则或简单按书号匹配。若归还数量大于该书的借出总量则提示错误。查询某本书的借阅情况输入书号显示该书当前被借出的总数量和所有借阅记录的详情借阅数量、借阅日期。退出系统结束程序。要求数据初始化至少预置 3 本图书和若干条借阅记录可手动在代码中定义。菜单循环用户输入 1~5 选择功能。对用户输入做简单的有效性检查如书号不存在、数量非法等。参考代码python# 初始化图书库存books {B001: {name: Python编程, author: 张三, stock: 5},B002: {name: 数据结构, author: 李四, stock: 3},B003: {name: 算法导论, author: 王五, stock: 0}}# 初始化借阅记录borrow_records [{book_id: B001, book_name: Python编程, quantity: 1, date: 2026-03-25},{book_id: B002, book_name: 数据结构, quantity: 2, date: 2026-03-26}]代码books {B001: {name: Python编程, author: 张三, stock: 5},B002: {name: 数据结构, author: 李四, stock: 3},B003: {name: 算法导论, author: 王五, stock: 0}}borrow_records []str1 1、查看所有图书2、借阅图书3、归还图书4、查看图书借阅状态5、退出系统while True:print(str1)choose input(请选择你的操作:)if choose1:print(查看图书)for key,value in books.items():print(f书号是{key}\t书名是{value[name]}\t作者是:{value[author]}\t当前库存是:{value[stock]})elif choose 2:print(借书开始)book_id input(请输入书号: )if book_id in books:borrow_count int(input(请输入借阅数量: ))if borrow_count 0:if books[book_id][stock] borrow_count:books[book_id][stock] borrow_countborrow_records.append({book_id: book_id,book_name: books[book_id][name],quantity: borrow_count,date: input(请输入借阅日期(如2026-03-28): )})print(借书成功)else:print(库存不足借书失败)else:print(借阅数量必须大于0)else:print(书号不存在)elif choose3:print(归还图书)book_id input(请输入归还的书号:)i Nonefor index, value in enumerate(borrow_records):# print(fIndex: {index}, Value: {value})if value[book_id] book_id:i indexbreakif i0 :print(f书号存在并且第一个进入借阅的是索引下标为{i}的位置)count_huan int(input(请输入归还的图书的数量:))if count_huanborrow_records[i][quantity]:books[book_id][stock] count_huanborrow_records.pop(i)print(f当前的借阅记录是:{borrow_records})else:print(归还失败)else:print(f书号{book_id}不存在借阅记录elif choose4:print(查看图书借阅情况)。book_id input(请输入要查找的书号:)sum_count 0for i in borrow_records:if i[book_id]book_id:sum_count i[quantity]print(i)print(f图书{book_id}总计借阅{sum_count})elif choose 5:print(退出系统)break笔记一1. 注释符号核心作用给代码加说明不被程序执行提升代码可读性。单行注释# 注释内容多行注释三单引号 多行注释内容 三双引号 多行注释内容 2. 输出与输入输出print () 函数基础用法print(内容)可以输出变量、字符串、数字等print(Hello Python) # 输出字符串 print(123) # 输出数字 a 10 print(a) # 输出变量进阶用法print(内容1, 内容2, sep分隔符, end结束符)sep多个内容之间的分隔符默认是空格end输出结束后的符号默认是换行符\n输入input () 函数作用接收用户从键盘输入的内容返回值永远是字符串类型name input(请输入你的名字) print(f你好{name})注意如果需要数字必须用int()/float()做类型转换。3. 变量变量的定义与命名定义变量名 数据Python 是动态类型语言不需要提前声明类型age 18 name 张三命名规则必须遵守只能由字母、数字、下划线组成不能以数字开头不能是 Python 的关键字如if/for/while等区分大小写Name和name是两个变量命名规范建议遵守见名知意小驼峰 / 大驼峰 / 下划线命名法Python 推荐下划线user_name变量的类型基本数据类型见下一节变量的查看type(变量名)可以查看变量的数据类型4. 基本数据类型Python 的 6 大基础数据类型分为不可变类型和可变类型类型英文示例说明整数int10、-5、0正负整数Python3 不限制大小浮点数float3.14、-2.5小数注意浮点数精度问题如0.10.20.30000000000000004布尔值boolTrue、False只有两个值首字母大写True等价于 1False等价于 0字符串strhello、python用单 / 双 / 三引号包裹不可变序列列表list[1, 2, a]可变序列用中括号可存储不同类型数据元组tuple(1, 2, a)不可变序列用小括号单元素需加逗号(1,)字典dict{name:张三, age:18}可变映射用大括号键值对键不可变集合set{1, 2, 3}可变无序集合自动去重空集合用set()二1. 数据类型转换核心作用解决不同类型数据无法运算 / 拼接的问题常用转换函数函数作用示例int(x)转整数int(123)→123int(3.14)→3float(x)转浮点数float(3.14)→3.14float(10)→10.0str(x)转字符串str(123)→123bool(x)转布尔值空数据/0/[]/{}转False其余转Truelist(x)转列表list(abc)→[a,b,c]tuple(x)转元组tuple([1,2,3])→(1,2,3)3. 运算符大全1算数运算符运算符作用示例加 / 字符串拼接123abab-减5-23*乘 / 字符串重复2*36a*3aaa/除结果永远是浮点数4/22.0//整除取商的整数部分5//22%取余取模5%21**幂运算2**382比较运算符结果永远是布尔值True/False运算符作用等于!不等于/大于 / 小于/大于等于 / 小于等于3赋值运算符运算符示例等价于a 10直接赋值a 5a a 5-a - 5a a - 5*a * 5a a * 5/a / 5a a / 5///%/**同理对应算数运算的赋值4逻辑运算符用于连接多个条件结果为布尔值运算符作用示例and逻辑与一假则假全真才真True and True Trueor逻辑或一真则真全假才假True or False Truenot逻辑非取反not True False短路运算and遇到False直接返回Falseor遇到True直接返回True不再执行后续条件5成员运算符用于判断数据是否在序列 / 容器中运算符作用in存在返回Truenot in不存在返回Trueprint(a in abc) # True print(1 in [1,2,3]) # True print(name in {name:张三}) # True判断键是否存在6is 运算符用于判断两个变量的内存地址是否相同是否是同一个对象is内存地址相同 →Trueis not内存地址不同 →True与的区别判断值是否相等is判断身份内存地址是否相同a [1,2,3] b [1,2,3] print(a b) # True值相等 print(a is b) # False内存地址不同是两个对象7位运算符按二进制位进行运算运算符作用按位与对应位都为 1 才为 1按位或对应位有一个为 1 就为 1^按位异或对应位不同为 1相同为 0~按位取反0 变 11 变 0左移相当于乘以 2 的 n 次方右移相当于除以 2 的 n 次方三1. 分支结构条件判断1单分支if 条件: 条件成立执行的代码2双分支if 条件: 条件成立执行的代码 else: 条件不成立执行的代码3多分支if 条件1: 条件1成立执行 elif 条件2: 条件2成立执行 ... else: 所有条件都不成立执行4分支嵌套在if/elif/else内部再写分支结构用于复杂条件判断5三元运算符# 语法条件成立的结果 if 条件 else 条件不成立的结果 a 10 b 20 max_num a if a b else b print(max_num) # 202. 循环结构1for 循环遍历循环用于遍历序列字符串、列表、元组、字典等# 遍历列表 for i in [1,2,3]: print(i) # range() 生成数字序列常用range(起始, 结束, 步长)结束不包含 for i in range(1, 10): # 1-9 print(i)2while 循环条件循环当条件满足时一直循环i 1 while i 10: print(i) i 1 # 必须写否则死循环3循环控制语句break终止整个循环continue跳过本次循环进入下一次循环else循环正常结束没有被break打断时执行四1. 容器容器可以存储多个元素的对象分为序列型字符串、列表、元组有顺序可通过索引访问和映射型字典键值对无序通用操作len(容器)获取长度in/not in判断成员拼接*重复2. 字符串str1字符串的切片语法字符串[起始索引:结束索引:步长]左闭右开索引从 0 开始支持负索引-1 代表最后一个s abcdef print(s[1:4]) # bcd索引1-3 print(s[::-1]) # fedcba步长-1反转字符串2字符串常用方法调用方式字符串.方法()方法作用find()查找子串返回索引找不到返回 - 1index()查找子串返回索引找不到报错count()统计子串出现的次数replace()替换子串split()按指定字符分割字符串返回列表join()用指定字符拼接列表元素返回字符串upper()/lower()转大写 / 小写strip()去除字符串首尾的空白字符startswith()/endswith()判断是否以指定子串开头 / 结尾注意字符串是不可变类型所有方法都不会修改原字符串只会返回新字符串3. 列表list1列表的增删改查增append(元素)末尾追加、insert(索引, 元素)指定位置插入、extend(序列)合并列表删pop(索引)删除指定索引元素默认删最后一个、remove(元素)删除第一个匹配的元素、clear()清空列表改列表[索引] 新值查列表[索引]、index(元素)返回索引、count(元素)统计次数2列表的排序与翻转sort()原地排序默认升序reverseTrue降序sorted(列表)返回新的排序后的列表不修改原列表reverse()原地反转列表3深浅拷贝10 - 深浅拷贝.py浅拷贝只拷贝容器的引用嵌套容器共享内存copy.copy()/ 切片[:]深拷贝完全拷贝所有层级两个对象完全独立copy.deepcopy()4列表的遍历for i in 列表:直接遍历元素for i in range(len(列表)):遍历索引再通过索引取元素for index, value in enumerate(列表):同时遍历索引和元素推荐4. 元组tuple特点不可变序列定义后不能修改用小括号单元素必须加逗号(1,)常用操作索引、切片、len()、in没有增删改方法元组的解包把元组的元素一次性赋值给多个变量t (1, 2, 3) a, b, c t print(a, b, c) # 1 2 3 # 不定长解包*变量 接收剩余元素 a, *b, c (1,2,3,4,5) print(a, b, c) # 1 [2,3,4] 55. 字典dict特点可变映射键值对存储键必须是不可变类型字符串、数字、元组不能是列表 / 字典键唯一1字典的增删改查增 / 改字典[键] 值键不存在则新增存在则修改删pop(键)删除指定键值对、clear()清空字典、del 字典[键]查字典[键]键不存在报错、get(键, 默认值)键不存在返回默认值不报错

更多文章