Python的reduce()是如何工作的?函数循环和列表缩减的组合(Python,函数)

owfi6suc  于 2023-06-04  发布在  Python
关注(0)|答案(2)|浏览(211)

我自己在学习python,所以我不知道有谁可以寻求帮助或问我愚蠢的问题......我来这里就是为了这个。这里的问题:我在codewars上训练了一些kata,不能解决一个,所以我看到了解决方案,我甚至不知道这个代码是如何工作的!当然,我读过关于next()cycle()的文章,但为什么它们会在一起……我就是不明白。请你解释一下这个代码,它是如何工作的,为什么它是这样工作的。

from functools import reduce
from itertools import cycle

def reduce_by_rules(lst, rules):
  rs = cycle(rules)
  return reduce(lambda x, y: next(rs)(x, y), lst)
cqoc49vn

cqoc49vn1#

假设你有两个函数。下面的代码示例的输出是21
为什么
首先,x、y来自lst的第一、第二元素。在continue中,x来自函数的返回,y来自lst的元素。

  1. x=1y=2 -> one(1,2) -> 1+2+1 -> 4
  2. x=4y=3 -> two(4,3) -> 4+3+2 -> 9
  3. x=9y=4 -> one(9,4) -> 9+4+1 -> 14
  4. x=14y=5 -> two(14,5) -> 14+5+2 -> 21 -> return
from functools import reduce
from itertools import cycle

def one(x,y):
    return x+y+1
def two(x,y):
    return x+y+2

rules = [one, two]
lst = [1,2,3,4,5]

def reduce_by_rules(lst, rules):
    rs = cycle(rules)
    return reduce(lambda x, y: next(rs)(x, y), lst)
    # return two(one(two(one(1,2), 3), 4), 5)

print(reduce_by_rules(lst, rules))
# 21
pkln4tw6

pkln4tw62#

cycle(rules)只是一组重复的函数,例如:

def multiply(x,y):
   return x*y
def divide(x,y):
   return x/y

rules = (multiply, divide)
lst = [range(100)]

def reduce_by_rules(lst, rules):
  rs = cycle(rules) # -> multiply, divide, multiply, divide, ...repeats forever
  # reduce applies the function to each number and return a number reduce(foo, [1,2,3,4]) => foo(foo(foo(1,2),3),4) 
  return reduce(lambda x, y: next(rs)(x, y), lst)

reduce_by_rules(lst, rules)

如果它帮助lemme定义我自己的循环函数:

def my_cyle(lst):
   while True:
      for element in lst:
           yield element

我自己的reduce:

def my_reduce(function, lst):
   res = lst[0]
   for e in lst[1:]:
       res = function(res, e)
   return res

相关问题