我在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