Python 与函数参数混淆以及为什么不需要按其名称调用参数

Python 与函数参数混淆以及为什么不需要按其名称调用参数,python,function,parameters,scope,Python,Function,Parameters,Scope,首先,我使用的是Python3 我正在阅读Khanacademy关于函数的Python教程: 代码如下: 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: ")) fact

首先,我使用的是Python3

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

代码如下:

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命名参数number。但随后,数字就消失了

最初,在函数教程之前,用户输入被命名为数字,然后是一个打印(数字)。你得到输入,称它为数字,然后打印数字,这很有意义,因为它很好而且一致

不幸的是,现在对我来说,这种一致性被打破了。如何更改使变量名不同于参数名并使其工作?因为一致性被破坏了,我想它会爆炸。在我看来,我是这样看待它的:函数在一个名为number的桶中查找整数。如果你不给它一个精确的整数,它就是不起作用-有点像把一个圆钉子插入一个矩形


Python使用了什么魔法来发现用户输入数字是同一件事?

数字是
阶乘
函数的名称,这就是所有语法的意思:输入一个参数,在
阶乘
函数中它被称为名称。名称
user\u输入
不相关,您也可以编写
阶乘(5)

这在其他语言中是类似的。例如,在C++中,你可以编写函数

int square(int input_number){ return input_number*input_number ; }
你可以这样称呼它:
square(5)

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

当您声明一个类似于示例中的函数时,您会说您输入的任何值都将在内部被称为
number
。然而,有一种方法可以达到你所期望的行为。在python中,它如下所示:

def myfunction():
    print(some_value)
在这种情况下,
某些_值必须存在,并且在作用域(或您称之为bucket)中以该名称为人所知。因此,您需要这样做才能使其工作:

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)

factorial
函数对自身代码块(缩进部分)之外发生的事情一无所知。当您向其中传递参数时,名称不会随参数一起传递。函数所看到的只是在中传递了一个integer对象。函数声明中括号(
(本例中为数字)
)的目的是为传递到函数中的对象指定名称

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

这归结为

您需要了解您所处的范围。在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。有称为
global
local
的名称空间。为了随时查看这些作用域中的每个变量,python有两个内置函数,分别称为
globals()
locals()
,它们将向您显示一个字典(名称映射到值),其中包含您调用的作用域中的所有变量及其值。

我想这对您来说更像是一个概念问题?如果是的话,。这当然不是Python特有的。@jro-非常好的查找。非常感谢。这帮了大忙。我理解这些东西很慢,所以我一遍又一遍地阅读,试图慢慢地处理它。对不起,我还是不明白。说到这件事,我处于最基本的层次。我不知道该怎么做C++实例。你说,“你输入一个参数,里面的阶乘叫做名字…”你是说数字吗?还有,我在想,为什么一开始就必须在参数点上有一些东西?你为什么不能把它留白呢?就我个人而言,这对我来说更有意义。接下来,我为什么不休息一下呢?