【python基础知识】20.“午饭吃什么”的python实现(产品思维-实操篇)

2023-11-12

前言

首先,我们回顾以下运用学到的编程知识去做一个产品的大致步骤:
在这里插入图片描述
同时,也学了一种配合“产品思维”的思维工具:流程图。
在这里插入图片描述
在这里插入图片描述
例如:摩拜APP的流程图:
在这里插入图片描述
而且,还简单地过了一个职场中的例子:
在这里插入图片描述
根据以上表格,有需求: 制作一个自动统计考勤表数据并输出结果的程序
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
明确了需求后,通过拆解思维和解题步骤来完成技术方案和最终代码。

愿你培养这三种能力,让编程真正可以为自己的生活和工作服务。
在这里插入图片描述

练习介绍

练习目标

我们会通过今天的作业,用代码解决生活中实际的一种需求:选择困难,需要帮忙。

练习要求

现今社会,每个人每天的生活都充满了各种各样的选择,导致许多人在选择面前纠结万分。

甚至,有不少人将“早饭吃什么?午饭吃什么?晚饭吃什么?”戏称为人生中的三大难题。

所以,我们今天的练习就会以“不知道吃什么”为例,让电脑来帮我们选,而我们只要做决策就好。

电脑推荐我们吃某种菜,我们拒绝后,它就继续推荐,直到我们满意为止。

项目实操

明确目标

根据生活经验,明确产品需求。

为了让产品更好用,我们可以先分析一下问题,将产品需求(即功能)明确一下。

由于选择困难症具体的症状不同,所以,我们需要同时针对不同的情况去一一分析需求,好保证产品的有效性。

假设“不知道吃什么”的主要原因有两种:

  • 一是完全不知道要吃什么
  • 二是在几家店之间犹豫。

根据这个假设,明确产品需求:

  1. 刚进入产品时要做一个选择,在两个主要原因中选一个。
  2. 当完全不知道要吃什么时,需要产品在一些菜品当众随机推荐一个,让我们选要或不要。
  3. 当在几家店之间犹豫时,需要告诉电脑是哪几家,然后让电脑推荐一家,我们来做决策。

注:假设你有想到不同的原因,可以自己想一想:要怎么用代码解决。

最终得出产品的三个功能:判断,随机推荐,特定选项中的随机推荐。

形成技术方案

明确了需求之后,我们就可以运用学过的知识来定技术方案,可得:

  • 判断: 判断语句(二选一)+input(下面两个功能也会用到,不重复写了)
  • 随机推荐:random模块(前提:一个提前设好的菜品列表)+循环(不满意再选)+判断
  • 特定选项的随机选项:列表添加(让我们将自己的选择添加进一个空列表)+random模块+循环+判断

编写程序代码

数据准备

首先先定义一下,目前可以去吃的饭店以及菜品都有哪些:

halls={'重庆鸡公煲':['鸡公煲','鸡块面条','鸡块土豆片'],'山西刀削面':['砂锅刀削面','土豆粉','蛋炒刀削面'],'沙县小吃':['排骨汤','飘香拌面']}

然后定义存放店名的变量和存放菜品的变量:

names=[]
dishes=[]

然后根据halls中的内容,将店名和菜品分别处理到定义好的变量中:

for i in halls:
    names.append(i)
    for j in halls[i]:
        dishes.append(j)

主流程逻辑搭建

然后咱们开始写主逻辑的代码:

  1. 首先,说明需要根据用户选择的模式进行不同的操作。可以使用一个if-else语句判断用户选择了哪种模式。
userchoice = input('请选择模式:1.随机推荐 2.看列表指定饭店随机\n')
if userchoice == '1':
    # 随机推荐模式下的代码
else:
    # 看列表指定饭店随机模式下的代码
  1. 在随机推荐模式下,可以使用dish_radm()函数来随机推荐一个菜品,然后使用find_name()函数找到该菜品所属的饭店。
while key:
    a = dish_radm()
    again()
print('选好了!吃' + str(a))
find_name(a)
  1. 在看列表指定饭店随机模式下,可以使用show_names()函数显示所有饭店的列表,然后使用ipt_rdm()函数获取用户选择的饭店,最后根据用户选择的饭店随机推荐一个菜品,并使用find_name()函数找到该菜品所属的饭店。
dic_name = show_names()
usr_choice_names = ipt_rdm()
while key:
    s = find_dishes(usr_choice_names)
    m = random.choice(s)
    print('吃{}这个菜怎么样?输入n退出,其他任意键继续推荐'.format(m))
    again()
