【问题标题】:how to access a variable that's inside a function如何访问函数内部的变量
【发布时间】:2019-07-17 02:00:08
【问题描述】:

我尝试执行 4 个步骤,向用户询问“关键字符”和字符串,然后将字符串大写,然后从字符串中删除关键字符的所有实例。这些步骤中的每一个都应该是它自己的功能。但是,第 3 步和第 4 步依赖于访问位于第 1 步和第 2 步的函数中的变量。

我已经阅读了一些关于此的主题,例如以下... How to access the variables declared inside functions in python ...这表明您必须在定义变量后“返回”变量,但我已经这样做了(我认为)并且它没有改变任何东西。

def main():
    get_key_character()
    get_string()
    sentence_capitalizer()
    remove_key_character()

def get_key_character():
    key_character=str(input("Please enter a SINGLE character to act as key? "))
    if len(key_character)!=1:
        get_key_character()
    else:
        return key_character

def get_string():
    phrase_input=str(input("Please enter a phrase or sentence >=4 and <=500 characters: "))
    if len(phrase_input) <4 or len(phrase_input)>500:
        get_string()
    else:
        return phrase_input

def sentence_capitalizer():
    import re
    sentence_capitalized=(re.sub(r"(^|\?|\.|\!)\s*(\w)", lambda q: q[0].upper(), phrase_input))
    return sentence_capitalized 

def remove_key_character():
    sentence_capitalized.replace(key_character, "")


main()

错误:def sentence_capitalizer 中未定义名称短语输入和 def remove_key_character 中未定义名称 key_character

【问题讨论】:

  • 您需要将返回的值分配到一个变量中,并在每种情况下将其传递给下一个函数
  • 花点时间了解参数和从函数返回值。

标签: python


【解决方案1】:

您缺少的是返回值必须存储在另一个变量中。 例如,

def test():
    x = 1
    return x

def main():
    z = test()
    print(z)

main()

这个程序会输出:

1

您必须将函数的输出作为参数传递给不同函数的后续调用。我已经修改了你的代码,让它像这样工作。

def main():
    key_character = get_key_character()
    phrase_input = get_string()
    sentence_capitalized = sentence_capitalizer(phrase_input)
    removed = remove_key_character(key_character, sentence_capitalized)
    print(removed)

def get_key_character():
    key_character=""
    while len(key_character) < 1:
        key_character=str(input("Please enter a SINGLE character to act as key? "))

    return key_character

def get_string():
    phrase_input=str(input("Please enter a phrase or sentence >=4 and <=500 characters: "))
    if len(phrase_input) <4 or len(phrase_input)>500:
        get_string()
    else:
        return phrase_input

def sentence_capitalizer(phrase_input):
    import re
    sentence_capitalized=(re.sub(r"(^|\?|\.|\!)\s*(\w)", lambda q: q[0].upper(), phrase_input))
    return sentence_capitalized 

def remove_key_character(key_character, sentence_capitalized):
    return sentence_capitalized.replace(key_character, "")


main()

【讨论】:

  • input 在 Python 3 中根据定义返回 str,因此无需执行 str(input(...))。您仍然没有在递归调用中返回任何内容。
  • 我知道。我只是逐字复制了他的代码。感谢您提供有关递归调用的说明!没听懂。 @tripleee
  • 感谢您的回复。现在我收到以下错误,我想是因为,正如 Tripleee 指出的那样,我设置函数的方式,它们返回“无”。 -------------------------------------------------- --------------- 文件“C:/Users/Jaimen/.spyder-py3/practice7.py”,第 34 行,remove_key_character return sentence_capitalized.replace(key_character, "") TypeError : replace() 参数 1 必须是 str,而不是 None
  • 在回溯中,您应该会看到哪个函数调用了replace_key_character,并将key_character 参数设置为None
  • 我修改了我的示例代码。你可以再试一次,但我认为原件也不应该被破坏(如果你正在运行我的副本)
【解决方案2】:

如果 len(key_character)!=1: get_key_character()

在这种情况下,您的函数不会 return 任何东西(因此隐式返回 None)。你想return get_key_character()(或者也许更有用的重构以避免递归,即添加一个while循环并在你收到一个有效字符时退出它,而不是让函数自己调用直到它收到一个有效字符)。

更一般地说,您应该避免使用全局变量。每当一个函数返回一些有用的东西时,调用代码应该将该值分配给一个local变量。如果您需要将该值传递给另一个函数,请让该函数接受一个参数到它自己的另一个 local 变量中。

【讨论】:

  • Idk 如果可以在此处发布链接。我尝试用代码回复,但根本无法使格式正常工作。 i.imgur.com/by1dnDH.png
  • 非常讨厌代码图像,原因很充分(参见例如idownvotedbecau.se/imageofcode 了解基本原理)。如果您想链接到代码,请将其发布在 ideone.comrepl.it 之类的代码托管站点上,或者至少是 pastebin.com 之类的文本托管站点上...也许可以解释为什么我们应该点击 - 你有问题仍然存在,还是您只是在寻找评论或进一步的反馈?
  • 好的,谢谢你的信息。我阅读了关于评论格式的页面,该页面建议将文本缩进 4 个空格或使用 control-K,但这些都不适合我....您能澄清一下这个网站是否支持带代码的评论吗?否则,将来我可以使用您提到的代码托管站点。为了解释,我根据您的反馈修改了适用的代码部分(编写一个while循环而不是让函数调用本身)所以我只是想知道我是否走在正确的轨道上但是(那部分)代码似乎工作,所以我想我不需要进一步验证..
  • 确实,cmets 中不支持代码格式化。
猜你喜欢
  • 2015-04-29
  • 2017-02-02
  • 2017-06-01
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
  • 2020-03-03
  • 1970-01-01
相关资源
最近更新 更多