如何在函数式编程中用于循环?

时间:2019-01-02 02:05:52

标签: python python-3.x

晚上好,我想请社区提供帮助以了解以下内容, 我一直在尝试使用函数式编程方法,并且发现了诸如map () reduce () filter ()之类的基本功能,但是我想知道的是{{1} }在函数式编程中。

例如,在这段代码中,我必须执行多次循环才能找到结果:

for cycles

基本上,我不知道在这种情况下适用什么,它是test = {'one':1,'two':{'two-two':{'two-two-two':222,'three-three-three':333}},'three':3} for i in test.items(): if i[0]=="two": for s in i[1].items(): if s[0] == "two-two": for a in s[1].items(): print(a[1]) map ()还是我希望您能帮助我的其他东西

2 个答案:

答案 0 :(得分:1)

我明白了,这里您使用了函数式编程术语来介绍 map() filter() reduce()在您的代码中,但是在这种情况下您不应该在这里使用它,因为函数式编程是指通过使用函数(模块化设计)来实现您的问题。

在您的情况下,您不能使用 filter() reduce()来获得预期的结果,因为这些函数不能为您提供灵活的方法来控制程序的控制。

您可以尝试这样的操作,但我不希望您使用它,如果在 map()的情况下不满足条件,则可能会 。使用 filter() / reduce()没有意义。

  

在这里,我试图使其按预期工作。

>>> def f(tup):
...     items = []
...     if tup[0] == 'two':
...         for s in tup[1].items():
...             if s[0] == "two-two":
...                 for a in s[1].items():
...                     print(a[1])
...                     items.append(a[1])
...         return items
...     else:
...         return None
...
>>> test
{'one': 1, 'two': {'two-two': {'two-two-two': 222, 'three-three-three': 333}},
'three': 3}
>>>
>>> out = list(map(f, test.items()))
222
333
>>> out
[None, [222, 333], None]
>>>
>>> out[1]
[222, 333]
>>>

map() filter()通常用于处理可迭代项,例如列表,元组,字典,集合等,并通过对项目执行操作来生成另一个可迭代项。 filter()允许我们过滤数据(从列表中选择偶数)。

reduce()通常用于处理可迭代并将其减少为单个值(例如,获取数字列表的总和)。

  

初始化

>>> l = [9, 4, 3, 2, 1]
>>> d = {'first': 'Rishikesh', 'last': 'Agrawani'}
>>> t = (3, 4, 5)
>>>
  

使用map()

>>> # Using map()
...
>>> map_obj = map(lambda n: n ** 2, l)
>>> map_obj
<map object at 0x0000016DAF88B6D8>
>>>
>>> squares = list(map_obj)  # list(map(lambda n: n ** 2, l))
>>> squares
[81, 16, 9, 4, 1]
>>>
>>> details = {k + '-name': v for k, v in d.items()}
>>> details
{'first-name': 'Rishikesh', 'last-name': 'Agrawani'}
>>>
>>> details = dict(map(lambda tup: (tup[0] + '_name', tup[1]), d.items()))
>>> details
{'first_name': 'Rishikesh', 'last_name': 'Agrawani'}
>>>
  

使用filter()

>>> # Using filter() - let's filter even numbers from list
...
>>> filter_obj = filter(lambda n: n % 2 == 0, l)
>>> filter_obj
<filter object at 0x0000016DAF88B908>
>>>
>>> evens = list(filter_obj)
>>> evens
[4, 2]
>>>
  

使用reduce()

>>> # Using reduce() - finding sum of al numbers in a list
... # i.e. reducing list of values to a single value
...
>>> from functools import reduce
>>>
>>> total = reduce(lambda n1, n2: n1 + n2, l)
>>> total
19
>>>

答案 1 :(得分:-3)

您可以使用forEach()函数将一些回调函数应用于集合中的每个项目

基本实现如下:

   function forEach(callback) {
      for(index=0;index<len_of_collection;index++) {
         callback(collection[index], index, collection);
      }
   }

您需要确保您的集合实现了此方法,以便您可以像这样从集合中调用它:

some_collection.forEach(myCustomCallback)

或内联:

some_collection.forEach(item => console.log(item))

请原谅JavaScript,我知道问题是在Python中出现的,但是该概念不是特定于语言的。

编辑:https://www.geeksforgeeks.org/python-map-function/

  

map()函数在应用给定后返回结果列表   给定可迭代项(列表,元组等)的每个项目的功能

您的示例未显示修改。因此,相符地映射将是不正确的。如果您要应用某些功能而不做任何修改,请探索类似于forEach的选项。