Python - 为变量分配函数

时间:2015-08-21 16:02:01

标签: python

我有一个元组列表

student_tuples = [
    ('john', 'A', 15),
    ('jane', 'B', 12),
    ('dave', 'B', 10),
]

我一直在尝试使用itemgetter和lambda函数对它进行排序。可以使用itemgetting和lambda函数对元组的两个索引进行排序,但它必须返回一个元组。我似乎无法在文档中找到关键函数在元组上工作的任何地方。

无论如何,我想知道itemgetter()实际返回什么,所以这是有效的(从itemgetter文档中复制):

f = itemgetter(1)
print f(student_tuples[0])
----->A

有没有办法做到这一点而不必将itemgetter重新分配给变量?它看起来像是传递了两个参数,但类似

print itemgetter(1, student_tuples[0])
-----><operator.itemgetter object at 0xf7309c8c>

没有给我任何有用的东西。

我只是在努力学习Python,这让我感到困惑。我不知道itemgetter中的student_tuples [0]被添加为参数。

2 个答案:

答案 0 :(得分:3)

itemgetter(1)的返回值是一个函数(实际上是一个可调用对象,但它像函数一样使用)。

它返回的函数大致相当于表达式产生的函数:

lambda x: x[1]

student_tuples[0]未在itemgetter中的任何位置添加为参数。当您调用f(student_tuples[0])时,它将作为参数传递给返回的函数。

由于fitemgetter(1)的结果,因此您可以在一行中执行以下操作:

itemgetter(1)(student_tuples[0])

答案 1 :(得分:2)

您需要再次调用itemgetter()的返回值,而不是作为第二个参数传入列表。示例 -

itemgetter(1)(student_tuples[0])

从文档中可以看出 -

  

<强> operator.itemgetter(*项目)

     

返回一个可调用对象,该对象使用操作数的__getitem__()方法从其操作数中获取项。

itemgetter()返回一个函数,您可以再次调用实际的iterable中的函数来获取该iterable中该特定索引的值。

当您将多个值传递给itemgetter()时,它仍然会返回一个函数,并且调用该函数会尝试使用您最初作为传递给itemgetter()的索引从迭代中获取元素元组。示例 -

>>> l =[1,2,3,4,5]
>>> operator.itemgetter(1,2,4)(l)
(2, 3, 5)