尝试在自己内部调用函数

时间:2016-06-23 20:28:46

标签: python function recursion

我是python的新手。最近,我按照在线python课程学习python。这是课程中的一个简单问题:

编写一个名为 item_order 的函数,该函数将名为 order 的字符串作为输入。该字符串仅包含客户可以按一个空格分隔的商品的单词。该函数返回一个字符串,该字符串计算每个项目的数量,并按以下顺序合并它们:

  <沙拉:[#salad]汉堡包:[#hambruger]水:[#water]。

结果示例是:if order = "salad water hamburger salad hamburger"然后函数返回

  

沙拉:2个汉堡包:2个水:1个

我自己完成了这个问题而没有任何问题。代码是:

def item_order (order):
    num_sa = 0
    num_wa = 0
    num_ha = 0

    new_order = order.split(' ')

    for item in new_order:
        if item == 'salad':
            num_sa += 1
        elif item == 'water':
            num_wa += 1
        elif item == 'hamburger':
            num_ha += 1

    group = 'salad:'+str(num_sa)+' '+'hamburger:'+str(num_ha)+' '+'water:'+str(num_wa)

    return group

print('Please enter the order.')
order = raw_input('')

group = item_order(order)
print(group)

但是好奇如果输入'order'有一些错误,那么我怎么能改变我的代码呢?所以我修改了我的代码:

def item_order (order):
    num_sa = 0
    num_wa = 0
    num_ha = 0
    flag = 0

    new_order = order.split(' ')

    for item in new_order:
        if item == 'salad':
            num_sa += 1
        elif item == 'water':
            num_wa += 1
        elif item == 'hamburger':
            num_ha += 1
        else:
            flag = 1
            break

    if flag == 1:
        print('There is something wrong on the order you insert, please re-enter.')
        fix_order = raw_input('')
        item_order(fix_order)

    group = 'salad:'+str(num_sa)+' '+'hamburger:'+str(num_ha)+' '+'water:'+str(num_wa)

    return group

print('Please enter the order.')
order = raw_input('')

group = item_order(order)
print(group)

但是我发现有一些问题我无法分辨出代码有哪些错误。

例如:如果我将"salad water hamburger salad hamburge"作为输入'order',它会让我再次重新输入,因为'hamburge'是错误的。

所以在我重新输入正确的订单"salad water hamburger salad hamburger"之后,它会给我结果:

  

“沙拉:2个汉堡包:1个水:1个”

但汉堡包的数量应为2.我认为当我尝试在其自身内调用函数item_order()时会出现问题。

有人可以帮我找到这个错误吗?

2 个答案:

答案 0 :(得分:1)

if flag == 1:
    print('There is something wrong on the order you insert, please re-enter.')
    fix_order = raw_input('')
    item_order(fix_order)

item_order来电无效。您没有使用返回值。

请记住,调用函数不只是跳转到函数的开头 - 在函数返回后,执行会继续执行调用。

在你的情况下,这一行:

group = 'salad:'+str(num_sa)+' '+'hamburger:'+str(num_ha)+' '+'water:'+str(num_wa)

这些仍然是原始无效order的变量。

修复此代码的最简单方法是更改​​

    item_order(fix_order)

    return item_order(fix_order)

这样你就忽略了破碎的输入和迄今累积的num_*计数;相反,您将固定订单的结果转发给您自己的来电者。

答案 1 :(得分:1)

错误是你的函数item_order正在返回一个字符串,但是你没有在任何地方捕获它。因此,当您在if语句中调用item_order时,您需要有一个变量来捕获它返回的字符串。例如:

if flag == 1:
    print('There is something wrong on the order you insert, please re-enter.')
    fix_order = raw_input('')
    group = item_order(fix_order)
    return group

group = 'salad:'+str(num_sa)+' '+'hamburger:'+str(num_ha)+' '+'water:'+str(num_wa)

return group

这可以通过在fix_order输入上返回item_order函数的输出来解决您的问题。