猿问

避免多个 IF 以确保 McCabe 复杂性

我想问你对以下场景的不同观点:假设我们有几个列表,应该为那些非空的列表执行一些操作:


if l1 or l2 or l3 or l4 or l5 or l6 or l7 or l8 or l9:


    print 'we have to do something in one or more lists'


    if l1:

        print 'l1'

        f1()


    if l2:

        print 'l2'

        f2()


    if l3:

        print 'l3'

        f3()


    if l4:

        print 'l4'

        f4()


    if l5:

        print 'l5'

        f5()


    if l6:

        print 'l6'

        f6()


    if l7:

        print 'l7'

        f7()


    if l8:

        print 'l8'

        f8()


    if l9:

        print 'l9'

        f9()

代码本身简单易懂,但这会为 McCabe 复杂性抛出 (12) 值。要降低此值,您将如何处理它?我很开放,很想听听你的想法。


萧十郎
浏览 148回答 2
2回答

UYOU

如果将所有列表放在列表列表中:lol = [l1,l2,l3,l4,l5,l6,l7,l8,l9]然后您可以遍历列表列表:for l in lol:    if l:        # do something

蝴蝶刀刀

使用列表列表和函数列表def f1(l1):   # do whatever is required to the  l1 listdef f2(l2):   # similarly# and similarly for f3 .. f9...lofl = [ l1, l2, l3, l4, l5, l6, l7, l8, l9 ]loff = [ f1, f2, f3, f4, f5, f6, f7, f8, f9 ]for f, l in zip( loff, lofl):    if l:  # if the functions f cannot themselves safely do nothing for a falsy argument        f( l) 希望所需的函数数量略小于九(在本例中)。您还可以轻松地向函数传递一个参数,因此函数可以是通用的,并告诉它在调用时要执行的变体操作for f, l, p in zip( loff, lofl, lofp): # or, zip( loff, lofl, list(range(9)) )    f(l, p)或者实际上,甚至将任意一组关键字参数传递给函数lofargs=[ { 'foo':1, 'bar':'Monty' }, # kwargs for f1          { 'foo':2, 'bar':'Python'},           { 'foo':3 },           {},                     # no kwargs at all for f4,           ...        ]for f, l, k in zip( loff, lofl, lofargs):    f( l, **k )
随时随地看视频慕课网APP

相关分类

Python
我要回答