【问题标题】:Python custom functionPython自定义函数
【发布时间】:2013-07-30 01:34:01
【问题描述】:

上周我一直在学习 Python,而且进展非常顺利,但是现在我已经了解了自定义函数,但我有点碰壁了。虽然我了解它的基础知识,例如:

def helloworld():
    print("Hello World!")

helloworld()

我知道这将打印“Hello World!”。

但是,在从一个函数到另一个函数中获取信息时,我发现这令人困惑。即:function1 和 function2 必须一起工作才能执行任务。另外,何时使用return 命令。

最后,当我在函数中有一个列表或字典时。我会编一些东西作为例子。

def my_function():
    my_dict = {"Key1":Value1,
              "Key2":Value2,
              "Key3":Value3,
              "Key4":Value4,}

如何访问键/值并能够从函数外部更改它们?即:如果我有一个程序可以让您在视频游戏中输入/输出玩家统计数据或角色属性。

我理解其中的点点滴滴,当它们有不同的函数相互调用时,这让我感到困惑。

另外,因为这是我第一次接触自定义函数。这真的是雄心勃勃的追求吗,这可能是我所有困惑的原因吗?因为这是我见过的最复杂的程序。

【问题讨论】:

  • 总是在函数中使用 return。
  • 我认为您必须更加具体。你能举一个你可能想做的事情的例子吗?
  • @SantoshKumar 我认为这是一个很好的指导方针,但并不是每个函数都应该使用return。一个很好的例子是只使用print的函数。
  • 我将发布一些内容作为示例。 =]
  • @SethMMorton 我们总是可以使用print(my_function) 来处理这种情况。

标签: python function python-3.x


【解决方案1】:

python 中的Functions 可以是常规的procedure 和带有返回值的function。实际上,每个 Python 的函数都会返回一个值,可能是None

如果没有返回语句,那么你的函数将被完全执行并按照代码流正常离开,产生None作为返回值。

def foo():
    pass
foo() == None
>>> True

如果您的函数中有 return 语句。返回值将是其后的表达式的返回值。例如,您可能有return None,并且您将明确返回None。您也可以拥有 return 而不使用其他任何内容,您将隐式返回 None,或者您可以拥有 return 3,您将返回值 3。这可能会变得更加复杂。

def foo():
   print('hello')
   return
   print('world')

foo()
>>>'hello'

def add(a,b):
    return a + b
add(3,4)
>>>7

如果您想要在函数中创建的字典(或任何对象),只需返回它:

def my_function():
    my_dict = {"Key1":Value1,
              "Key2":Value2,
              "Key3":Value3,
              "Key4":Value4,}
    return my_dict
d = my_function()
d['Key1']
>>> Value1

这些是函数调用的基础。还有更多。有些函数返回函数(也被视为装饰器。你甚至可以返回多个值(不是真的,你只是返回一个元组)和很多有趣的东西:)

def two_values():
    return 3,4
a,b = two_values()
print(a)
>>>3
print(b)
>>>4

希望这会有所帮助!

【讨论】:

  • def foo() 示例中,return print("world") 的目的是什么,另外,您实际上如何让函数打印“世界”的实例?
  • 它的目的是告诉你return语句完成了函数的执行。它下面的任何东西都不会被执行(虽然很清楚,但仍然只是想显示)
  • 哦,好的,谢谢。所以return 之后的print("world") 永远不会被执行和/或无法访问?
  • 对,聪明的文本编辑器会警告你不可访问的代码。
【解决方案2】:

在函数之间传递信息的主要方式是使用参数和返回值。函数不能看到彼此的变量。你可能会认为

def my_function():
    my_dict = {"Key1":Value1,
              "Key2":Value2,
              "Key3":Value3,
              "Key4":Value4,}
my_function()

my_dict 将具有其他函数能够看到的值,但事实证明这是设计语言的一种非常脆弱的方式。每次调用my_functionmy_dict 都会失去它的旧值,即使你还在使用它。此外,在编写新函数时选择要使用的名称时,您必须知道系统中每个函数使用的所有名称,整个事情很快就会变得难以管理。 Python 不是这样工作的。我想不出有什么语言可以做到。

相反,如果一个函数需要向其调用者提供信息,return 它的调用者需要看到的东西:

def my_function():
    return {"Key1":"Value1",
            "Key2":"Value2",
            "Key3":"Value3",
            "Key4":"Value4",}
print(my_function()['Key1']) # Prints Value1

请注意,函数在执行到return 语句时结束(即使它在循环中间);你不能现在执行一个返回,稍后返回一个,继续,当你到达函数末尾时返回两个东西。如果您想这样做,请保留一份您想要退回的物品清单,并在您完成后退回清单。

【讨论】:

    【解决方案3】:

    您将信息输入输出函数分别带有参数返回值。这个函数,例如:

    def square(number):
        """Return the square of a number."""
        return number * number
    

    ...通过number 参数接收信息,并通过return ... 语句将信息发送回。你可以这样使用它:

    >>> x = square(7)
    >>> print(x)
    49
    

    如您所见,我们将值 7 传递给函数,它返回值 49(我们将其存储在变量 x 中)。

    现在,假设我们有另一个函数:

    def halve(number):
        """Return half of a number."""
        return number / 2.0
    

    我们可以通过几种不同的方式在两个函数之间发送信息。

    1. 使用临时变量:

      >>> tmp = square(6)
      >>> halve(tmp)
      18.0
      
    2. 直接使用第一个函数作为第二个函数的参数:

      >>> halve(square(8))
      32.0
      

    您使用哪些部分取决于个人品味,部分取决于您尝试做的事情有多复杂。

    即使它们具有相同的名称,square()halve() 内部的 number 变量也是完全独立的,并且它们在这些函数之外是不可见的:

    >>> number
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'number' is not defined
    

    因此,实际上不可能在示例函数中“看到”变量my_dict。你通常会做的事情是这样的:

    def my_function(my_dict):
        # do something with my_dict
        return my_dict
    

    ...并在函数外部定义my_dict

    (实际上比这要复杂一点 - dict 对象是可变的(这只是意味着它们可以更改),因此通常您实际上不需要返回它们。但是,为了安全起见,暂时最好习惯于退回所有东西)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-09
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-30
      • 2019-02-22
      • 2013-03-07
      相关资源
      最近更新 更多