由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))
C++的lambda
直接使用,对于一些不重复使用的函数,使用完了自动丢弃
int result = [](int a) {return a*a; }();
cout << result << endl;
如果要反复利用,可以使用变量来存储
auto pow_2 = [](int a) {return a*a; };
cout << pow_2() << endl;
lambda的类型
cout << typeid(pow_2).name() << endl; //类型是class <lambda_a10bdd2a3443eccb15c2cfee0f251b1b>

Capture 子句(在 C++ 规范中也称为 lambda 引导。)
参数列表(可选)。 (也称为 lambda 声明符)
可变规范(可选)。
异常规范(可选)。
尾随返回类型(可选)。
“lambda 体”
1,lambda引导
位置可传入外部参数,可以通过传值或传址方式直接传入外部数据
[&] 通过引用传入外部所有变量(地址不会变),[=]通过数值传入外部所有变量,[i]指定变量传值,[&i]指定变量传址
int i = ;
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 = ;
[&, n]() {++n; }();
//提示错误:“n”: 无法在非可变 lambda 中修改通过复制捕获
mutable规范允许lambda中修改n的值,由于n是通过值捕获,在lambda结束后,n的值不会变
int m = ;
int n = ;
[&, n](int a)mutable {m = ++n + a; }();
cout << m << " " << n << endl;
5
0
4,异常规范
5,返回值由char*变成string
char a[] = "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(,) << endl;
//2,可赋值给函数对象
function<int(int, int)>f2 = [](int x, int y) {return x + y; };
cout << f2(,) << endl;
3
7
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); }(); }();
cout << result << endl;
30
由python为入口回顾C++的lambda的更多相关文章
- python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器 同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。
本次python爬虫百步百科,里面详细分析了爬虫的步骤,对每一步代码都有详细的注释说明,可通过本案例掌握python爬虫的特点: 1.爬虫调度入口(crawler_main.py) # coding: ...
- python基础4之递归、lambda、深浅copy
内容概要: 一.递归 二.匿名函数 三.关于python中的深浅拷贝与赋值 一.递归 递归就是函数本身调用自己,直到满足指定条件之后一层层退出函数 递归特性: 必须有一个明确的结束条件 每次进入更深一 ...
- PYTHON资源入口汇总
Python资源入口汇总 官网 官方文档 教程和书籍 框架 数据库 模板 工具及第三方包 视频 书籍 博客 经典博文集合 社区 其他 整理中,进度30% 官网 入口 官方文档 英文 document ...
- python基础(补充):lambda匿名函数,用了的,都说好!
lambda函数又叫做"匿名函数".当你完成一件小工作时,直接使用该函数可以让你的工作得心应手. lambda函数介绍 在Python中,定义函数使用的是def关键字,但是通过la ...
- 笨办法学Python记录--习题37 异常,lambda,yield,转义序列
习题中提到了raise,查了下,顺便所有异常类关键字罗列如下文章中: 为什么使用异常 错误处理.事件通知.特殊情况处理.退出时的行为.不正常的程序流程. 简单的示例 在没有任何定义x变量的时候: pr ...
- python中的内置函数lambda map filter reduce
p.p1 { margin: 0; font: 12px "Helvetica Neue" } p.p2 { margin: 0; font: 12px "Helveti ...
- 【python】filter,map,reduce和lambda函数介绍
filter(function, iterable)map(function, iterable)reduce(function, sequence) filter将 function依次作用于ite ...
- Python新手学习基础之函数-lambda函数
lambda函数 在Python里除了用def定义函数外,还有一种匿名函数,也就是标题所示的lambda函数,它是指一类无需定义标识符(函数名)的函数或子程序. lambda函数的使用语法如下: la ...
- Python学习:函数式编程(lambda, map() ,reduce() ,filter())
1. lambda: Python 支持用lambda对简单的功能定义“行内函数” 2.map() : 3.reduce() : 4.filter() : map() ,reduce() , filt ...
随机推荐
- 阿里云centos yum源更换,两个文件是从阿里云服务器拷贝出来的,可安装openvpn
第一步:备份你的原镜像文件,以免出错后可以恢复. mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.back ...
- 数据绑定时(<%#Eval)单引号双引号嵌套问题
期望得到的HTML如下: onclick='edit("10000001")' 或者 onclick="edit('10000001')" 实际ASP.NET前 ...
- Uva11292--------------(The Dragon of Loowater)勇者斗恶龙 (排序后贪心)
---恢复内容开始--- 题目: Once upon a time, in the Kingdom of Loowater, a minor nuisance turned into a major ...
- 黄聪:GeckoWebBrowser多窗口独立cookie
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- NPOIHelper
public class NPOIHelper { public static void WriteDataToExceel(string fileName, DataSet ds) { if (Fi ...
- js运动框架之一条乱跑的虫子
克隆与运动框架的联合应用 效果:点击元素块后,元素块开始随机的向任何方向移动,并附带一堆颜色随机的"尾巴".每个方向运动3秒后改变方向,同时笑脸变哭脸. 如图所示: 朝某个方向运动 ...
- HDFS snapshot操作实战
Hadoop从2.1.0版开始提供了HDFS SnapShot的功能.一个snapshot(快照)是一个全部文件系统.或者某个目录在某一时刻的镜像.快照在下面场景下是非常有用:防止用户的错误操作:管理 ...
- Json序列化,date类型转换后前端显示错误的解决方案
1.前台使用Jquery解决 (1)如果我们前台使用Jquery来解决这个问题的话,那么我们首先想到的是我们如何解析这个过程呢,当然我们就想到了自己写一个JavaScript脚本来解析这个过程,当然这 ...
- SQL Server选项综述
I. 基本概念 SQL Server中的选项根据其作用范围分为如下几类: 实例选项 —— 在数据库实例范围内有效,通过 sp_configure 存储过程进行配置. 数据库选项 —— 在数据库范围内有 ...
- XF 文档 - Element Framework Doc
配置篇 Chapter Configuration Schema篇 Chapter Schema 查询篇 Chapter Querying Data 数据更改及验证篇 Chapter Data Mod ...