0

我想让一些函数在“主要”或我的主要函数中运行。我想使用 function1() 作为我实际运行正在发生的事情的主要方式......即我运行我的脚本,然后使用 function1() 来实际使用我的脚本。

所以这是一个例子,它可能会让事情更清楚一点:

def move_ant(grid, ant_row, ant_col, orientation):

    orientation_and_colour_change(ant_row,ant_col,orientation)

    movement(ant_row,ant_col,orientation)

    return ant_row, ant_col, orientation

所以我想将 moveant() 与这 4 个变量输入一起使用,运行下面的两个函数,它们使用“主”函数中的一些输入日期,然后返回一个 3 元组,如返回行所示。

但是,有几件事:
我希望 2 个内部函数以该精确顺序运行。所以我在命令行中运行后move_ant(bla,bla,bla,bla),我想orientation_and_colour_change()先运行,然后再movement()运行。通过函数传递信息后唯一会改变的信息orientation_and_colour_change()是方向,所以我想确保movement()函数使用“更新”的方向。
那可能吗?

4

3 回答 3

1

函数运行的顺序几乎就是它的样子: orientation_and_colour_change()将在movement().

但是,您的参数值可能存在问题:ant_row, ant_col, orientation,因为您正在运行这些函数,但对它们的输出没有做任何事情。

那些内部函数不能影响ant_row, etc 的值,因为它们只影响自身内部的值,并且不会告诉外部函数新值,除非您明确保存和使用新值。不确切知道这两个内部函数是如何定义的,很难进一步提供帮助,但假设它们返回rowcol的新值,您可能需要这样的东西:

def move_ant(grid, ant_row, ant_col, orientation):

    new_row, new_col, new_orient = orientation_and_colour_change(ant_row,ant_col,orientation)

    newer_row, newer_col, newer_orient = movement(new_row,new_col,new_orient)

    return newer_row, newer_col, newer_orient
于 2013-09-04T23:56:40.850 回答
1

你完全可以做到!你的例子有点令人困惑,但我会尽量给你正确的示例代码:

#define you functions
def move_ant(grid,row,col,orientation):
    row,col,orientation = orientation_and_color_change(row,col,orientation)#run function and return values.

    row,col,orientation = movement(row,col,orientation)#run function and return changed vals

    return row,col,orientation

def orientation_and_color_change(changeRow,changeCol,changeOrientation):
    #do stuff with the variables you've inputted
    return changeRow,changeCol,changeOrientation

def movement(moveRow,moveCol,moveOrientation):
    #do stuff with variables
    return changeRow,changeCol,changeOrientation
#RUN THE FUNCTION
#not sure how you have you're vars set up
grid = [10,30]#random numbers! Yay!
row = 1
col = 1
orientation = 0
row,col,orientation = move_ant(grid,row,col,orientation)

不要忘记,不同函数中的变量只存在于该函数中。这称为变量的范围。查一下。这一点很重要。如果您希望函数更改外部变量,则必须将该变量作为参数传递给函数(为函数提供一条可以使用的信息),然后函数必须在最后返回该变量(该函数将其返回给外部参考)。

这就是为什么当我运行我的函数时,我将变量设置为等于函数:row,col,orientation = movement(row,col,orientation). 变量rowcolorientation被设置为分别收集和保存函数在 return 语句中返回的任何信息:return changeRow,changeCol,changeOrientation

这有意义吗?还是我完全错过了重点?

于 2013-09-04T23:58:08.497 回答
0

考虑下面的代码。

def inner1(p):
    p.append(1)
def inner2(p):
    p += 1
def inner3(p):
    p = p + [1]
def outer(f, p):
    f(p)
    print p
outer(inner1, [0])
outer(inner2, 0)
outer(inner3, [0])

输出是

[0, 1]
0
[0]

此示例代码表明,当内部函数将可变对象的更改为列表 p 时,该更改是永久性的。但是如果内部函数只是将一个新对象重新分配给参数p,则效果仅限于内部函数内部,因为变量的范围。该语句只是将一个不可变的 int 对象(比原始对象大 1)重新分配给变量 p。for list 也是一个重新赋值。 p.append(1)p += 1p = p + [1]

于 2013-09-05T00:42:12.020 回答