print('选好了!吃{}'.format(m))
find_name(m)
  1. 最后,为了让代码更加模块化和可复用,可以将上述的代码封装到一个名为recommend_food()的函数中,并在main()函数中调用该函数。
def recommend_food():
    userchoice = input('请选择模式:1.随机推荐 2.看列表指定饭店随机\n')
    if userchoice == '1':
        # 随机推荐模式下的代码
    else:
        # 看列表指定饭店随机模式下的代码

def main():
    print('欢迎使用 【今天吃什么】 小程序')
    recommend_food()
    print('感谢使用,欢迎下次再用!')

main()

完善补充确实的功能

通过以上整理,整个程序的框架已经搭建好了,接下来我们将需要调用的几个函数,分别进行实现。

  1. dish_radm() 函数的作用是从菜品列表中随机选择一个菜品,并返回该菜品名称。该函数的实现如下:
def dish_radm():
    dish_choice = random.choices(dishes)
    print('去吃{}菜可好?'.format(dish_choice))
    return dish_choice[0]

这个函数首先使用 random.choices() 方法从菜品列表 dishes 中随机选择一个菜品,并赋值给 dish_choice。然后,根据选择的菜品,在控制台上打印出推荐的菜品。最后,通过返回 dish_choice[0] 将菜品名称返回。

  1. find_name() 函数的作用是根据菜品名称找到对应的饭店,并将信息打印出来。该函数的实现如下:
def find_name(dish):
    for i in halls:
        if dish in halls[i]:
            print('决定去{}饭店吃{}菜'.format(i, dish))

这个函数会遍历 halls 字典中的每个饭店,如果输入的菜品名称 dish 在饭店的菜品列表中出现,则打印出该菜品所属的饭店名称。

  1. show_names() 函数的作用是显示所有饭店的列表,并返回一个字典,其中键为数字序号,值为饭店名称。这个函数的实现如下:
def show_names():
    print('去下面哪家吃比较好呢?请输入你的选择,可多选')
    dic_name = {}
    for i in range(len(names)):
        dic_name[i + 1] = names[i]
        print(str(i + 1) + '.' + names[i])
    return dic_name

这个函数首先在控制台上打印出提示信息。然后,使用一个循环遍历 names 列表,将每个饭店的序号与名称对应起来,并分别打印出来。最后,通过返回 dic_name 字典来提供用户选择时的映射关系。

  1. ipt_rdm() 函数的作用是获取用户通过输入数字序号选择的饭店列表,并将所选饭店的名称以列表形式返回。这个函数的实现如下:
def ipt_rdm():
    dic_name={}
    for i in range(len(names)):
        dic_name[i+1]=names[i]
    chars=input('输入序号即可')
    inputnames=[]
    usr_choice_names=[]
    for i in chars:
        inputnames.append(int(i))
    for j in dic_name:
        if j in inputnames:
            usr_choice_names.append(dic_name[j])
    return usr_choice_names

这个函数首先创建一个空字典 dic_name,并通过循环将饭店的序号和名称对应起来。然后,等待用户输入数字序号,保存在字符串变量 chars 中。接下来,将数字序号转换为整数,并保存到列表 inputnames 中。最后,通过循环遍历 dic_name 字典,将用户选择的饭店名称添加到 usr_choice_names 列表中,并返回该列表。

最终代码整合:

# 请独立完成这个产品吧,我相信你可以的!
import random

halls={'重庆鸡公煲':['鸡公煲','鸡块面条','鸡块土豆片'],'山西刀削面':['砂锅刀削面','土豆粉','蛋炒刀削面'],'沙县小吃':['排骨汤','飘香拌面']}
names=[]
dishes=[]
key=1
for i in halls:
    names.append(i)
    for j in halls[i]:
        dishes.append(j)

def find_name(dish):
    for i in halls:
        if dish in halls[i]:
            print('决定去{}饭店吃{}菜'.format(i,dish))

def find_dishes(n_names):
    n_dishes=[]
    for i in halls:
        if i in n_names:
            for j in halls[i]:
                n_dishes.append(j)
    return n_dishes

def show_names():
    print('去下面哪家吃比较好呢?请输入你的选择,可多选')
    dic_name={}
    for i in range(len(names)):
        dic_name[i+1]=names[i]
        print(str(i+1)+'.'+names[i])
    return dic_name

def name_radm():
    name_choice=random.choices(names)
    print('去{}吃饭可好?'.format(name_choice))
    return name_choice[0]

def dish_radm():
    dish_choice=random.choices(dishes)
    print('去吃{}菜可好?'.format(dish_choice))
    return dish_choice[0]

def again():
        global key
        answer=input('是否继续推荐,n退出,任意键继续')
        if answer=='n':
            key=0
        else:
            key=1

