我试图理解python中的多个函数调用,但有点困惑。
例如,如果有两个名为Work
和Play
的字符串变量,我写了多个函数调用,如:
Work.find(Play.strip().split()[0])
这是否意味着
或者是否意味着
或者Python在编写时执行call()函数吗?
感谢您的帮助
答案 0 :(得分:4)
在Play上调用strip(),在其上调用split(),并将split split中的第一个返回值作为参数传递给Work上的find()调用。
将括号中的内容想象成一个传递给find()调用的表达式。我们可以扩展此代码:
Work.find(Play.strip().split()[0])
成为:
strip_result = Play.strip()
split_result = strip_result.split()
argu = split_result[0]
Work.find(argu)
第一个代码位更紧凑,但第二个代码位更易读。您应该检查PEP 8和您自己的偏好以确定使用哪个。
答案 1 :(得分:1)
这
这是否意味着1.Call到方法条带使用Play,2。使用上面的1的结果来调用方法,3。从上面的2的结果中提取第一个元素,4.Call到方法查找使用上面3的结果
答案 2 :(得分:1)
如果你有多个函数调用,那么你应该从左到右阅读它们,并将下一个函数调用应用到上一个创建的对象。
所以你帖子中的以下内容是正确的:
这是否意味着1.Call to方法条使用Play,2.Call to 方法使用上面的1中的结果进行拆分,3。从中提取第一个元素 上面2的结果,4。使用上面3中的结果来查找方法。
答案 3 :(得分:1)
此:
Work.find(Play.strip().split()[0])
......就是相当于:
tmp1 = Play.strip()
tmp2 = tmp1.split()
tmp3 = tmp2[0]
Work.find(tmp3)
Python会在调用附加()
的函数之前执行()
内的所有内容。在()
内,它从左到右评估代码。
答案 4 :(得分:1)
代码方法,就像数学一样,遵循“首先在括号内做东西”的标准对象,例如,如果你这样做:
x = sin(1+5)
您希望1+5
首先发生,然后sin(6)
,其中6
是内部操作1+5
的结果。完全相同的原则:
Work.find(Play.strip().split()[0])
首先评估内部表达式Play.strip().split()[0]
,然后调用操作Work.find
,并将内部表达式的结果作为参数。
内部操作再次从左到右调用,就像数学一样,所以
Play.strip().split()[0]
首先执行Play.strip()
然后对r.split()
的结果进行r[0]
,然后执行结果r
(其中dis
是最后一部分的结果)
请注意,如果您真的想要绝对不同的答案,那么>>> import dis
>>> dis.dis(compile("Work.find(Play.strip().split()[0])","<example>","eval"))
1 0 LOAD_NAME 0 (Work)
3 LOAD_ATTR 1 (find)
6 LOAD_NAME 2 (Play)
9 LOAD_ATTR 3 (strip)
12 CALL_FUNCTION 0 (0 positional, 0 keyword pair)
15 LOAD_ATTR 4 (split)
18 CALL_FUNCTION 0 (0 positional, 0 keyword pair)
21 LOAD_CONST 0 (0)
24 BINARY_SUBSCR
25 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
28 RETURN_VALUE
会汇集代码:
CALL_FUNCTION
好吧也许这会让人感到困惑然后有用......
但是您可以看到前两个.strip()
没有参数,因此您可以扣除.split()
然后调用CALL_FUNCTION
以及使用一个调用的最后一个Work.Play(<expression>)
位置是$(function ()
{
$('form#fos_user_registration_form').submit(function (e) {
e.preventDefault();
var $this = $(e.currentTarget);
inputs = {};
// Send all form's inputs
$.each($this.find('input'), function (i, item) {
var $item = $(item);
inputs[$item.attr('name')] = $item.val();
});
// Send form into ajax
$.ajax({
url: $this.attr('action'),
type: 'POST',
dataType: 'json',
data: inputs,
success: function (data) {
if (data.has_error) {
// Insert your error process
alert('WRONG');
}
else {
// Insert your success process
alert('check your email!');
}
}
});
});
});
。
答案 5 :(得分:0)
电话订单是(为清晰起见而添加的中间变量名称):
Play.strip()
(x)x.split()
被称为(y)y[0]
(z)Work.find(z)