Lambda詳解->C+&py

2021-03-02 文遠的學習筆記

 」明月如霜,好風如水,清景無限 

來總結一下,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  

作者:不愛跑馬的影迷不是好程序猿    

       喜歡的話請關注點讚👇 👇👇 👇                     

壹句:                    月寒日暖,來煎人壽

相關焦點

  • python入門基礎之lambda匿名函數詳解
    python入門基礎之lambda匿名函數詳解剛開始學習python的時候很多人可能對於lambda函數不了解,感覺和def很混亂,下面我來介紹一下lambda函數我從一下幾個方面來介紹lambda:1、lambda簡介2、lambda與def不同之處3、lambda的使用方法
  • 實例中學習python的walk/map/filter/lambda
    我們本次就從此實例出發,去學習python語言中的walk/map/filter/lambda函數的使用。我們測試環境的當前目錄下除了兩個代碼文件:jsj_xx_1.py和jsj_xx_2.py,其餘都是測試相關的目錄和文件,具體如下:實例的需求是找到當前目錄下的後綴名為「.name1」和「.name2」的文件。
  • Python匿名函數:Lambda表達式
    首先,看一個返回所有參數和的函數:# 返回所有參數和def pSum(a,b,c):return a + b + cpSum(10,40,50)函數中必須要用return才能實現「和」的返回。接著我們嘗試用lambda表達式來實現上述函數功能:# labmda表達式psum = lambda a,b,c:a + b + cprint(psum) # 驗證是否生成一個新對象print(psum(10,40,50)) # 驗證執行效果【結論】lambda實現了函數的效果。【3】Lambda表達式有何應用場景?
  • C++中的lambda函數
    作者:  2019信息與計算科學專業   楊澤天lambda函數是C++11中的匿名函數,又叫lambda表達式,叫lambda表達式更好理解,因為函數是不可以在函數中定義的,表達式可以。lambda表達式,可以簡化編程工作。
  • Lambda表達式在Python事件中的運用
    本篇筆記內容:Lambda表達式詳解Lambda表達式在事件中的應用【1】Lambda表達式詳解lambda 表達式定義的是一個匿名函數,只適合簡單輸入參數,簡單計算返回結果,不適合功能複雜情況。lambda 定義的匿名函數也有輸入、也有輸出,只是沒有名字。語法格式如下:lambda 參數值列表:表達式其中,參數值列表即為輸入,表達式計算的結構即為輸出。看一個案例:求三個數的和。
  • 【C++基礎】C++11 lambda 表達式解析
    C++11 新增了很多特性,lambda 表達式是其中之一,如果你想了解的 C++11 完整特性,建議去看看C++標準。本文作為 5 月的最後一篇博客,將介紹 C++11 的 lambda 表達式。很多語言都提供了 lambda 表達式,如 Python,Java 8。
  • python之lambda函數使用
    二,lambda簡單使用def detail(x,y): return x*ys = lambda x,y:x*yprint(s(3,3))以上對比我們可以看出如果我們想計算兩個數的乘積,需要定義一個函數,傳入兩個形參,然而lambda也是直接傳入兩個形參。後面使用冒號,寫入表達式,即可得到我們所需要的結果。
  • Python中lambda表達式的常見用法
    非常抱歉,昨天發的代碼中有一處小錯誤,已通過留言的方式進行了糾正,詳情請見詳解Python列表推導式lambda表達式常用來聲明匿名函數
  • 條件判斷詳解
    33b = 200if b > a:  print("b is greater than a")PS E:\dreams\dream\markdown\python> & "C:/Program Files (x86)/Python/python.exe" e:/dreams/dream/markdown/python/app/app.py
  • Python中__init__.py文件的作用詳解
    __init__.py 文件的作用是將文件夾變為一個Python模塊,Python 中的每個模塊的包中,都有__init__.py 文件。
  • C++ lambda表達式簡介及作用
    C++ lambda表達式簡介及作用C/C++的可調用對象在C語言中,可調用對象僅有函數指針。 ) [options] { <函數體> }// 返回值即為一個lambda表達式,每個lambda表達式在全局範圍上都屬於特有的一個類別// 寫出類別很難,所以用auto關鍵字指定收變量的類型// 譬如auto add  = [] (int lv, int rv) { return lv + rv; };lambda各部分的格式及作用
  • 一文帶你認識 C++ 中的 Lambda 函數
    所以,每次調用lambda_func時,它將被返回並遞增。C++ lambda函數類型1.通用lambdaconst auto l = [](auto a, auto b, auto c) {};struct anonymous{ template &
  • Python每天一分鐘:lambda表達式 (匿名函數)及用法詳解
    lambda表達式介紹python中有一種靈活,便捷的且具有函數功能的表達式:lambda表達式!lambda 表達式可以用來替換局部函數(感興趣的讀者可以自行查閱「局部函數」),下面為大家演示lambda表達式的具體用法。lambda表達式定義首先以一個代碼例子讓大家對lambda表達式有一個直觀的認識:
  • Python中Lambda的前4個錯誤
    當然,lambda具有使我們的代碼簡潔的優勢,但是在項目中過度使用它們會導致濫用,從而降低我們代碼的可讀性和可維護性。在開始研究這些誤用是什麼之前,讓我們先快速回顧一下lambda。如果您對它們非常了解,則可以跳到下一部分。Lambda,也稱為lambda函數,是匿名函數,可以接受任意數量的參數,而只有一個表達式。它們的聲明由lambda關鍵字表示。
  • vim+py文件構造linux後門
    那現在我們就可以使用vim的python擴展去啟動一個python後門,命令如下:vim -E -c "pyfile test.py"其中 -E是啟動一個改進的Ex模式(也就是命令模式),-c是去加載一個文件,並去執行。
  • [Neo4j系列四]Neo4j的python操作庫py2neo之一
    本文主要介紹python中適配Neo4j的庫py2neo的關於節點、關係、子圖基本內容。1. py2neo的安裝pip install py2ne或pip install git+https://github.com/nigelsmall/py2neo.git#egg=py2neo2.
  • Lambda 表達式的 10 個示例
    作為開發人員,我發現學習和掌握lambda表達式的最佳方法就是勇於嘗試,儘可能多練習流API和lambda表達式,用於對列表(Lists)和集合(Collections)數據進行提取、過濾和排序。本文分享在代碼中最有用的10個lambda表達式的使用方法,這些例子都短小精悍,將幫助你快速學會lambda表達式。
  • Java lambda表達式
    如果lambda表達式匹配參數類型(在這種情況下,是StateChangeListenerinterface),lambda表達式將轉換成實現該參數接口的函數。Java lambda表達式只能在匹配的類型只是單方法接口的時候使用。在上面的示例中,使用lambda表達式作為參數,參數類型為StateChangeListener接口。這個接口只有一個方法。