def ipt_rdm():
    dic_name={}
    for i in range(len(names)):
        dic_name[i+1]=names[i]
    chars=input('输入序号即可')
    inputnames=[]
    usr_choice_names=[]
    for i in chars:
        inputnames.append(int(i))
    for j in dic_name:
        if j in inputnames:
            usr_choice_names.append(dic_name[j])
    return usr_choice_names

def main():
    print('欢迎使用 【今天吃什么】 小程序')
    userchoice=input('请选择模式:1.随机推荐 2.看列表指定饭店随机\n')
    if userchoice=='1':
        while key:
            a=dish_radm()
            again()
        print('选好了!吃'+str(a))
        find_name(a)
    else:
        dic_name=show_names()
        usr_choice_names=ipt_rdm()
        while key:
            s=find_dishes(usr_choice_names)
            m=random.choice(s)
            print('吃{}这个菜怎么样?输入n退出,其他任意键继续推荐'.format(m))
            again()
        print('选好了!吃{}'.format(m))
        find_name(m)
    print('感谢使用,欢迎下次再用!')

main()

总结

通过这个项目,你可以学习如何使用随机函数做出随机选择、处理用户的输入,以及使用循环、条件语句等控制流程。你还会学到如何使用字符串的格式化方法将变量的值插入到字符串中,并理解函数的定义和调用以及返回值的使用。

这些知识在编程中非常常见且实用,能够帮助你有效地处理数据和控制程序流程。

接下来将知识点罗列如下:

知识 实现方法
使用随机函数 random.choices() 方法可以从列表中随机选择元素
字符串格式化 使用字符串的 format() 方法可以将变量的值插入到字符串中
循环和条件语句 使用循环和条件语句可以根据条件执行特定的代码块
列表和字典的使用 可以使用列表和字典存储和处理数据
用户输入处理 使用 input() 函数获取用户的输入,并进行相应的处理
函数的定义和调用 使用 def 关键字定义函数,使用函数名加括号调用函数
返回值的使用 函数可以通过返回值将计算结果或数据传递给调用者

