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

3
当我从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


哪个版本的Python?除非我弄错了,否则在Python 3中,打印语法是不同的。 - Marcin
6
你为什么要使用 eval? - Gerrat
这是哪个版本的Python? - Mike Axiak
@Gerrat:我正在使用eval,因为我想要替换格式规范。请看Format = 字符串。 - Adobe
2
@Adobe:这不是使用eval的好方法(可用性不高)。你可以直接将“Format”替换为你的字符串。没有必要对其进行eval操作。 - Gerrat
4个回答

16

你不能使用eval()来执行printeval()用于求值表达式,而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)

4
你甚至不需要构建 str_formatprint "{0:0{1}}".format(i, maxDigits) 就可以正常工作。 - Sven Marnach
有趣的是,虽然我先发表了评论,但你的评论得到的投票比我的回答还要高 :p - Gandaro
@Gandaro - 我也给你点赞(你也是),因为这种嵌套对我来说是新的。 - eumiro

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]

1
简单来说,就是将格式与使用分开构建。避免使用eval()函数。
    format =  "#{0:" + Format + "}"
    print format.format(i+1), myList[i]

不要把事情搞得比必须的更难。这里有另一个版本,一步构建格式。

    format = '#{{0:0{0}d}}'.format(maxDigits)
    print format.format(i+1), myList[i]

数值错误:无效的转换规范 - Gandaro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接