由python为入口回顾C++的lambda

lambda是一种匿名函数,python  lambda可以使简单的函数简洁的表达,,C++的lambda使类似嵌套函数的功能得以实现

python的lambda

lambda [arg1[,arg2,arg3....argN]]:expression

#用def定义的函数
def foo():
    return ‘hello world‘
print(foo())
#用lambda定义的函数
print(lambda:‘hello world‘)
#因为没有给它保存到变量,用完后就失效了,提高了性能
foo_1=lambda:‘hello world‘
print(foo_1())
#加参数
foo_3=lambda a,b=10:a+b
print(foo_3(20,10))
foo_4=lambda *args:args
print(foo_4(1,2,3,4))
#lambda表达式必须在一行,python一行写不下可以用\换行
foo_5=lambda **kwargs:kwargs
print(foo_5(a=1,b=2,c=3))
#还可以变量间赋值
foo_2=foo_1
print(type(foo_2))

VC++14的lambda

lambda是vc++独有的,在vc++11以后,扩展这个功能主要是为了使代码书写简洁,gcc没有这个功能

直接使用,对于一些不重复使用的函数,使用完了自动丢弃

int result = [](int a) {return a*a; }(10);
cout << result << endl;

如果要反复利用,可以使用变量来存储

auto pow_2 = [](int a) {return a*a; };
cout << pow_2(10) << endl;

lambda的类型

cout << typeid(pow_2).name() << endl;      //类型是class <lambda_a10bdd2a3443eccb15c2cfee0f251b1b>

  1. Capture 子句(在 C++ 规范中也称为 lambda 引导。)
  2. 参数列表(可选)。 (也称为 lambda 声明符)
  3. 可变规范(可选)。
  4. 异常规范(可选)。
  5. 尾随返回类型(可选)。
  6. “lambda 体”

1,lambda引导

位置可传入外部参数,可以通过传值或传址方式直接传入外部数据

[&] 通过引用传入外部所有变量(地址不会变),[=]通过数值传入外部所有变量,[i]指定变量传值,[&i]指定变量传址

int i = 10;
int front = (int)&i;            //front是i的地址
cout << i << "-->" << front << endl;    //输出这次地址
cout << &front << endl;            //查看front的地址
auto func_1 = [i,&front] {                //传入i(传值)和front(传址)
    int back = (int)&i;
    cout << i << "-->" << back <<            //输出这次地址
        "\nback-front=" << abs(back - front) << endl;
    cout << &front << endl;            //再次查看front地址
};
func_1();
//得出
/*
10-->7601564     第一次的i
0073FD90            第一次的front
10-->7601536     第二次的i
back-front=28
0073FD90           第二次的front
*/
struct S { void f(int i); };

void S::f(int i) {
    [&, i]{};    // 在所有都为引用的时候,可以指定一个不为引用
    [&, &i]{};   // 当默认全部引用的时候,不能在指定i为引用
    [=, this]{}; // ERROR: this when = is the default
    [i, i]{};    // 变量不能重复
}

2,参数列表,auto使用泛型值,或者指定类型

char* a = "aaa";
char* b = "bbb";
[](auto& a, auto& b) {
    auto temp = a;
    a = b;
    b = temp;
}(a,b);
cout << a <<" "<< b << endl;

3,可变规范

一般情况下,通过传值获得的变量不能修改

int n = 0;
[&, n]() {++n; }();
//提示错误:“n”: 无法在非可变 lambda 中修改通过复制捕获

mutable规范允许lambda中修改n的值,由于n是通过值捕获,在lambda结束后,n的值不会变

int m = 0;
int n = 0;
[&, n](int a)mutable {m = ++n + a; }(4);
cout << m << " " << n << endl;50

4,异常规范

5,返回值由char*变成string

char a[10] = "aaa";
char* b = "bbb";
auto merge_str=[](char* a, char* b)->string{
    char* result = strcat(a, b);
    return result;
};
cout << merge_str(a, b)<<"-->"<<typeid(merge_str(a, b)).name() << endl;

6,lambda体,可放入任意代码块

lambda表达式赋值方法:

//1,可赋值给auto变量
auto f1 = [](int x, int y) {return x + y; };
cout << f1(1,2) << endl;
//2,可赋值给函数对象
function<int(int, int)>f2 = [](int x, int y) {return x + y; };
cout << f2(3,4) << endl;37

find_if()  参数一:迭代器头部  参数二:迭代器尾部  参数三,返回一个指针  返回值:找到的元素的指针

