需求:

写一个管理商品的程序,商品文件格式在a.json里面
提供商品的增删改查功能
choice = input('请输入你的选择:1、查看商品 2、新增商品 3、修改商品 4、删除商品')
#1、查看商品,输入商品名称,print单个商品的信息,价格、数量,输入all,查看所有商品
#2、新增商品,输入商品名称、数量、价格,数量是大于0的整数,价格必须是大于0的数值,
#如果商品存在,无法添加
#3、修改商品,输入商品名称、数量、价格,商品存在才可以修改 数量是大于0的整数,价格必须是大于0的数值,
#4、输入商品名称,如果存在,删除

import json
def read_file(file_name):
with open(file_name,encoding='utf-8') as fr:
return json.load(fr) #返回是字典
def write_file(file_name,content:dict):
with open(file_name,'w',encoding='utf-8') as fw:
json.dump(content,fw,ensure_ascii=False,indent=4) #入参是字典 写入文件是json串 def valid_int(count):
if str(count).isdigit():
if int(count) > 0:
return True
def valid_price(price):
try:
price = float(price) #确保是小数
if price and not str(price).startswith('-'): # 去掉0.0 和负小数 保留正小数
return True
except Exception as e:
print(f"{price}必须是大于0的数") def valid_name(name,product_info:dict):
return True if name in product_info else False def get_product_detail(file_name):
name = input("请输入产品名称:").strip()
if name:
product_info = read_file(file_name)
if name == 'all':
print(product_info)
elif valid_name(name,product_info):
print(product_info.get(name))
else:
print(f"{name}产品不存在!")
else:
print(f"{name}不能为空!")
def add_product(file_name):
name = input("请输入产品名称:").strip()
count = input("请输入产品数量:")
price = input("请输入产品价格:")
if name and count and price:
product_info = read_file(file_name) if not valid_name(name,product_info):
if not valid_int(count):
print(f"{name}产品的数量{count}必须为大于正整数!")
elif not valid_price(price):
print(f"{name}产品的价格{price}必须为大于0的数!")
else:
add_info={name:{'count':count,'price':price}}
product_info.update(add_info)
write_file(file_name,product_info)
print(f"添加产品信息:{add_info}成功!")
else:
print(f"{name}产品已经存在!")
else:
print(f"{name} 、{count}、{price}都不能为空!")
def modify_product(file_name):
name = input("请输入产品名称:").strip()
count = input("请输入产品数量:")
price = input("请输入产品价格:")
if name and count and price:
product_info = read_file(file_name)
if valid_name(name,product_info):
if not valid_int(count):
print(f"{name}产品的数量{count}必须为大于正整数!")
elif not valid_price(price):
print(f"{name}产品的价格{price}必须为大于0的数!")
else:
update_info={name:{'count':count,'price':price}}
product_info.update(update_info)
write_file(file_name,product_info)
print(f"更新产品信息:{product_info}成功!")
else:
print(f"{name}产品不存在!")
else:
print(f"{name} 、{count}、{price}都不能为空!")
def delete_product(file_name):
name = input("请输入产品名称:").strip()
if name:
product_info = read_file(file_name)
if valid_name(name,product_info):
product_info.pop(name)
write_file(file_name,product_info)
print(f"删除产品{name}成功!")
else:
print(f"{name}不存在!")
else:
print(f"{name}不能为空!")

file_name = r'a.json'
choice = input('1、查看商品 2、新增 3、修改 4、删除')
func_map = {'1':get_product_detail,'2':add_product,'3':modify_product,'4':delete_product}
if choice in func_map:
func_map[choice](file_name=file_name)
else:
print("请输入正确的选项!")

