Python 我的教授错了吗?

Python 我的教授错了吗?,python,mapreduce,Python,Mapreduce,我正在解决一个问题,有件事把我弄糊涂了。在下面的代码中不是 counts = mapReduce(lines, mapper=computeWordCounts, reducer=sumUpWordCounts); 错了吗?这仅仅是一个伪代码还是这种用法实际上是可能的 def computeWordCounts(line): # TODO def sumUpWordCounts(word, counts): # TODO def mapReduce(data, mapper

我正在解决一个问题,有件事把我弄糊涂了。在下面的代码中不是

counts = mapReduce(lines, mapper=computeWordCounts, reducer=sumUpWordCounts);
错了吗?这仅仅是一个伪代码还是这种用法实际上是可能的

def computeWordCounts(line):
    # TODO

def sumUpWordCounts(word, counts):
    # TODO

def mapReduce(data, mapper, reducer):
    # TODO

def test():
    with open('/Users/bgedik/Desktop/zzz.txt') as f:
        lines  = f.read().splitlines()
    counts = mapReduce(lines, mapper=computeWordCounts, reducer=sumUpWordCounts);
    for word, count in counts:
        print word, " => ", count

这是完全正确的,它们被称为命名参数。它们是在函数的中间跳过任意参数的一种方法,并且仍然知道你实际上在发送哪些参数。
这种模式实际上非常普遍,从VB6到C#等等

在python中,函数和类是一等公民,您可以像传递任何其他变量一样传递它们

def square(a_var):
    return a_var ** 2

def apply(value,fn):
   return fn(value)

print apply(5,square)
您还可以重命名它们

sq = square
print sq(5)

还有很多,请参见文档

有什么问题?这当然有可能。你认为它有什么问题吗?不,没有错。。。。你的教授也是…不。。。他没有传递函数调用的结果。。。他正在传递一个函数。。。在python中,函数是第一类公民,可以随意传递或分配给变量,这可能有助于认识到像
computeWordCounts(line)
这样的函数调用实际上是python中的两个操作:
computeWordCounts
获取对函数的引用,
(…)
如果包含参数,则使用这些参数调用函数。如果不在它后面加括号,函数名就是对值的引用,就像
pi=3.14
name='Matilda'
一样。因此,您可以将该函数作为参数传递给另一个函数,该函数可以调用它(除此之外,它还允许您执行其他许多操作)。不,他对函数是否为一流公民感到困惑他们实际上不必为一流公民才能获得指针,看看C.哦,我知道,但是你只有一些特定类型的函数,有特殊的签名和铸造等等。。。。(python只是在用户看不见的情况下完成所有这些工作)。。。这更多的是说明命名的参数不是挂起的