vector<char*>v1 = { "aaa","bbb","ccc","ddd","eee" };
auto result=
find_if(v1.begin(), v1.end(), [](char* n) { return n=="ccc"; });
cout << *result << endl;ccc

lambda嵌套

int result = [](int x) {return [&x](int y) {return (x + y); }(10); }(20);
cout << result << endl;30
时间: 2024-08-04 16:39:59

由python为入口回顾C++的lambda的相关文章

python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器 同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。

本次python爬虫百步百科,里面详细分析了爬虫的步骤,对每一步代码都有详细的注释说明,可通过本案例掌握python爬虫的特点: 1.爬虫调度入口(crawler_main.py) # coding:utf-8from com.wenhy.crawler_baidu_baike import url_manager, html_downloader, html_parser, html_outputer print "爬虫百度百科调度入口" # 创建爬虫类class SpiderMai

python PIL库回顾

之前用PIL的时候都不知道看官方文档,网上搜索结果靠前的一些介绍性的博客其实很扯淡,讲两个函数.贴三张图,文章就完了. 今天把他的文档看了看,发现一点也不简单,网上介绍的不过是冰山一角. 对于我这样一个不太懂多媒体的人,如果用到图像处理,主要也就这些操作: 读写.取通道.两幅图合并.像素点操作.各种滤镜.色彩模式转换.图像旋转.缩放.裁剪.仿射. PIL对付这些小喽啰,都是完全没有问题的. 读写 open是Image类的一个方法,返回值是一个Image对象,值得注意的是,open不能打开网络图片

PYTHON资源入口汇总

Python资源入口汇总 官网 官方文档 教程和书籍 框架 数据库 模板 工具及第三方包 视频 书籍 博客 经典博文集合 社区 其他 整理中,进度30% 官网 入口 官方文档 英文 document 2.7.6 入口| 标准库 document 3.x 入口 The Hitchhiker’s Guide to Python 入口 Python Monk 入口 中文 document 2.7 入口 非官方 google的python文档 Google's Python Class入口 pep8 入

Python学习_列表解析和Lambda表达式

1.根据要求创建列表threes_and_fives(列表值包括1到15中能够被3或者5正常的数) threes_and_fives=[x for x in range(1,16) if x%3==0 or x%5==0] 2.lambda表达式实例(剔除掉列表中的"X") garbled = "IXXX aXXmX aXXXnXoXXXXXtXhXeXXXXrX sXXXXeXcXXXrXeXt mXXeXsXXXsXaXXXXXXgXeX!XX" message

python PIL库回顾1

1 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* BLOCKS =============================================================================*/ p, blockquote, ul, ol, dl, table, pre { margin: 15px 0; } /* HE

python学习笔记10-匿名函数lambda

匿名函数lambda 定义匿名函数 lambda def fun(x,y): return x*y r=lambda x,y: x*y r(3,4) In [2]: r = lambda x, y: x *y In [3]: r(3,4) Out[3]: 12 lambda基础 lambda语句中,冒号前是参数,可以有多个,逗号隔开,冒号右边是返回值 lambda语句构建的其实是一个函数的对象 lambda匿名函数的优点: 1.使用python写一写脚本的时候,使用lambda可以省去定义函数的

《转》Python学习(19)-python函数(二)-关于lambda

转自http://www.cnblogs.com/BeginMan/p/3178103.html 一.lambda函数 1.lambda函数基础: lambda函数也叫匿名函数,即,函数没有具体的名称,而用def创建的方法是有名称的.如下: """命名的foo函数""" def foo():return 'beginman' #Python中单行参数可以和标题写在一行 """lambda关键字创建匿名函数,该表达式同

python基础学习-三元表达式和lambda表达式

#!/usr/bin/env python # -*- coding:utf-8 -*-  三元运算 if else 的简写 name ="alex" if 1==1 else "SB" #如果条件成立 赋alex 否则 赋SB print(name) #--------------lambda表达式 f2 = lambda a1,a2:a1+a2+100 #等价 下边函数定义 def f1(a1,a2): return  a1+a2+100 #---------l

Python学习笔记010——匿名函数lambda

1 语法 my_lambda = lambda arg1, arg2 : arg1 + arg2 + 1 arg1.arg2:参数 arg1 + arg2 + 1 :表达式 2 描述 匿名函数不需要return来返回值,表达式本身结果就是返回值. lambda 仅简洁了代码,并不会提高程序运行效率 如果可以用 for...in...if 来完成的,最好不使用匿名函数lambda 使用lambda时,函数内不要包含循环.嵌套:如果存在,则最好使用def函数来完成,这样的代码可读性和复用性均较高 l