当前位置: 首页 > 面试题库 >

在Python中按数组索引调用函数

马丰
2023-03-14
问题内容

我在Python out1,out2,out3等中有很多函数,并且想基于传入的整数来调用它们。

def arryofPointersToFns (value):
     #call outn where n = value

是否有捷径可寻?


问题答案:

tl; dr:编写out(n)函数而不是,out1(), out2(), ..., outN()并且不要理会此hack。

我无法想象在实际情况中会出现这个问题的合理情况。请重新考虑问题的体系结构;可能会有一个更好的方法(因为将它们存储在列表中意味着除索引外,函数没有其他意义;例如,我只能想象如果要创建该函数,则可以这样做)一堆动态生成的thunk,它们的时间顺序很重要,或者类似。尤其是正在阅读此答案的任何新手用户,都可以考虑制作一个可以处理所有内容的更通用的功能,或者将更多的标识信息与每个功能相关联,或者将其作为类的一部分进行粘贴等。

就是说,这就是你要怎么做。

myFuncs = [f0,f1,f2]
myFuncs[2](...) #calls f2

要么

myFuncs = {'alice':f1, 'bob':f2}
myFuncs['alice'](...) #calls f1

这只是一步中的以下两个步骤:

myFuncs = [f0,f1,f2]
f = myFuncs[i]
f(...) #calls fi

或者,如果您没有上述OP所述的函数“
myFunc”的注册表,则可以使用globals(),尽管它的形式极其骇人,并且应避免使用(除非您希望这些函数在模块名称空间中可用,在这种情况下也许很好…但是这种情况很少见,您可能宁愿先在子模块中定义这些函数,然后再对from mysubmodule import *它们进行定义,而后者又会有些皱眉):

def fN(n):
    return globals()['f'+str(n)]

def f2():
    print("2 was called!")

fN(2)(...) #calls f2

这是另外两个想法(接受答案后再添加两个想法):

您还可以这样创建一个装饰器:

>>> def makeRegistrar():
...     registry = {}
...     def registrar(func):
...         registry[func.__name__] = func
...         return func  # normally a decorator returns a wrapped function, 
...                      # but here we return func unmodified, after registering it
...     registrar.all = registry
...     return registrar

并像这样使用它:

>>> reg = makeRegistrar()
>>> @reg
... def f1(a):
...  return a+1
... 
>>> @reg
... def f2(a,b):
...  return a+b
... 
>>> reg.all
{'f1': <function f1 at 0x7fc24c381958>, 'f2': <function f2 at 0x7fc24c3819e0>}

那么您可以调用reg.all [‘f1’]。您可以调整reg装饰器以跟踪索引并执行以下操作:

registry = []
index = int(re.regextofindthenumber(func.__name__))
if not index==len(registry):
    raise Exception('Expected def f{} but got def f{}')
else:
    registry[index] = func

另外,为了避免globals(),您可以定义一个类:

class Funcs(object):
    def f1():
        ...
    def f2():
        ...
    def num(n):
        [code goes here]

如果您的功能数量很少,您可以选择['f1','f2','f3'][i]

当然,如果没有更多的信息,所有这些建议都只会忽略真正的问题:这种情况永远都不会出现,并且可能表示存在严重的体系结构缺陷,而您可能希望有一些东西(使用示例),例如:

# a possibly-better world
def out(n):
    # output to N, whatever that means

而不是

# what you have now
def out1():
    # output to 1
def out2():
    # output to 2
def outN(n):
    # ???


 类似资料:
  • 问题内容: 在某些语言中,可以使用特殊的保留字(例如 ref 或 val) 通过引用或值传递参数。当您将参数传递给Python函数时,它永远不会在离开函数时更改参数的值。唯一的方法是使用 全局 保留字(或据我目前的了解)。 范例1: 会显示 显示k为不变 在此示例中,变量n从不更改 范例2: 在此示例中,变量n已更改 Python中有什么方法可以调用函数并告诉Python 该参数 是 值 还是 引

  • C++ 用三种方式向函数传递数值:按值调用(call-by-value)、用引用参数按引用调用(call-by-reference reference argument)和用指针参数按引用调用(call-by-reference pointer argument)。第3章比较了按引用调用与按值调用,本章主要介绍用指针参数按引用调用。 第3章曾介绍过,return 可以从被调用函数向调用者返回一个值

  • 在将数组传递给java中的函数然后将其分配给新数组时,我得到了相同的旧数组。 当传递数组处理传递对该数组的引用时,为什么会这样?

  • 问题内容: 我有一系列元素。我还有一个IndexSet,它指定需要将数组的哪些索引提取到新数组中。例如: 我正在寻找使用swift 函数的方法,但是还没有答案。我怎样才能做到这一点? 问题答案: 是递增整数的集合,因此可以 将 每个索引 映射 到相应的数组元素: 假定所有索引对于给定数组均有效。如果不能保证,则可以过滤索引(如@dfri正确标记):

  • 问题内容: 假设我有一个带有任意值的矩阵A: 矩阵B包含A中元素的索引: 我该如何选择值一个指向由乙,即: 问题答案: 你可以使用 一个人也可以使用 样品运行

  • 问题内容: 我在AutoIt网站上找不到COM版本。隐藏在某个地方吗?我怎么才能得到它? 问题答案: 在Python中使用AutoIt的方法有两种: pyautoit模块 适用于Windows扩展的python(pywin32) pyautoit模块将使用DLL,而pywin32我们可以使用COM。据我所知,两者之间在功能上没有区别。 先决条件 python的安装。 AutoIt的安装。 pyau