Hi, Habr!
In this article, I would like to talk about what came to Python from functional programming languages. Interested please under the cat.
It's easy and simple: instead of
l = [] for x in range(10): if x % 2 == 0: l.append(x)
we are writing
l = [x for x in range(10) if x % 2 == 0]
Short and clear.
In Haskell, the same thing looks like this:
let l = [x | x <- [0..10], x `mod` 2 == 0]
Suppose we write a graphical interface and we have a function button (** kwargs), where valid named arguments are: text is for text, width is for width, height is for height, and command is for callback function:
def callback(event): print("Button pressed") button(text="Press me", width=32, height=16, command=callback)
Pay attention to how small our callback is, can it really be pushed through with an argument? Can! We will help lambda:
button(text="Press me", width=32, height=16, command=lambda x: print("Button pressed"))
Clean and easy!
In Haskell, passing a function as an argument occurs at every step; for example, the map function takes a function and a list and returns a list, to which each element this function was applied:
map (\x -> x+1) [1..10]
In Python, this is:
map(lambda x: x+1, [x for x in range(1, 10)])
True, there is no map in Python.
upd: map is!
Currying (currying) is when we pass one or more arguments to an old function in order to get a new one that accepts the rest (thanks to AnutaU for a more precise definition). For example: print is a function (I use Python 3), it has a named argument end - the end of the line, by default it is "\ n". I want not to move to a new line, then I write
print(str, end="")
Let's do a printf function that will not move to a new line.
def printf(*args, **kwargs): kwargs["end"] = "" print(*args, **kwargs)
Sloppy, it is possible and easier:
from functools import partial printf = partial(print, end = "")
Here it is, currying - we say we want exactly the same but with pearl buttons print function, but so that end is "". It's simple.
And again Haskell: we have a function + that takes two arguments, we say:
let plusTwo = (+2)
I now have a function that adds 2 to a single argument.
I have everything, if you know what else there is in Python from the functional area - please in the comments.
Questions and reviews there too.
Source: https://habr.com/ru/post/336160/
All Articles