我如何从一个函数获取数据到另一个函数

时间:2020-11-02 22:18:22

标签: python-3.x function

我读到有关“随机”的信息,这使我开始考虑通过编写一个显示单词并需要输入单词的程序来帮助我的孩子进行读写。因为这是一个小程序,所以我可以很容易地通过过程编程来做到这一点,但是为了使其对她更具“吸引力”,我决定不妨使用tkinter。

Tkinter强制创建可以通过“命令”调用的函数,但是现在我遇到了问题。如果运行check()函数,它将无法从dictee()函数获取变量。我从将函数嵌套在函数中(未定义的变量问题),或通过带有return的参数传递(以递归结束),使用全局(单词列表不会为空)等方式找到了几个答案。我无法获得他们中的任何一个都在工作...我一直在寻找答案,但是我找不到正确的解决方案。有人有人在意他们的答案吗?

谢谢!

"""import nescessary."""
import sys
import random

def main():
    """Setting up the game"""
    print("Aliyahs reading game.'\n")
    begin = input("do you want to start? yes or no.\n\n")
    if begin == "yes":
        dictee()

def dictee():
    """Show random words and ask for input."""
    words_correct = 0
    words_wrong = 0
    vocabulary = ['kip', 'hok', 'bal', 'muis', 'gat'
        ]
    words_passed = []
    while True:
        if vocabulary == []:
            print("\n\nThose were all the words.")
            print("Words correct: %d" % words_correct)
            print("words wrong: %d" % words_wrong)
            one_more_time = input("Do you want to go again? yes or no")
            if one_more_time == "no":
                print("See you next time.")
                input("\nPush enter to close.")
                sys.exit()
            else:
                main()
        word = random.choice(vocabulary)
        print('\x1b[2J')
        print("{}".format(word))
        print("\n\n")
        words_passed.append("{}".format(word))
        vocabulary.remove("{}".format(word))
        answer = input("Write the word you saw:\n\n")
        check()

def check():
    '''Cross check word shown with answer given'''
    if answer == word:
        print("Nice")
        words_correct += 1
    else:
        print("2bad")
        words_wrong += 1

    try_again = input("\n\nContinue? yes or no\n ")

    if try_again.lower() == "no":
        exit_game()
    else:
        dictee()


def exit_game():
    '''summarize results and exit after pushing enter'''
    print("Words correct: %d" % words_correct)
    print("Words wrong: %d" % words_wrong)
    input("\nPress Enter to exit.")
    sys.exit()


if __name__ == "__main__":
    main()

1 个答案:

答案 0 :(得分:0)

我在这里所做的更改很少,并且运行它并没有出现任何错误,因为我不知道为获得正确的结果而键入什么内容。无论如何,所有更改都与global和值的重新定义有关。

# say these outside all the functions, in the main block
words_correct = 0
words_wrong = 0 
vocabulary = ['kip', 'hok', 'bal', 'muis', 'gat'] 
words_passed = [] 

def dictee():
    global word, answer
..... #same bunch of codes
def check():
    global answer, words_correct, words_wrong
.... #same bunch of codes

我们为什么要说global基本上是因为,当我们定义变量时,它们要么在局部作用域或全局作用域中定义,要么在主块(所有功能之外)中定义在全局范围内,而内部函数在局部范围内。在全局范围内定义的变量可以在任何地方访问,而在本地范围内的变量只能在其定义的内部访问。

我们必须在哪里使用global我们说的是在全局位置定义变量或重新定义变量,或者至少这是我所知道的。我们需要在声明变量的地方说global,例如a = 'good',如果要更改它,我们还需要说globala = 'bad'a += 'day'因为我们正在为其分配新值。在主块上使用所有函数之外的全局变量是没有用的。

为什么要在所有函数之外声明words_correctwords_wrong这仅仅是因为如果您在dictee()中声明并将其值设置为0,则每个函数运行时,这些变量的值将变为0,这意味着score始终为0或1,因此我们仅在主块中定义一次。相同的逻辑适用于两个列表(vocabularywords_passed),每次函数运行时,它们都会将列表重置为完整的单词列表,因此,要消除该问题,只需在主菜单中定义一次

我还认为在这里使用参数可能需要重新构造代码,因为您要相互调用这两个函数。

请注意,我们只对函数说global,在外部函数中,所有定义的变量都对全局范围开放,可以从代码中的任何位置访问。

PS:这只是我对4个月跨度的了解,如果我在任何地方都做错了,请纠正我,谢谢:D