为什么foo = function()在Python中运行该函数?

Jea*_*ius 7 python variables function

我正在努力学习Python中的练习41,而且我很难绕过这样一个事实:整个事情都依赖于一个正在运行的函数,因为它被赋值为变量的值.我写了一个小脚本来确认它是如何工作的,它确实:

def pants():
    print "Put on some pants!"

def shorts():
    print "And don't forget your underwear!"

zap = pants()
thing = shorts()
Run Code Online (Sandbox Code Playgroud)

结果如下:

Put on some pants!
And don't forget your underwear! 
Run Code Online (Sandbox Code Playgroud)

显然这种情况发生了,但我无法理解为什么语言会这样运作 - 语言背后的逻辑是什么,使得这种语言成为一种有价值的操作方式.我认为这对我来说是有帮助的,可以理解为什么会这样,而不仅仅是"这就是它的工作方式".

为清楚起见:我问(我猜)为什么函数正在运行,当我正在做的就是将它作为某个值赋值.print语句就在那里,所以我可以看到该函数确实正在运行.

事实上,我实际上并没有真正跑步

裤子()短裤()

那令我困惑.

要制作一个折磨人的比喻,如果我在家烘焙饼干是"cookies()",而我周六要做饼干,我可能最终会相信

星期六=饼干()

但只是想"嘿,周六是饼干日"与实际烘焙饼干不一样......所以为什么只是说

星期六=饼干()

实际上烘焙饼干,而不是仅仅使用变量"cookies()"设置星期六以供以后使用?

El *_*rto 16

当您使用括号时(),函数将被调用.如果要将该函数分配给变量以重复使用它,则应删除括号.

例:

def pants():
    print "Put on some pants!"

def shorts():
    print "And don't forget your underwear!"

zap = pants
thing = shorts
Run Code Online (Sandbox Code Playgroud)

然后当你想调用这些函数时:

zap()
thing()
Run Code Online (Sandbox Code Playgroud)


Dav*_*nan 6

显然这种情况发生了,但我无法理解为什么语言会这样运作 - 语言背后的逻辑是什么,使得这种语言成为一种有价值的操作方式.我认为这对我来说是有帮助的,可以理解为什么会这样,而不仅仅是"这就是它的工作方式".

语言需要某种方式来区分函数和调用函数的行为.这就是括号提供的内容.

f = foo
Run Code Online (Sandbox Code Playgroud)

现在f必然是功能本身.该功能foo可以通过执行f().

f = foo()
Run Code Online (Sandbox Code Playgroud)

这会调用函数foo并将返回值绑定到f.

请注意,无论是否将返回值绑定到名称都无关紧要.简单写作

foo()
Run Code Online (Sandbox Code Playgroud)

也将执行该函数,但返回值将被忽略.


gsp*_*spr 5

虽然看起来你的功能似乎没有返回任何东西,但实际上它们确实存在.引用Python.org文档:

return语句返回一个函数的值.不带表达式参数的return返回None.从函数末尾掉落也会返回None.

所以你的功能看起来像这样:

def pants():
    print "Put on some pants!"
    return None

def shorts():
    print "And don't forget your underwear!"
    return None
Run Code Online (Sandbox Code Playgroud)

你的作业分配给zap任何pants回报(即价值pants())和thing任何shorts回报.在你的情况下,两者都是None,但当然必须运行函数才能弄明白(*).毕竟,这可能是因为pants回报42在闰年,而且shorts回报'Foobar'每当一些随机数生成器"卷" 6.


(*)题外话:"必须运行"这些功能不应被视为普遍适用.在纯粹的环境中,除了Python的细节(我知之甚少)之外,编译器可能会意识到两个函数是相同的None,并且在程序运行时不会导致调用.但是,打印某些东西(或检查当前年份是闰年,还是掷骰子)的功能并不纯粹.