python基础篇 12-函数+文件读写+json练习作业的更多相关文章

  1. python 基础篇 11 函数进阶----装饰器

    11. 前⽅⾼能-装饰器初识本节主要内容:1. 函数名的运⽤, 第⼀类对象2. 闭包3. 装饰器初识 一:函数名的运用: 函数名是一个变量,但他是一个特殊变量,加上括号可以执行函数. ⼆. 闭包什么是 ...

  2. Python-Day3 Python基础进阶之集和/文件读写/函数

    一.集和 集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重,把一个列表变成集合,就自动去重了 关系测试,测试两组数据之前的交集.差集.并集等关系 1.创建集合 >>> s ...

  3. python 基础篇 自定义函数

    多态 我们可以看到,Python 不用考虑输入的数据类型,而是将其交给具体的代码去判断执行,同样的一个函数(比如这边的相加函数 my_sum()),可以同时应用在整型.列表.字符串等等的操作中. 在编 ...

  4. python基础篇_003_函数

    python中的函数 1.函数的目的 .避免代码冗余 .增强可读性 2.函数的定义与调用 # 定义函数 使用关键字def """ 1.定义函数: def 函数名(): 函 ...

  5. Python基础篇(初始函数)

    Python初始函数: 一.什么是函数 1.我们到目前为止, 已经可以完成一些软件的基础功能了. 那么我们来完成这样一个功 能: 约x: print("拿出手机") print(& ...

  6. python 基础篇 匿名函数

    匿名函数基础 首先,什么是匿名函数呢?以下是匿名函数的格式: lambda argument1, argument2,... argumentN : expression 我们可以看到,匿名函数的关键 ...

  7. python 基础篇 12 装饰器进阶

    本节主要内容:1. 通⽤装饰器回顾2. 函数的有⽤信息3. 带参数的装饰器4. 多个装饰器同时装饰⼀个函数 ⼀. 通⽤装饰器的回顾开闭原则: 对增加功能开放. 对修改代码封闭装饰器的作⽤: 在不改变原 ...

  8. python 基础篇 10 函数进阶

    本节主要内容:1. 函数参数--动态传参2. 名称空间, 局部名称空间, 全局名称空间, 作⽤域, 加载顺序.3. 函数的嵌套4. gloabal, nonlocal关键字 ⼀. 函数参数--动态传参 ...

  9. python 基础篇 09 函数初识

    <<<<<<<<<<<<<<<------------------------------函         ...

  10. Python基础:12函数细节

    一:返回值 当没有显式地返回元素时,Python 会返回一个None.如果函数返回多个对象,python 把他们聚集起来并以一个元组返回. 二:创建函数 1:强烈推荐,在函数体之前,编写函数的文档字符 ...

随机推荐

  1. beego入门

    beego的官方仓库地址是 https://github.com/beego/beego 为什么要特别说明这个事情呢?因为我们引入的包地址,有可能是从官方fork的,特别是beego,有的教程上通过g ...

  2. VC如何创建C编译器能使用的动态库

    方法 使用extern "C"修饰 设置统一的调用约定 举例 例1--使用__cdecl,一般C编译器使用此约定,如LabWidnows/CVI. cpp代码 extern &qu ...

  3. 关闭win10“快速启动”功能

    windows正常运行时间的统计问题 windows任务管理器中,在性能选项卡中可以查看系统的运行时间(开机时间) 正常情况下,如果电脑关机,那么再次开机后,该时间会被重置 但是,如果电脑处于上面所说 ...

  4. MyBatis(Plus) 打印SQL, 分析执行时间

    MyBatis/MyBatis Plus打印的SQL调试起来比较麻烦 当然IDEA/eclipse都有类似mybatis log plugin这种插件来解析, 但是安装插件有些许弊端, 就写了个工具类 ...

  5. TPS/QPS/RT的关系及计算

    1.定义 TPS:Transactions Per Second,意思是每秒事务数,具体事务的定义,都是人为的,可以一个接口.多个接口.一个业务流程等等.一个事务是指事务内第一个请求发送到接收到最后一 ...

  6. jmeter压测dubbo接口,参数为dto时如何写传参及有错误时的分析思路

    一.传参 1. 无论dubbo接口传参是否为dto,所有参数都是在args的tab传进去的. 2. 如果dto中有自定义对象,paramType为自定义dto名,paramValue为其他参数组成的j ...

  7. Fortran笔记 派生类型-整理版

    以下为整理后的笔记,英文原文 Introduction to Modern Fortran for the Earth System Sciences, 英文翻译 https://www.cnblog ...

  8. k8s_使用k8s部署博客系统deployment(四)

    mysql deployment 前面的nfs  pv pvc secret configmap service等k8s对象已经创建好了,准备工作已经完成:现在可以开始准备deployment配置文件 ...

  9. Ubuntu常用备查

    Ubuntu的目录结构 / 根目录 /home 用户操作目录 /etc 配置文件存放 /boot 系统启动文件 /usr 非系统自带的软件安装目录 /bin./usr/bin 存放可执行二进制文件 / ...

  10. TPM 2.0 - could not load "libtss2-tcti-tabrmd.so.0"

    报错: TPM 2.0 - could not load "libtss2-tcti-tabrmd.so.0" 解决:sudo apt install libtss2-tcti-t ...