了解Python代码的执行流程

时间:2015-12-11 23:08:46

标签: python

我正在尝试使用来自数据操作的数字操作与Cthon的系统和算法进行家庭分配。一般来说,我在理解基本代码方面存在问题,而基本代码是作为MapReduce alogorythm的一个例子而呈现的。我将很高兴帮助我在2个地方了解它,详情如下。

我厌倦了在运行命令后逐步执行以下两个文件的代码流程:

python wordcount.py 'data/books.json'
  1. 文件wordcount.py已打开
  2. mr = MapReduce.MapReduce() - 我创建了对象
  3. 来自def __init__(self):
  4. MapReduce.py部分是 执行
  5. 我们回到wordcount.py
  6. 创建函数def mapper(record):def reducer(key,list_of_values):但暂时不执行
  7. Python转到if __name__ == '__main__':
  8. `inputdata = open(sys.argv [1]) - 将json文件分配给a 变量
  9. mr.execute(inputdata, mapper, reducer) - 从MapReduce.py调用该函数。
  10. 这是我的第一个问题,到目前为止我们还没有定义映射器或reducer变量/对象。它只是null /没有传递给这个函数的值,或者我们之前以某种方式定义了这个变量但我错过了这个?

    1. 后来我搬到了def execute(self, data, mapper, reducer): MapReduce.py
    2. 我们有mapper(record)
    3. 所以这是对wordcount.py中函数的引用,对不对?但是如果我们在不同的文件中引用一个函数,我们不应该在文件的开头使用import并定义这个函数来自哪个文件?

      (...)进一步执行代码

      wordcount.py文件:

      import MapReduce
      import sys
      
      """
      Word Count Example in the Simple Python MapReduce Framework
      """
      
      mr = MapReduce.MapReduce()
      
      # =============================
      # Do not modify above this line
      
      def mapper(record):
          # key: document identifier
          # value: document contents
          key = record[0]
          value = record[1]
          words = value.split()
          for w in words:
            mr.emit_intermediate(w, 1)
      
      def reducer(key, list_of_values):
          # key: word
          # value: list of occurrence counts
          total = 0
          for v in list_of_values:
            total += v
          mr.emit((key, total))
      
      # Do not modify below this line
      # =============================
      if __name__ == '__main__':
        inputdata = open(sys.argv[1])
        mr.execute(inputdata, mapper, reducer)
      

      MapReduce.py文件:

      import json
      
      class MapReduce:
          def __init__(self):
              self.intermediate = {}
              self.result = []
      
          def emit_intermediate(self, key, value):
              self.intermediate.setdefault(key, [])
              self.intermediate[key].append(value)
      
          def emit(self, value):
              self.result.append(value) 
      
          def execute(self, data, mapper, reducer):
              for line in data:
                  record = json.loads(line)
                  mapper(record)
      
              for key in self.intermediate:
                  reducer(key, self.intermediate[key])
      
              #jenc = json.JSONEncoder(encoding='latin-1')
              jenc = json.JSONEncoder()
              for item in self.result:
                  print jenc.encode(item)
      

      提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

在python中,一切都是一个对象,包括函数,所以你可以将一个functionA作为参数传递给另一个函数B(或类或任何时候),如果functionB希望你这样做,它会假设你给它一个与正确的公司合作,并按正常方式进行。

在你的情况下

mapper

此处reducerexecute是先前定义的函数,它们作为参数传递给类mr的实例MapReduce的方法map并且如您所见,所述方法将其用作预期的功能。

感谢你,你可以像代码所示那样制作一些通用代码,通过给用户提供他/她自己的功能的选项,可以通过许多应用程序以类似的方式使用某些微积分。

一个更为通用的例子是函数php artisan generate:seed Houses ,这个函数接收一个函数做某事,映射不关心它做什么或它来自何处,只接收与地图自己接收(其他说功能)并返回一个值来构建一个包含结果的新列表。