【问题标题】:Function that calls itself returns only first result of its call调用自身的函数仅返回其调用的第一个结果
【发布时间】:2015-07-20 21:54:20
【问题描述】:

我有一个字符串s="expences > drinks" 被发送到一个函数。在该函数中,我应该使用raw_input() 添加新值,直到我输入一个空字符串。

这些输入中的每一个都应添加到初始字符串中。在空字符串的情况下,函数必须返回包含所有先前添加的单词的字符串。

我试图通过调用函数本身并将更改的字符串传递给它来实现它,但它只返回第一个添加的单词。我还尝试避免使用while True: 从自身调用函数,如果为空字符串,则中断循环并返回值。但是这些变体都不能正常工作。

请解释我做错了什么以及最pythonic的方法是什么。

代码如下:

#!/usr/bin/env python -tt
# -*- coding: utf-8 -*-

def create_sub_cat(parent):     
    print "creating subcat\n %s > " %(parent)
    conf=raw_input("type new subcat or press \"ENTER\" to save changes\n")
    if conf!="":
        parent+=" > "+conf
        create_sub_cat(parent)
    return parent

s="expences  > drinks"
print create_sub_cat(s)

【问题讨论】:

  • 好吧,当你递归调用函数时,你并没有对返回值做任何事情。您既不是 returning 它的结果,也不是在使用它。

标签: python return call


【解决方案1】:

您可以将iter 与 for 循环一起使用,您无需继续调用该函数,iter 将一个标记值作为它的最后一个参数,它将一直循环直到输入标记值:

def create_sub_cat(parent):
    print "creating subcat\n {} > ".format(parent)
    for conf in iter(lambda: raw_input("type new subcat or"
                                       " press \"ENTER\" to save changes\n"),""): # empty string for sentinel value
        parent += " > " + conf
    return parent

或者使用while True:

def create_sub_cat(parent):
    print "creating subcat\n {} > ".format(parent)
    while True:
        conf = raw_input("type new subcat or"
                                       " press \"ENTER\" to save changes\n")
        if not conf: # if user enters empty string break
            break
        parent +=" > " + conf # else keep concatenating
    return parent

为什么你的代码不起作用是因为你没有返回递归调用,所以你只得到第一个值:

def create_sub_cat(parent):
    print "creating subcat\n %s > " %(parent)
    conf=raw_input("type new subcat or press \"ENTER\" to save changes\n")
    if conf!="":
        parent+=" > "+conf
        return create_sub_cat(parent) # return 
    return parent

【讨论】:

  • 好的,谢谢。这些解决方案中哪一种更好?
  • @SergiiArtele,我更喜欢iter 方法,但它归结为个人喜好真的介于iter 和while 之间。两者都将优先于递归方法。如果我将输入转换为 int,float.. 我会使用一段时间的 try/except,但只是接受输入,我更喜欢 iter。
  • @PadraicCunningham 在我看来,使用嵌套函数而不是 lambda 会使其更具可读性。您可以向辅助函数添加适当的文档字符串。此外,一个简短的函数名称将使哨兵更加明显。现在很难找到长 lambda 行的结尾。
猜你喜欢
  • 1970-01-01
  • 2015-09-27
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多