在另一个内部运行一对功能

时间:2013-09-04 23:33:15

标签: python function

我想在'primary'或main函数中运行一些函数。我想使用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

所以我想使用带有这4个变量输入的moveant(),运行下面的两个函数,它们使用'primary'函数中的一些输入日期,然后返回一个3元组,如返回行中所示

然而,有几件事:
我希望2个内部函数以精确的顺​​序运行。因此,在命令行move_ant(bla,bla,bla,bla)中运行后,我希望首先运行orientation_and_colour_change(),然后运行movement()。在通过orientation_and_colour_change()功能传递信息后,唯一会改变的信息将是方向,因此我想确保movement()功能正在使用'已更新'方向。
这可能吗?

3 个答案:

答案 0 :(得分:1)

函数的运行顺序几乎就是它的外观:orientation_and_colour_change()将在movement()之前运行。

但是,您的参数值可能有问题:ant_rowant_colorientation,因为您正在运行这些函数但对其输出不执行任何操作。

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

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

答案 1 :(得分: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

这有意义吗?还是我完全忽略了这一点?

答案 2 :(得分: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.append(1)到列表p,更改是永久性的。但是,如果内部函数仅将新对象重新分配给参数p,则效果仅限于内部函数内部,因为变量的范围。语句p += 1只是将一个不可变的int对象(比原始对象大1)重新分配给变量p。 p = p + [1]列表也是一个重新分配。