我有以下脚本:
#!/usr/bin/env python
def bad_f1():
print 'foo'
return
def bad_f2():
print 'bar'
return
def bad_my_function(a, list_f, b):
print a
for i in list_f:
i
print b
return
bad_my_function('a', [bad_f1(), bad_f2()], 'b')
当我调用我的脚本时,我希望结果是:
a
foo
bar
b
但我得到了:
foo
bar
a
b
即使我在我的函数中先调用print a
,它也会在。{/ p>之后执行
不在一边:
def f1():
return 'foo'
def f2():
return 'bar'
def my_function(a, list_f, b):
print a
for i in list_f:
print i
print b
return
my_function('a', [f1(), f2()], 'b')
my_function(...)
给出预期的结果。
为什么bad_my_function(...)
会以这种奇怪的方式表现?这是我在列表中调用函数的方式吗?这与我打印'foo'
和'bar'
的方式有关吗?
答案 0 :(得分:5)
您的代码在将所有参数传递给它之前无法调用bad_my_function
。它通过调用bad_f1()
和bad_f2()
来获取其中一个参数,因此这些调用必须首先发生。
更简单的例子:
def foo(a,b,c):
print("foo")
def bar():
print("bar")
return 2
foo(1, bar(), 3)
这将在“foo”之前输出“bar”。怎么会这样呢?如果尚未调用foo
,那么您希望将b
作为其bar
参数的值传递给class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => new _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
List<String> widgetList = ['A', 'B', 'C'];
@override
Widget build(BuildContext context) {
var size = MediaQuery.of(context).size;
/*24 is for notification bar on Android*/
final double itemHeight = (size.height - kToolbarHeight - 24) / 2;
final double itemWidth = size.width / 2;
return new Scaffold(
appBar: new AppBar(
title: new Text(widget.title),
),
body: new Container(
child: new GridView.count(
crossAxisCount: 2,
childAspectRatio: (itemWidth / itemHeight),
controller: new ScrollController(keepScrollOffset: false),
shrinkWrap: true,
scrollDirection: Axis.vertical,
children: widgetList.map((String value) {
return new Container(
color: Colors.green,
margin: new EdgeInsets.all(1.0),
child: new Center(
child: new Text(
value,
style: new TextStyle(
fontSize: 50.0,
color: Colors.white,
),
),
),
);
}).toList(),
),
),
);
}
}
的确切内容是什么?
答案 1 :(得分:3)
当然,因为要评估
的论点my_function('a', [bad_f1(), bad_f2()], 'b')
python需要先调用bad_f1
和bad_f2
,print
。这是预期的。
另请注意,bad_f1
和bad_f2
订单可能存在歧义。好吧,因为列表参数是从左到右(Evaluation order in python list and tuple literals)
答案 2 :(得分:2)
编写代码的方式,bad_my_function()
无法在其参数列表中调用bad_f1()
和bad_f2()
之后执行。 bad_f1()
和bad_f2()
分别打印foo
和bar
,因此这两项操作将首先发生。
一旦发生这种情况,bad_my_function()
就可以执行,这会导致a
和b
被打印。
第二个代码块按预期工作的原因是因为它的执行顺序与第一个块相同,但它只返回foo
和bar
值,而不是打印它们 - 这是在my_function()
之后,print a
之后和print b
之前完成的。