为什么这个Python脚本没有按顺序执行?

时间:2018-01-23 20:44:27

标签: python

我有以下脚本:

#!/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'的方式有关吗?

3 个答案:

答案 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_f1bad_f2print。这是预期的。

另请注意,bad_f1bad_f2订单可能存在歧义。好吧,因为列表参数是从左到右(Evaluation order in python list and tuple literals

进行评估所以没有

答案 2 :(得分:2)

编写代码的方式,bad_my_function()无法在其参数列表中调用bad_f1()bad_f2()之后执行。 bad_f1()bad_f2()分别打印foobar,因此这两项操作将首先发生。

一旦发生这种情况,bad_my_function()就可以执行,这会导致ab被打印。

第二个代码块按预期工作的原因是因为它的执行顺序与第一个块相同,但它只返回foobar值,而不是打印它们 - 这是在my_function()之后,print a之后和print b之前完成的。