本节完美结束,撒花~希望大家多多练习,早日成为大神!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【python基础知识】20.“午饭吃什么”的python实现(产品思维-实操篇) 的相关文章

  • 使用 pip 或 conda 来管理包? [复制]

    这个问题在这里已经有答案了 我已经使用 matlab 进行机器学习很长一段时间了 最 近切换到 python 并使用其包管理器 pip 安装某些包并成功安装了许多包 几天前 我开始使用 conda 我以前安装的所有软件包都被覆盖 我真的很想
  • 用户警告:MovieWriter ffmpeg 不可用

    尝试在 google colab 上制作动画 收到此警告 用户警告 MovieWriter ffmpeg 不可用 warnings warn MovieWriter s 不可用 writer did pip 安装 ffmpeg 标准化但没有
  • 使用 pycharm 进行交互式 shell 调试

    我是 PyCharm 新手 我已经使用 IDLE 很长时间了 在IDLE中执行脚本后使用Python对象非常方便 有没有办法在使用 PyCharm 与交互式 python shell 执行后使用脚本对象 例如 我们有一个 测试 项目 其中包
  • 查找具有不同强度/亮度的相似图像

    假设我有如下图像 我可以选择什么来比较两个图像之间的相似度 显然它们是相同的图像 只是亮度不同 我找不到任何可行的方法 目前我最好的选择是训练 cnn 或自动编码器并比较输出的特征向量 但这似乎有点矫枉过正 任何提示将不胜感激 相当强大的工
  • 如何在基于其他数据帧的数据帧中创建联接?

    我有 2 个数据框 一份包含学生批次详细信息 另一份包含分数 我想加入 2 个数据框 数据框1包含 s1 s2 s3 Stud1 Stud2 Stud3 Stud2 Stud4 Stud1 Stud1 Stud3 Stud4 数据框2包含
  • Python 中的密码子生成

    我有这段代码 用于将 DNA 字符串转换为密码子列表 然后将此列表转换为具有各自氨基酸的字符串 然而 当我运行代码并且 DNA 字符串以一对核苷酸 例如 CT 而不是三联体结尾时 代码不会生成氨基酸序列 正如您在输出中看到的 from co
  • 使用 python 将 bibtex 文件转换为 html (也许是 pybtex?)

    您好 我想解析 bibtex 出版物文件并对特定字段 例如年份 进行排序并过滤某些内容 然后将其放在网站上 我遇到了 pybtex 它可以读取和解析 bibtex 文件 但它基本上没有记录 我不知道如何对条目进行排序 pybtex 是可行的
  • 回归模型 statsmodel python

    这更多是一个统计问题 因为代码运行良好 但我正在学习 python 中的回归建模 我在下面使用 statsmodel 编写了一些代码来创建一个简单的线性回归模型 import statsmodels api as sm import num
  • Flask-admin 内联建模传递表单参数会抛出 AttributeError

    Flask 开发者们大家好 在 Flask admin 中 我目前尝试在模型视图中实现内联模型编辑 在模型方面 我有一个简单的树结构 表示一组内容页面 每个节点都有多个子节点以及与其关联的多个内容数据模型 模型被命名为ContentNode
  • lxml/python 使用 CDATA 部分读取 xml

    在我的 xml 中我有一个CDATA部分 我想保留 CDATA 部分 然后剥离它 有人可以帮忙解决以下问题吗 默认不起作用 from io import StringIO from lxml import etree xml
  • 创建 Pyomo 约束的性能

    我正在用 pyomo 设置一个更大的能量优化问题 正如其他中提到的 设置花费了不合理的时间问题 https stackoverflow com questions 43413067 performance of pyomo to gener
  • pyqt4窗口调整大小事件

    我正在使用 python3 和 pyqt4 我希望每次运行时都会运行一些代码QMainWindow已调整大小 我想要这样的东西 self window resized connect self resize but resized不是内置函
  • 使用 python 更改目录

    我碰巧发现我无法从 python 代码中更改实际目录 我的测试程序如下 from os import system def sh script system bash c s script sh cd home sh pwd 的输出pwd
  • 如何检测斑点并将其裁剪成 png 文件?

    我一直在开发一个网络应用程序 我陷入了一个有问题的问题 我会尝试解释我想要做什么 在这里您看到第一个大图像 其中有绿色形状 我想要做的是将这些形状裁剪成不同的 png 文件 并使它们的背景透明 就像大图像下面的示例裁剪图像一样 第一张图像将
  • ValueError:设置 random_state 无效,因为 shuffle 为 False。您应该将 random_state 保留为默认值(无),或设置 shuffle=True

    当我尝试在 pycaret 中训练某些内容时 我收到此错误消息 ValueError Setting a random state has no effect since shuffle is False You should leave
  • 在视图之间共享并在 AppConfig 中初始化的变量

    我想要一个在应用程序启动时初始化的变量 并且可以从视图访问该变量 my app my config py class WebConfig AppConfig name verbose name def ready self print lo
  • Chrome 已关闭,并出现错误 ERROR:network_change_notifier_win.cc(141)] WSALookupServiceBegin 失败,原因为:0

    我的笔记本电脑操作系统是 windows 10 我使用 selenium webdriver 和 Python 当我通过脚本打开chrome浏览器时 加载网页后chrome就关闭了 下面是我的python代码和错误 from seleniu
  • 将 pi 打印到小数点后几位

    w3resources 面临的挑战之一是将 pi 打印到小数点后 n 位 这是我的代码 from math import pi fraser str pi length of pi number of places raw input En
  • 如何从 Django 中的链接设置预定义的表单值?

    我的项目是这样布局的 1 page has many categories 2 category belongs to page has many items 3 item belongs to category 当我进入一个页面时 我想修
  • python 根据日期创建目录结构

    我使用以下函数根据今天的日期创建目录 usr bin python import time datetime os today datetime date today todaystr today isoformat os mkdir to

