我正在努力学习Python中的练习41,而且我很难将我的大脑围绕这样一个事实,即整个事情都依赖于一个正在运行的函数,因为它被赋值为一个值一个变量。我写了一个小脚本来确认它是如何工作的,它确实:
def pants():
print "Put on some pants!"
def shorts():
print "And don't forget your underwear!"
zap = pants()
thing = shorts()
结果如下:
Put on some pants!
And don't forget your underwear!
很明显,这种情况发生了,但我无法理解为什么语言会这样运作 - 语言背后的逻辑是什么,使这成为一种有价值的操作方式。我认为对我来说理解为什么这是有帮助的,而不仅仅是“它的工作方式”。
为了清楚起见:我问(我猜)为什么函数正在运行,当我正在做的就是将它作为某个值的值。 print语句就在那里,所以我可以看到该函数确实正在运行。
事实上,我实际上并没有实际运行
裤子() 短裤()
这令我感到困惑。
要创建一个折磨人的类比,如果我在家烘焙饼干是“cookies()”,而我周六会做饼干,我可能最终会相信
星期六= cookies()
但只是想“嘿,星期六是饼干日”与实际烘焙饼干不一样......所以为什么只是说
星期六= cookies()
实际上是在烘烤饼干,而不是仅仅使用变量“cookies()”设置星期六以供以后使用?
答案 0 :(得分:16)
当您使用括号()
时,将调用该函数。如果要将该函数分配给变量以重复使用它,则应删除括号。
示例:
def pants():
print "Put on some pants!"
def shorts():
print "And don't forget your underwear!"
zap = pants
thing = shorts
然后当你想要调用这些函数时:
zap()
thing()
答案 1 :(得分:6)
很明显,这种情况发生了,但我无法理解为什么语言会这样运作 - 语言背后的逻辑是什么,使这成为一种有价值的操作方式。我认为这有助于我前进去理解为什么会这样,而不仅仅是“这就是它的工作方式。”
语言需要某种方式来区分函数和调用函数的行为。这就是括号提供的内容。
f = foo
现在f
绑定到函数本身。函数foo
可以由f()
执行。
f = foo()
这将调用函数foo
并将返回值绑定到f
。
请注意,是否将返回值绑定到名称是无关紧要的。只需写作
foo()
也将执行该函数,但返回值将被忽略。
答案 2 :(得分:5)
虽然看起来你的功能似乎没有返回任何东西,但实际上它们确实存在。引用the Python.org documentation:
return语句返回一个函数的值。不带表达式参数的return返回None。从函数末尾开始也会返回None。
所以你的功能看起来真的像这样:
def pants():
print "Put on some pants!"
return None
def shorts():
print "And don't forget your underwear!"
return None
您的作业分配给zap
无论pants
返回(即pants()
的值),还有thing
返回shorts
。在你的情况下,两者都是None
,但当然必须运行函数才能弄明白(*)。毕竟,pants
可能会在闰年期间返回42
,只要某个随机数生成器“滚动”6,shorts
就会返回'Foobar'
。
(*)题外话:“必须运行”这些功能不应被视为普遍适用。在pure setting中,除了Python的细节(我知之甚少)之外,编译器可能会发现两个函数都是None
相同的,并且在程序运行时不会调用跑。但是,打印某些东西(或检查当前年份是闰年,还是掷骰子)的功能并不纯粹。
答案 3 :(得分:2)
zap = pants()
会将函数的返回值绑定到变量,因此如果将函数绑定到变量,函数就会运行。
def foo():
return 1
var = foo()
print var
将打印1
。
我希望这会有所帮助。
编辑:如果您希望变量的值“加上一些裤子”,那么正如人们在评论中指出的那样,您确实会让print
和return
感到困惑。
答案 4 :(得分:1)
当解释器看到函数名后跟()时,它知道它应该执行该函数。
你在做什么就是说“将这些函数的结果分配给这些变量”。
但是,由于您没有从这些函数返回任何值,因此您没有在变量中看到任何内容。
但是因为你有一个print语句,你会看到解释器在尝试将变量赋值给该函数的结果时执行这些函数。
答案 5 :(得分:0)
由于名称后的括号:
,因此调用了您的函数zap = pants()
这会调用函数pants并将结果放入zap。如果你这样做了:
zap = pants
然后zap现在会引用裤子功能本身。
如果你刚写了
pants()
然后调用裤子函数,但结果(无)将永远不会被放入变量。
答案 6 :(得分:0)
根据您的问题,我认为您想要的内容zap
的值为"Put on some pants!"
,thing
的值为"And don't forget your underwear!"
。如果这是你的问题,那就让我们讨论吧。否则你不需要像我刚才所讨论的那样进一步阅读。
让它变得有趣。定义函数时,就像创建一个能够执行您希望的操作的计算机。现在让我们想想一台机器,当你给它一些食物时,它会砍掉它们......什么都不做!我的意思是我让那台机器切碎食物而不是别的!你不会把你的切碎的食物拿回来,但实际上它是在你做的时候切碎你的食物。
现在,当你想要切碎的食物回来时,你会创造另一台机器来取食物,切碎它们并将它们送回给你。硕果累累的机器,不是吗? ; - )
它们对于编程或数学中的函数都是正确的(虽然我不知道数学中的任何void函数!:P)。在创建函数时,您必须告诉它是否只是做了一些工作或做了一些工作并返回结果。告诉函数的方法是return
语句。在你的功能中,你刚刚告诉你要做点什么。这就是print "......"
功能也是如此。你在最后调用with()并完成他们的工作,他们打印它。但正如我所说,如果你不告诉它返回结果,它就不会。并且因为它没有返回任何结果,所以不会为变量分配任何内容(不要将他与None
混淆)。当您编写这些行(如果在解释器中)或运行脚本时,您将看到这些行已打印,但您的zap
和thing
没有值。
那么如何解决呢?告诉他们将这些行返回给变量。要告诉函数执行此操作,请将print
语句替换为return
语句。不要介意尝试你所知道的,知道你对你的知识的了解是真的: - )
希望它有所帮助: - )