」明月如霜,好風如水,清景無限 「
來總結一下,lambda表達式。
C++中的會看起來更詳細。總的來說可以把lambda表達式理解為一種方便的自定義函數。
壹
lambda的語法格式:
[capture](parameters) mutable ->return-type{statement}
1、空。沒有使用任何函數對象參數,意思只是是只用{statement}:函數體的變量。
2、=。函數體內可以使用Lambda所在作用範圍內所有可見的局部變量(包括Lambda所在類的this).不過是按值傳遞(即不會改變原變量)。而&則是按引用傳遞(會改變原變量,可以理解成傳遞了指針)。
3、var。放某些局部變量,默認為值傳遞,如需引用傳遞則前面加上&。
4、this。函數體內可以使用Lambda所在類中的成員變量。
5、混著用,但是注意不要有變量重複。錯誤舉例:[=,a],如果a是個局部變量,則已經被=包含。比較常用正確舉例[&,a]和[=,&a,&b]
(parameters):參數列表。就是正常的函數輸入參數,沒有參數時()可以省略,但是不建議省略().
mutable mutable或exception聲明,這部分可以省略。按值傳遞函數對象參數時,加上mutable修飾符後,可以修改按值傳遞進來的拷貝(注意是能修改拷貝,而不是值本身),默認值傳遞為const.
->return-type 返回值類型,當返回值為void,可省略(此時編譯器可以自動推斷出返回值類型)。要有返回值時,強烈建議加上。eg.
-> int{statement}
{statement} 函數主體,可以是空,但{}不可省略。
貳
再看一下,python中的lambda表達式。
fun_1 = lambda x:lambda y:x + yfun = fun_1(3)print('fun_1:',fun_1)print('fun:',fun)print('fun_1(3):',fun_1(3))print( fun(2) )print( (fun_1(3))(2) )這樣看起來,python裡的lambda簡單多了,標誌是關鍵字lambda,後面則是 (輸入) :(輸出)
lambda argument_list: expression但是在某些情況(build-in內置函數)就是很方便:
herolist_json = requests.get(url_json).json() hero_name = list(map(lambda x: x['cname'], herolist_json)) hero_number = list(map(lambda x: x['ename'],herolist_json))
list=[i for i in range(1,10)]sorted(list, key=lambda x: abs(x-5))
對於一些把函數地址作為對象的函數,使用lambda充當參數就特別爽。
叄
這是不得不說,lambda函數的特點是匿名&高效。
下面再舉個小例子:
#include <functional>#include <iostream>
using namespace std;class Test{public: int num;public: Test() { num = 100; } void lambda_test(){ int i_a = 3; int i_b = 5;
auto fun1 = [](int value) { int i_a = 4; cout << "fun1__:i_a="<< value << "\n" << endl; }; fun1(i_a); auto fun2 = [=]() { int i_a = 10; int i_b = 20; this->num = 200; cout << "fun2__:" << "num=" << this->num << " i_a=" << i_a << " i_b=" << i_b << "\n"<<endl; }; fun2(); cout << "fun2__後lambda_test內修改後" << "num=" << this->num << " i_a=" << i_a << " i_b=" << i_b << "\n" << endl; auto fun3 = [&]() { this->num =300; i_a = 10; i_b = 20; cout << "fun3__:" << "i_a=" << i_a << " i_b=" << i_b << "\n" << endl; }; fun3(); cout << "fun3__lambda_test內修改後num=" << this->num << " i_a=" << i_a << " i_b=" << i_b << "\n" << endl; auto fun4 = [&i_a, i_b]() { i_a = 13; cout<< "fun4__:" << "i_a=" << i_a << " i_b=" << i_b << "\n" << endl; }; fun4(); cout << "fun4__lambda_test內修改後num=" << this->num << " i_a=" << i_a << " i_b=" << i_b << "\n" << endl;
}};int main(){ Test *test = new Test(); (*test).lambda_test();
int val = 0; auto const_val_lambda = [=](){ int val = 3; }; const_val_lambda(); cout <<"const_val_lambda():val="<< val << "\n" << endl;
auto mutable_val_lambda = [=]() mutable { val = 3; cout << "mutable_val_lambda()函數內部:val=" << val << "\n" << endl; }; mutable_val_lambda(); cout << "main()調用mutable_val_lambda()後:val=" << val << "\n" << endl;
system("pause"); return 0;}看起來還是很清楚的。最起碼說清了:=和&的區別。至於this你觀察一下num就能總結出來了。至於mutable則是自己看main函數裡面的,最大的改變是mutable讓[=]能在lambda內直接使用局部變量而不報錯。但不改變是值傳遞的本質。以後看到lambda就不用慌了。
END
作者:不愛跑馬的影迷不是好程序猿
喜歡的話請關注點讚👇 👇👇 👇
壹句: 月寒日暖,來煎人壽