栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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(),尽管它的形式极其骇人,并且应避免使用(除非您希望这些函数在模块名称空间中可用,在这种情况下也许很好…但是这种情况很少见,您可能宁愿先在子模块中定义这些函数,然后再对

frommysubmodule 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):        [pre goes here]

如果您的功能数量很少,您可以选择

['f1','f2','f3'][i]

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

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

而不是

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


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/610601.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号