【问题标题】:How do i return each value in a loop?如何在循环中返回每个值?
【发布时间】:2016-05-21 14:32:00
【问题描述】:

我不想打印每个句子,而是要返回它! 但如果我返回,它将结束循环。

def printDeck(fileName):

    infile = open(fileName,'r') # open file
    contents = infile.readlines()   # read file
    infile.close()  # close file

    for sentence in contents:   # for each line in contents
        sentence = sentence.split() # eliminate spaces and turn into a list
        sentence[0], sentence[1] = sentence[1], sentence[0] # reverse order
        print('{0} of {1}'.format(sentence[0],sentence[1]))

这是我试图解决的练习:

编写一个名为 printDeck() 的函数,它接受一个参数,一个文件名。该函数应读入文件的内容并以如下所示的格式打印。例如:如果从文件中读入“Hearts 6”,则字符串应打印为“6 of Hearts”。该函数应该以列表形式返回文件的内容。

【问题讨论】:

  • 您不能多次返回。您可以根据需要返回一个列表或元组,但是当您返回时,控制流会跳回调用者。
  • 您在寻找yield吗?
  • 或许printDeck应该重命名为getDeck

标签: python loops python-3.x for-loop return


【解决方案1】:

也许你想创建一个生成器:

def printDeck():
    """return contents of file as string"""
    ...
    for sentence in contents:   # for each line in contents
        ...
        yield '{0} of {1}'.format(sentence[0],sentence[1])

然后将其用作

deck = printDeck()
deck1 = next(deck)
deck2 = next(deck)
etc.

for deck in printDeck():
    print(deck)

【讨论】:

  • 每次调用它都会返回下一个值。这不是真的。他们需要调用一次以获取生成器对象,然后对其进行迭代(或在其上使用next())。
  • 没错,我编辑了答案。很抱歉很久没有这样做了)
  • 下一个(甲板)是 Python3
  • 这个问题被标记为 Python 3,除此之外,它仍然可以在 Python 2 中工作。
【解决方案2】:

你只能在一个函数中返回一个值一次。但是您可以将生成的字符串附加到mylst,然后在循环结束后返回mylst

mylst = []
for sentence in contents:   # for each line in contents
    sentence = sentence.split() # eliminate spaces and turn into a list
    sentence[0], sentence[1] = sentence[1], sentence[0] # reverse order
    mylst.append('{0} of {1}'.format(sentence[0],sentence[1]))

return mylst

【讨论】:

  • 一般来说,生成器是解决这个问题的最佳解决方案。这个答案将整个文件读入内存,然后在一个大列表中返回所有内容。您仍然需要遍历该列表才能打印,因此在解决此类问题时不妨利用生成器的效率。
  • 在我写答案的时候,我们甚至不知道涉及到文件。但感谢您的澄清评论。
  • 它总是涉及一个文件,但这回答了 OPs 的问题,因为它返回了所需的列表对象(也可以通过在生成器对象上调用 list() 来使用生成器完成)。跨度>
  • 我没有马上看到。无论如何,OP 接受了这个答案,这是一个可行的解决方案(至少对于小文件)。
  • 确实,这似乎是一个纸牌游戏,所以数据量应该不会太大。如果@Dan 遇到内存问题,我们建议他考虑迭代器/生成器。特别是,infile 已经是一个,所以对于文件来说它真的很有意义。
【解决方案3】:

您不能返回单个句子并留在循环中。您可以像这样返回已交换短语的列表:

mylst = []
for sentence in contents:   # for each line in contents
    sentence = sentence.split() # eliminate spaces and turn into a list
    phrase = sentence[1] + " of " + sentence[0]
    mylst.append(phrase)

return mylst

【讨论】:

  • 非常感谢,这正是我需要的!
【解决方案4】:

printDeck() 写为产生字符串的生成器。然后遍历该生成器进行打印。

您无需使用readlines() 一次性将整个文件读入内存。如果您在上下文管理器中打开文件(使用with),则无需担心关闭它 - 上下文管理器将确保发生这种情况。

句子的前两个单词可以用str.format()进行反转,而无需在拆分后实际交换顺序。

你可以把你的代码写成一个生成器,这样更清楚:

def read_deck(fileName):
    with open(fileName) as f:    
        for sentence in f:
            yield '{0[1]} of {0[0]}'.format(sentence.split())

>>> for s in read_deck('deck.txt'):
...     print(s)

如果您想要一个列表中的所有字符串,请在生成器上调用list()

>>> deck = list(read_deck('deck.txt'))

【讨论】:

    猜你喜欢
    • 2013-12-30
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 2015-04-19
    • 2019-09-16
    • 1970-01-01
    • 2015-06-23
    相关资源
    最近更新 更多