Creating lambda inside a loop
Use this line instead:
lambdas_list.append(lambda obj=obj: obj.some_var)
Lambda in a loop
You need to bind d for each function created. One way to do that is to pass it as a parameter with a default value:
lambda d=d: self.root.change_directory(d)
Now the d inside the function uses the parameter, even though it has the same name, and the default value for that is evaluated when the function is created. To help you see this:
lambda bound_d=d: self.root.change_directory(bound_d)
Remember how default values work, such as for mutable objects like lists and dicts, because you are binding an object.
This idiom of parameters with default values is common enough, but may fail if you introspect function parameters and determine what to do based on their presence. You can avoid the parameter with another closure:
(lambda d=d: lambda: self.root.change_directory(d))()
# or
(lambda d: lambda: self.root.change_directory(d))(d)
loop for inside lambda
Since a for
loop is a statement (as is print
, in Python 2.x), you cannot include it in a lambda expression. Instead, you need to use the write
method on sys.stdout
along with the join
method.
x = lambda x: sys.stdout.write("\n".join(x) + "\n")
c++ Should I define lambda out of for loop or inside it to keep small scope, what is best practice
For each lambda expression, the compiler will create a struct with operator ()
overloaded for it. It won't create a struct each time the control passes through a lambda, so in terms of generated code it does not matter whether you define it inside or outside the loop. Therefore, keep things local.
As a general rule, don't overthink these illusory optimization issues. Most likely, the performance bottleneck is going to be in your algorithm complexity.
Lambda in for loop - static variable
Think of a lambda expression as a terse recipe to define a class that overloads the call operator()
. In your case:
struct LambdaEquivalent {
int j;
auto operator() const
{
static int s{j};
cout << s << endl;
}
};
And you loop then is
for(int i = 0; i < 5; ++i)
{
int j = i + 1;
LambdaEquivalent k{j};
k()
}
This illustrates that any local static data in the body of a lambda expression is nothing but local static data in a member function - and that is initialized exactly once. It's a good thing that both cases behave identically, handling it differently could be very confusing.
Generating functions inside loop with lambda expression in python
Technically, the lambda expression is closed over the i
that's visible in the global scope, which is last set to 9. It's the same i
being referred to in all 10 lambdas. For example,
i = 13
print b[3]()
In the makeFun
function, the lambda closes on the i
that's defined when the function is invoked. Those are ten different i
s.
Lambda inside loop
When you specify the capture, you can choose between capture by value and capture by reference. You have chosen to capture by reference. Capturing by reference means that the variable inside the lambda function is referring to the same object. The implication is that any changes to this variable will be shared and you also need to make sure that the referenced object stays around for the life-time of the lambda function.
You probably meant to capture by values. To do this, you can either replace the capture specification to become [=]
or to become [x]
. The latter makes sure that only x
can be accessed while the former would allow other variables to be accessible.
BTW, I'd recommend not using lock()
and unlock()
explicitly but rather use one of the lock guards. With this, the body of your loop would look something like this:
vec.push_back(std::thread{[x](){
std::lock_guard<std::mutex> kerberos(m);
std::cout << x << "\n";
}});
How to apply lambda function in for loop
as others comment, you are printing the variable i and not calling at all the lambda
try instead:
x = lambda i: i.upper()
print(x(i))
Related Topics
What Is the Fastest Way to Send 100,000 Http Requests in Python
How to Profile Memory Usage in Python
Is There a Built-In Function to Print All the Current Properties and Values of an Object
Using Quotation Marks Inside Quotation Marks
What Is the Python Equivalent for a Case/Switch Statement
Why Is My Pygame Application Loop Not Working Properly
Getting a List of Values from a List of Dicts
How to Return Dictionary Keys as a List in Python
How to Convert a String to a Number If It Has Commas in It as Thousands Separators
Plotting Time in Python with Matplotlib
Nested Defaultdict of Defaultdict
Creating a JSON Response Using Django and Python
Convert Base-2 Binary Number String to Int
Python Dictionary: Are Keys() and Values() Always the Same Order
How to Rotate an Image Around an Off Center Pivot in Pygame
How to Catch and Print the Full Exception Traceback Without Halting/Exiting the Program