TL;DR: Can we implement yield
or generator statement (with a loop) within a lambda
?
My question is to clarify:
Whether the following simple loop function can be implemented with yield
def loopyield(): for x in range(0,15): yield x print(*loopyield())
Results in error:
lamyield=lambda x: yield x for x in range(0,15) ^ SyntaxError: invalid syntax
Which looks like, it was expecting something as right operand for unwritten return statement but found the yield
and getting confused.
Is there a proper legit way to achieve this in a loop?
Side note: yield
can be statement/expression depending on who you ask: yield - statement or expression?
Final Answer : yield can be used with lambda but the limitation(single-line) makes it useless. for/while
not possible in lambda because they are not expressions. -user2357112 implicit for loop is possible with list comprehension, and yield is valid within the list comprehension. -wim
Verdict- Explicit loops not possible because lambdas in python can only contain expressions, and to write an explicit loop you will need to use statements. -wim
While you can technically put a yield in a lambda function, the constraints of lambda functions make it essentially never a useful thing to do.
Since a for loop is a statement (as is print , in Python 2. x), you cannot include it in a lambda expression.
In Python, a lambda function is a single-line function declared with no name, which can have any number of arguments, but it can only have one expression. Such a function is capable of behaving similarly to a regular function declared using the Python's def keyword.
Syntax. Simply put, a lambda function is just like any normal python function, except that it has no name when defining it, and it is contained in one line of code. A lambda function evaluates an expression for a given argument. You give the function a value (argument) and then provide the operation (expression).
The one-liner you seem to be trying to create is actually technically possible with a lambda, you just need to help the parser a bit more:
>>> lamyield = lambda: [(yield x) for x in range(15)] >>> print(*lamyield()) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
This uses a for loop implicitly in a list comprehension. It is not possible with an explicit while
loop or for
loop outside of a comprehension. That's because lambdas in python can only contain expressions, and to write an explicit loop you will need to use statements.
Note: this syntax is deprecated in Python 3.7, and will raise SyntaxError
in Python 3.8
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With