Python 替换为;如果;根据参数在函数中执行不同的操作

Python 替换为;如果;根据参数在函数中执行不同的操作,python,function,arguments,Python,Function,Arguments,我试图根据传入的参数更改函数的行为。我正在考虑使用if语句,但我真的不想这样做。 例如: def BigPrime(numP,plist=[],x=1,计数器=0): 而len(plist)则可以使用函数列表或dict: def foo_0(x): while True: pass def foo_1(x): while x < 100: print('bar') x += 1 def foo_list(arg=0, x=

我试图根据传入的参数更改函数的行为。我正在考虑使用if语句,但我真的不想这样做。 例如:

def BigPrime(numP,plist=[],x=1,计数器=0):

而len(plist)则可以使用函数列表或dict:

def foo_0(x):
    while True:
        pass

def foo_1(x):
    while x < 100:
        print('bar')
        x += 1

def foo_list(arg=0, x=0):
    [foo_0, foo_1][arg](x)

def foo_dict(arg=0, x=0):
    {0: foo_0, 1: foo_1}[arg](x)
def foo_0(x):
尽管如此:
通过
def foo_1(x):
当x<100时:
打印('bar')
x+=1
def foo_列表(arg=0,x=0):
[foo_0,foo_1][arg](x)
def foo_dict(arg=0,x=0):
{0:foo_0,1:foo_1}[arg](x)

如果您的arg可能在[0,1]之外,则在索引列表或目录之前需要对其进行约束。

由于函数
foo
的行为在这两种情况下是完全不相关的,因此我认为
If
没有任何问题

由于您决定避免使用
if
语句,因此可以定义两个函数,并以您选择的任何其他方式在它们之间进行选择:

def foo(arg = 0, x = 0):
    def loop_forever():
        while True:
            pass
    def print_stuff():
        while x < 100:
            print('bar')
            x += 1
    # now, any of these:

    # if expression not if statement!
    print_stuff() if arg else loop_forever() 

    # what people did before the if expression
    # *but* you have to change print_stuff to return a true value
    arg and print_stuff() or loop_forever()

    # data-driven design, buzzword-compliant ;-)
    [loop_forever, print_stuff][bool(arg)]()

有一种可能的优化,即
plist[1://code>复制阵列,因此
itertools.islice(plist,1,None)
可能更好。

IMHO,需要此功能表明设计可能不好。通常,一项功能应实现一个明确的目标。如果需要两种不同的行为,则应将其作为完全不同的功能来实施

def block_script():
    while True:
        pass

def wait_and_spam(x = 0):
    while x < 100:
        print('bar')
        x+=1
最后,Python提供了类似于
getattr
的功能,允许根据函数名获取对函数的引用。可以在运行时构造名称

class Parser:

    def parse(self, source, initpos = 0):
        for token in self.lexer.get_tokens(source, initpos):
              # Call the state handler
              statemgr = getattr(self, "_s_"+self.state)
              statemgr(token)

    def _s_func_header(self, token):
        if token.name == "parenthesis_open":
            self.state = "function_arguments"
        # ...

    def _s_function_arguments(self, token):
        # ...

这正是它应该看起来的样子,我在那里放了一个“通行证”,因为整个代码太长,无法写下来,而且它不是Irrivent。。。我确实想知道的是,是否有某种奇怪的方法或“魔法”可以代替if语句来完成这一任务。:)
foo
arg
几乎不是它“应该”的样子:)无论如何,
if/else
在Python中是相当惯用的,即使是作为顶级条件,因为Python本身不支持模式匹配或函数保护。我可能会使用单独的函数来完成实际工作,甚至可能是嵌套函数。当然,代码可能会变得像。。需要。已编辑,现在有了真正的函数!:这个问题更适合我,我不知道。下次我会的,抱歉发垃圾邮件:)是的,我想我给了一个函数太多的目标。嗯,我试过了;)谢谢你详尽的回答。我担心我试图用一个函数做太多的事情。你在那里写的那些表达将非常有用!今天我学到了一些新东西,谢谢!我不知道all()表达式,还有更多的文档。谢谢你的见解!
def BigPrime(numP, plist = [], x = 1, counter =0):
    while len(plist) <= numP:
        if x in (1, 2, 5):
            plist.append(x)
        elif x % 2 != 0 and x % 5 != 0
            if all(x % div != 0 for div in plist[1:]):
                plist.append(x)
            counter += 1
        x += 1
    return plist, counter
def block_script():
    while True:
        pass

def wait_and_spam(x = 0):
    while x < 100:
        print('bar')
        x+=1
class Parser:

    def parse(self, source, initpos = 0):
        for token in self.lexer.get_tokens(source, initpos):
              # Call the state handler
              statemgr = getattr(self, "_s_"+self.state)
              statemgr(token)

    def _s_func_header(self, token):
        if token.name == "parenthesis_open":
            self.state = "function_arguments"
        # ...

    def _s_function_arguments(self, token):
        # ...