随机推荐

  • 服务器运维管理

    运维人员在日常维护服务器方面避免不了对服务器进行批量管理操作 那站长人群一般都用什么工具管理服务器呢 以下是个人用的对于服务器管理比较便捷的软件 该软件产地 中国 软件名称 IIS7远程桌面 可自行百度查询 系统 目前支持win所有系统 特
  • Java程序员的专属社区

    一个人走的快 一群人走的远 这是Java程序员专属社区创立的初衷 Java程序员大本营 是面向工作1 3年 希望提升专业技术能力的Java 开发者建立 致力于Java知识的分享 交流与学习 点击关注 Java程序员大本营 我们希望通过CSD
  • 程序猿的三高:高并发、高可用、高性能

    一 高并发指标 高并发是现在互联网分布式框架设计必须要考虑的因素之一 它是可以保证系统能被同时并行处理很多请求 对于高并发来说 它的指标有 响应时间 系统对进来的请求反应的时间 比如你打开一个页面需要1秒 那么这1秒就是响应时间 吞吐量 吞
  • 苹果ipa包发布在IIS环境记录

    项目以前IOS打包都是发布到了蒲公英上 不过最近蒲公英突然升级 之前的发布记录全都没了不说 再次上传居然没有公开选项了 也就是说用户每次下载安装都需要输入一个预设密码 最奇葩的是你连接中包含了密码也没用 打开连接时没密码 点安装却提示你要输
  • Linux内存管理(7) - page fault

    了解linux page fault 1 概述 A page fault sometimes called PF PF or hard fault a is a type of exception raised by computer ha
  • Hyperf数据库批量更新

    Hyperf没有批量更新的功能 网上的支持也比较少 但Hyperf是基于laravel的orm 因此可以搜下大神们写的laravel的批量更新的方法 批量更新 public function updateBatch multipleData
  • C语言:定时器原理

    首先 要知道 C语言的定时器是对运行结果起到延时作用 其中 定时单位位毫秒 定时器 顾名思义 肯定会用到时间的 所以 获取时间我们就要用到time库 所以要引用头文件
  • 使用js实现网页录音并上传服务器

    不多嘚嘚 直接上代码
  • Unity界面插件NGUI核心组件说明

    UICamera 可以添加到任何相机 包含事件系统 UICamera是每个UI的重要组成部分 它负责发送Camera中所有NGUI的活动 如果场景中仅有一个Camera 要确保它附有UICamera脚本 如果有多个相机 确保至少用来渲染UI
  • Elasticsearch 7 插件

    1 elasticsearch head 可视化插件 通过浏览器就能看到es的集群部署 节点 索引等信息 注意 es在5 x版本就不再支持head插件安装了 百度搜索可以有多种方式安装 我这里用的是谷歌浏览器安装es head的扩展程序 如
  • 读《携程异步消息系统实践》之总结

    读 携程异步消息系统实践 之总结 消息系统 批量 insertOnly 索引 消息投递 Partition Stick 写入事件截获 预期 Long polling 集群管理 Lease
  • Markdown 有序列表、无序列表中插入代码块

    问题描述 在列表中插入代码块 代码块总是顶格的 并且导致代码块之后的文本也是顶格的 也就是代码块的插入导致了列表的结束 如下所示 解决方法 代码块上方空出来一行 代码块左侧加8个空格或2个TAB 每一行都加 预期效果 扩展 本人个人网站上采
  • 基于Qt仿QQ效果实现图片查看器(支持查看GIF)

    主要提供两个类 第一个类显示静态图片 第二个类显示动态图片 两个类都包含图片缩小放大以及图片移动功能 最后自己封装一个类 根据判断图片是动态还是静态去调用对应的类显示图片 效果展示 判断图片类型 int showImage getImage
  • Mac系统安装Myeclipse2015CI出现虚拟内存为0的问题

    出处 http bbs feng com read htm tid 8450072 page 2 html 方法1 你可以按照9楼的朋友的方法 开启虚拟机的情况下 再安装Myeclipse 就不会出现虚拟内存为0的提示 方法2 Downlo
  • 一元二元三元表达式_2020年高考复习不等式专题训练2.三元不等式的证明

    三元不等式是二元不等式的补充形式 三元不等式和二元不等式类似 经常会有一个三元等式作为条件 解决三元不等式问题的思路大致分为两种 第一是根据等式条件减少未知量的数量 将三元转化为二元 第二是直接利用二元基本不等式的扩展形式或者将三元两两组合
  • Qt中click事件如何响应带参槽函数

    include qttest008 h include
  • Android LCD(一):LCD基本原理篇

    关键词 android LCD TFT 液晶 偏光片 彩色滤光片 背光 平台信息 内核 linux2 6 linux3 0系统 android android4 0 平台 samsung exynos 4210 exynos 4412 ex
  • PHP分页页面重复,WordPress分页标题重复如何解决

    WordPress是一款非常流行的博客程序 虽然它各方面的优化都做的不错了 但每个人的喜好都不一样 一些细节还是可以改进的 No牛网就碰到Wordpress很多的问题都不是那么好实现 毕竟不是专门做CMS的 如等下要说到的Wordpress
  • 【C++】STL库set容器

    STL库set容器 1 构造函数 2 增 2 1 insert 去重 排序 2 2 emplace 去重 排序 2 3 代码演示 3 删 3 1 erase 函数 3 1 1 erase list与vector 3 1 2 erase ma
  • 【python基础知识】20.“午饭吃什么”的python实现(产品思维-实操篇)

    文章目录 前言 练习介绍 练习目标 练习要求 项目实操 明确目标 形成技术方案 编写程序代码 数据准备 主流程逻辑搭建 完善补充确实的功能 最终代码整合 总结 前言 首先 我们回顾以下运用学到的编程知识去做一个产品的大致步骤 同时 也学了一