3 ms·
> a.zip(b).map(func1).filter(func2).forall(func3) Lets make this a somewhat concrete example. --- heights = [1,2,3] widths = [4,5,6] # printing area greate
by bko 6y ago
> a.zip(b).map(func1).filter(func2).forall(func3)
Lets make this a somewhat concrete example.
---
heights = [1,2,3]
widths = [4,5,6]
# printing area greater than 10
# functional
heights.zip(widths).map(to_area).filter(lambda area: area > 10).forall(lambda a: print("Area " + a)
#Verbose way
hw_zipped = zip(a,b)
areas = hw_zipped.map(to_inches)
big_areas = areas.filter(a: a > 10)
for a in big_areas:
print("Area " + a)
---
Which do you prefer? I would argue the right level of abstraction is the functional way in this example, and its often the case in my experience, especially in python where you don't often use a namespace to store these intermediary variables and you have can't rely on typing
- syrrim 6y agofor x, y in zip(a,b): area = to_area(x, y) if area > 10: print(f"Area {area}") >in python where you don't often use a namespace to store these intermediary variables Hm? Most python code is within a function, in my experience.
- bko 6y agoYou can abstract it out to a function but I think its overkill, even if you generalize to something like print_area_filter(heights, widths, value, cmp) or whatever If its not in a function, your example may (or may not depending on length if either a or b have a length of zero) create a floating variable called area out there.
- claytonjy 6y agoAs another point of comparison, as of python 3.8 you can do this in one list comp without nesting or double-computing areas with the walrus: result = [area for x,y in zip(heights,widths) if (area := to_area(x,y)) > 10] I don't think that's very easy to read; I'd opt for two list comps like areas = [to_area(x,y) for x,y in zip(heights,widths)] result = [area for area in areas if area > 10] But I agree with OP that map+filter is easier to read.
- bko 6y agoI agree. My main problem is I don't want intermediary variables floating around. Especially something like "areas". If python localized variables to a blocked namespace, I wouldn't mind In scala: --- val widths = Seq(1,2,3) val heights = Seq(4,5,6) widths.zip(heights).foreach { case (w, h) => { val area = w * h if (area > 10) { println(s"Area: ${area}") } }} println(area) // error: not found: value area
- joshuamorton 6y agoYou can do this without the walrus in a one liner as well, I believe: [area for area in (to_area(x, y) for x, y in zip(h, w)) if area > 10] or generally, you can take a multiline statement like the one you have and replace named value with its expression. Add some indentation and it's not too bad: [area for area in (to_area(x, y) for x, y in zip(h, w)) if area > 10]