Python:如何在循环中从`eval`调用`print`?
当我从 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)