Return一次一个字

Return one word at a time

我有一个函数,它接受一个文本文件并一个一个地打印文件中的每个单词,每个单词一个新行。


这是执行我上面所说的代码:

def print_one_word():
    with open("test_script.txt", "r") as f:
        lines = f.readlines()
        word_current = []
        for line in lines:
            for word in line.split():
                word_current.append(word)
                print("".join(word_current))
                word_current.clear()

示例,具有指定的文本文件内容:

test_script.txt 具有内容(按格式):stack, hello test python's name

函数 print_one_word() 会将以下内容打印到标准输出(按格式):

stack,  
hello  
test  
python's  
name

目标是将每个单词一个接一个地传递给第二个函数,该函数将对其执行一些操作(例如:将第一个字母大写)。然而,最重要的部分是它只向第二个函数发送一个单词,一旦执行操作,就会发送下一个单词。

为此,我将 print 替换为 return,在意识到这行不通(只会发送一个字)后,我尝试使用 yield。但是,它仍然只向第二个函数发送一个字,然后停止(不会继续发送后面的字)。

我还尝试了一些方法(创建一个单词列表,不带格式打印该列表,然后清除列表),例如简单地打印 word 等等。不幸的是,我得到了同样的结果;我可以一次一个地打印每个单词,但不能一次一个地向第二个函数发送每个单词。

有人有什么建议吗?提前致谢。

编辑,为清楚起见:
第二个函数接受一个参数,我用第一个函数作为参数。
示例:

def operation(script):
    does some things

operation(print_one_word())

只需将所有单词存储到一个列表中,然后调用您想要的任何函数(在这种情况下,我之后会调用 do_something()

def do_something(word):
  print(word.upper())

def print_one_word():
    with open("test_script.txt", "r") as f:
        lines = f.readlines()
        all_words = []
        for line in lines:
            for word in line.split():
                all_words.append(word)
                print(word)

    for word in all_words:
      do_something(word)

print_one_word()

输出:

stack,
hello
test
python's
name
STACK,
HELLO
TEST
PYTHON'S
NAME

这是一个示例,说明如何 return 列表并从函数中生成,请记住 yield return 生成器对象,如果你想重用生成的结果,你需要列出它们:

def yield_words():
    with open("test_script.txt", "r") as f:
        lines = f.readlines()
        for line in lines:
            for word in line.split():
                yield word

def list_words():
    with open("test_script.txt", "r") as f:
        return [word
                for line in f.readlines()
                for word in line.split()]

def operation(prefix, word):
    print(f'{prefix} {word}')

yielded_words = list(yield_words())
listed_words = list_words()

for word in listed_words:
    operation('listed', word)

for word in yielded_words:
    operation('yielded', word)

输出:

listed this
listed is
listed a
listed test
listed hello
listed there
yielded this
yielded is
yielded a
yielded test
yielded hello
yielded there