Python:如何在循环中从`eval`调用`print`?

3 投票
4 回答
9616 浏览
提问于 2025-04-17 13:10

当我从 eval 调用 print 时:

def printList(myList):
    maxDigits = len(str(len(myList)))
    Format = '0{0}d'.format(maxDigits)
    for i in myList:
        eval('print "#{0:' + Format + '}".format(i+1), myList[i]')

它给出了一个错误:

    print "#{0:01d}".format(i+1), myList[i]
        ^
SyntaxError: invalid syntax

我试着利用 这个,并重新写了代码:

def printList(myList):
    maxDigits = len(str(len(myList)))
    Format = '0{0}d'.format(maxDigits)
    for i in myList:
        obj = compile(src, '', 'exec')
        eval('print "#{0:' + Format + '}".format(i+1), myList[i]')

但是这对 i 提出了问题:

NameError: name 'i' is not defined

附注:我正在使用 python2.6

4 个回答

3

为了让你的代码更简洁、更容易理解,同时又能保留原有的功能:

def printList(myList):
    # int(math.log10(len(myList))+1) would be the appropriate way to do that:
    maxDigits = len(str(len(myList)))
    for i in myList:
        print "#{0:0{1}d}".format(i+1, maxDigits), myList[i]
16

你不能用 eval() 来执行 print,因为 eval() 是用来计算表达式的,而 print 是一个语句。如果你想执行一个语句,应该用 exec()。想了解更多,可以查看 这个问题,里面有更详细的解释。

>>> exec('print "hello world"')
hello world

另外,如果你想在 exec 中使用变量 i,可以传入你的 locals() 变量。

>>> i = 1
>>> exec('print "hello world", i', locals())
hello world 1

还有,在你最后写的测试中,你是用 'exec' 模式来编译的,这应该给你一些提示 :)

8

你不需要使用eval:

def printList(myList):
    maxDigits = len(str(len(myList)))
    str_format = '#{0:0' + str(maxDigits) + '}'
    for i, elem in enumerate(myList, 1):
        print str_format.format(i), elem

或者,正如@SvenMarnach提到的,你可以把格式化的参数也放在一个格式化的调用里:

def printList(myList):
    maxDigits = len(str(len(myList)))
    for i, elem in enumerate(myList, 1):
        print '#{1:0{0}} {2}'.format(maxDigits, i, elem)

撰写回答