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

前言

首先,我们回顾以下运用学到的编程知识去做一个产品的大致步骤:
在这里插入图片描述
同时,也学了一种配合“产品思维”的思维工具:流程图。
在这里插入图片描述
在这里插入图片描述
例如:摩拜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 关键字定义函数,使用函数名加括号调用函数
返回值的使用函数可以通过返回值将计算结果或数据传递给调用者

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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大师兄6668

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值