2013-06-28 39 views
1

在Python 2.7中,为什么不是print(*[1,2])工作?这是不是意味着print(1,2)如何在Python 2.7中的函数调用中使用splat

更具体到我的情况:

import numpy as np 
n = np.array([1,2,3,4]) % create and manipulate numpy array 
print(*n.tolist()) % print results 

如果图示功能的工作,我的下一个问题是:

  1. 是否在颠簸的阵列工作?
  2. 操作顺序是什么?即是先执行tolist()还是splat?

...(感谢您的快速响应)。我会接受print()不是函数,但是csv.writer.writerow

让我们得到更具体:

import numpy as np 
import csv 
n = np.array([1,2,3,4])   # create and manipulate numpy array 
print(*n.tolist())    # print results 
flName = 'C:\Users\Joe\test.csv' 
fl = open(flName, 'wb') 
writer = csv.writer(fl) 
writer.writerow(*n.toList())  # ERROR with splat 
fl.close() 

现在我不知道是什么,不被认为是功能?

+0

“Splat”你可爱的名字崩溃/一些调试器/ IDE做到这一点? –

+2

@NickT这是运营商的正式名称。查看它,或尝试一下(当然有一个实际的功能)。 – Marcin

+1

如果你使用的是Python 2,print(* n.tolist())不会抛出错误?另外,'writerow'需要一个字段列表,所以你可以删除这个splat,它会工作得很好。 – Blender

回答

0

这将意味着print(1,2)如果print是一个函数。这不是 - 这是一个声明。这种情况下的(1,2)实际上只是一个元组,而不是函数调用。

就你而言,你不需要摔打,因为打印不是一个功能。

您不能在功能调用之外摔打。

1

在Python 2中,print是一个语句,而不是一个函数,所以它实际上没有任何参数。当你“打电话”print(1, 2),你实际上正在打印元组(1, 2)

你需要以解压缩参数的函数,所以进口的Python 3的在文件的最顶端print功能:

from __future__ import print_function 
+0

正确,但他根本不需要解开参数,因为它不是一个函数。 – Marcin

+0

@Marcin:这就是为什么我建议'__future__'导入,它将'print'变成函数。 – Blender

+0

这是不必要的,因为他不需要摔打,因为它不是一个功能。 – Marcin

1

功能

csv.writer(fl).writerow() 

将列表作为其论据。所以,

writer.writerow(*n.toList()) 

将尝试发送列表的每个元素作为参数,在这种情况下,4。什么工作原理是:

writer.writerow(n.toList()) 

然而,当我试图做的事:被抛出

writer.writerow((5,*n.toList())) 

语法错误。根据“How can I get the concatenation of two lists in Python without modifying either one?”,这不是应该如何做的。修正后的版本是:

writer.writerow([5]+n.toList()) 

对于写道:“5,1,2,3,4”的输出文件。

相关问题