与函数参数混淆以及为什么不需要通过名称调用参数

时间:2012-11-01 15:02:00

标签: python function parameters scope

首先,我使用的是Python3

我正在阅读Khanacademy关于函数的Python教程:

Defining a Factorial Function

以下是代码:

def factorial(number):
    product = 1
    for i in range(number):
        product = product * (i+1)
    return product

user_input = int(input("enter a number that you want to factorial: "))
factorial_of_user_input = factorial(user_input)
print(factorial_of_user_input)

我很难解释我的困惑,所以请耐心等待。我不明白以下内容:Sal命名参数数字。但是,数字消失了。

最初,在功能教程之前, user_input 被命名为数字,后跟打印(数字)。你得到输入,称之为数字,然后打印数字,这非常有意义,因为它很好且一致。

不幸的是,现在,对我来说,这种一致性已被打破。如何更改变量名称与参数名称不同并使其有效?因为一致性被打破了,我认为它会炸毁。在我看来,我这样看:该函数在一个名为数字的存储桶中查找整数。如果你没有从那个确切的桶中给它一个整数,它就不会工作 - 就像把一个圆形的钉子钉在一个矩形中一样。

Python使用什么魔法来确定 user_input 数字相同?

3 个答案:

答案 0 :(得分:0)

number是factorial函数的名称,所有语法都意味着:您输入一个参数,并在factorial函数内部称为名称。名称user_input不相关,您也可以写 factorial(5)

这与其他语言类似。例如,在C ++中,您可以编写一个函数

int square(int input_number){ return input_number*input_number ; }

您可以通过说square(5)

来调用它

您对正在发生的事情的看法是自洽的,但这不是python或其他语言的工作方式。具体来说,你说该函数在一个名为number的存储桶中查找整数。

当你声明一个类似于你的例子中的函数时,你会说你所提供的任何值都将在内部被称为number。但是,有一种方法可以获得您期望的行为。在python中它看起来像这样:

def myfunction():
    print(some_value)

在这种情况下,some_value必须存在,并且在范围(或您调用的存储桶)中以该名称为人所知。所以,你需要这样做才能使这项工作:

def myfunction():
    print(some_value)
some_value=3
myfunction()

作为一个相反的例子,想象一下如果你想输入一个特定名称不知道的值,你会做类似

的事情。
def myfunction(a,b,c): 
    print(("a ",a," b ",b,"c ",c))
j=4
myfunction(1,j,5+2)
gives('a ', 1, ' b ', 4, 'c ', 7)

答案 1 :(得分:0)

factorial函数不知道在自己的代码块(缩进部分)之外发生了什么。将参数传递给它时,名称不会随之传递。所有函数都看到你已经传递了一个整数对象。函数声明中的括号的用途(本例中为(number))是为传递给函数的对象赋值。

简而言之,在函数外部,输入被称为user_input,它作为无名整数传递给函数,函数负责通过其定义为对象命名对象。

答案 2 :(得分:0)

这归结为namespaces.

您需要了解您所处的范围。在python中,范围由函数,类和模块分隔。在您的情况下,您首先需要了解功能范围。

如果我有这样的代码块:

def function1(var1):
    print var1

var1 = 'Variable 1'
function1(var1) #will print: Variable 1
function1('var1 is just for use inside the function') #will print: var1 is just for use...
print var1 #will print: Variable 1, because we never did any assignment outside of the function

它表明函数内部的var1不是函数外的var1。有名为globallocal的名称空间。要在任何时候查看每个范围中的变量,python有两个内置函数,名为globals()locals(),它们将显示所有变量及其值的字典(映射到值的名称)在您呼叫的范围内。