如何按顺序运行多个功能?

时间:2015-03-16 11:22:53

标签: python function python-3.x

对于有经验的编码员来说,这应该是一个简单的...我正在编写一个程序,从混乱的输入中输出anagrams(来自给定的列表)。我相信我的代码包含了产生所需结果的所有必要函数,但我无法弄清楚如何使程序按顺序运行各自的函数。示例输出为:

Please enter a jumbled word: lsitNe
Your words are:
silent
listen
enlist
tinsel

这是我的输出,目前:

  Please enter a jumbled word: dff
Traceback (most recent call last):
  File "/Users/edinnerman/Desktop/poop.py", line 53, in <module>
    main()
  File "/Users/edinnerman/Desktop/poop.py", line 5, in main
    yay_anagrams = anagramlist(lword)
NameError: name 'lword' is not defined

在给定用户输入的情况下,如何重新格式化代码以输出文本文件中列出的所有字谜? 这是我的代码:

 #0: Create a main function to bring all functions together for the output.
def main():
    textfile = open('words.txt', 'r').read()
    dictionary_of_words = filename(textfile)
    yay_anagrams = anagramlist(lword)
    double_whammy = binary_search(fresh_list, ltextfile)
    answer = output()

#1, 2: Take a filename as a parameter and ask user for word to unjumble. Lowercase all.
def filename(textfile):
    ltextfile = textfile.lower()
    scrambled_eggs = input("Please enter a jumbled word: ")
    lword = scrambled_eggs.lower()

#3: Create an anagram list (already lowercase) for the jumbled word.
def anagramlist(lword):
    if lword == "":
        return([lword])
    else:
        yay_word = lword[1:]
        first_letter = lword[0]
        fresh_list = []
        for mixed_word in filename(yay_word):
            for pos in range(len(mixed_word) + 1):
                fresh_list.append(mixed_word[:pos] + first_letter[0] + mixed_word[pos:])
            return fresh_list

#4: Check if any words in anagram list match dictionary list.
def binary_search(fresh_list, ltextfile):
    for eachword in fresh_list:
        low = 0
        high = len(list) - 1 
    while low <= high:
        mid = (low + high)//2
        item = list[mid]
    if fresh_list == item:
        return True
    elif fresh_list < item:
        high = mid - 1
    elif fresh_list > item:
        low = mid + 1
    return False

#5: Print appropriate statements.
def output():
    if fresh_list == True:
        newlist = set()
        for item in fresh_list:
            newlist.add(item)
        print("Your words are:/n", newlist)
    if fresh_list == False:
        print("Your word cannot be unjumbled.")       
main()

请原谅我在此代码中可能遇到的一些轻微编码错误。

1 个答案:

答案 0 :(得分:2)

这里最主要的问题是,在将结果分配给变量方面,您没有正确的流程。根据评论中的建议 - 您可能需要查看the python function definition tutorial section。我已经提出了你需要解决的一些特殊问题。

问题1

特别是 - 您需要考虑return语句。如果函数定义没有return语句,那么为其结果赋值变量是没有意义的。试试一个例子:

def main():
    x = 1+1

y = main()
print(y)

您可能期待2 - 实际上您会看到None,因为该功能不会返回任何内容。如果你改变了它,那就是:

def main():
    x = 1+1
    return x

y = main()
print(y)

您现在获得输出2。您的函数filename()output()会受此影响。

问题2

如果已经分配了代码块中的变量值,则只能使用它们。

例如 - 考虑以下非常简单的程序

def message(x):
    return 'You input the string ' + x

def main():
    first_in = input('Please give me some input')
    result = message(in_from_above)
    print(result)

main()

这将以与您的程序类似的方式失败,因为in_from_above不是已在程序中定义的变量。如果您将其更改为:

def message(x):
    return 'You input the string ' + x

def main():
    first_in = input('Please give me some input')
    result = message(first_in)
    print(result)

main()

它将输出返回的消息。此问题会影响main()中的序列,当您未在lword 中分配任何值时尝试将anagramlist()发送到lword函数main()函数

注意 我可以看到您在lword函数中为filename()分配了一个值。您可能希望该作业可用于main()功能。它不会。这与称为变量范围的事情有关。通常在Python中,变量是 local ,或仅在定义和分配它们的代码块中可用。另一种类型的变量是全局变量 - 其中变量可用于程序范围的代码。你可以在一个函数global中明确地创建一个分配,但我可以肯定地说你不需要为这个分配做这个,并建议你没有。范围界定非常简短in the Python docs here。范围界定是一个非常基本的编程概念,值得花一些时间来了解。玩一些简单的例子 - 在函数内部和外部使用相同的变量名称,看看你得到了什么等等。

一般性评论

当出现问题时,为了帮助调试,简化案例并了解他们出错的地方。你可以看到我已经用非常简单的案例展示了你遇到的主要问题。你也可以做到的。函数中的逻辑可能会或可能不会完全按照您的意愿工作,但在您对这些基础知识进行排序之前,将无法调试更复杂的情况。

修改 - 推荐

再看看你的代码,我还建议拆分#1和#2的函数 - 即一个函数用于小写你的字典,另一个用于获得小写用户输入。它不是必需的,但它会让您的代码更容易理解,让您的生活更轻松。