通过C++学习Python


Posted in Python onJanuary 20, 2015

我会随便说,C++ 近年来开始"抄袭" Python 么?我只会说,我在用 C++ 来学习 Python.

不信?来跟着我学?

字面量

Python 早在 2.6 版本中就支持将二进制作为字面量了1, 最近 C++14 逐步成熟,刚刚支持这么干2:

static const int primes = 0b10100000100010100010100010101100;

更不用说 Python 在 1.5 时代就有了 raw string literals 的概念3,咱们 C++ 也不算晚,C++11里也有了类似做法:

const char* path = r"C:\Python27\Doc";

Range Loop

Python 写 for 循环是一件非常舒畅的事情:

for x in mylist:

    print(x);

大家都知道了,C++11里我总算也能做同样的事情了:

for (int x : mylist)

    std::cout << x;

类型自动推导

Python 中真的有类型的概念吗?(笑

x = "Hello World"

print(x)

C++11 也学会了这招,只不过保留了老太太的裹脚布(auto)。

auto x = "Hello World";

std::cout << x;

元组

Python 里的元组(tuple)让人羡慕已久,这玩意 Python 从一开始就有了。

triple = (5, "Hello", True)

print(triple[0])

好嘛,我来用 C++11 照猫画虎:

auto triple = std::make_tuple(5, "hello", true);

std::cout << std::get<0>(triple);

有人说了,Python 大法好,还能逆向解析成变量呢

x, y, z = triple

哼,C++难道不行?

std::tie(x, y, z) = triple;

Lists

Python 里,Lists 是内置类型4,创建一个 list 无比简单:

mylist = [1, 2, 3, 4]

mylist.append(5);

以前我们可以说,这有啥,std::vector差不多也能干这事。可 Python 粉较真了,您能像上面那样初始化吗?这话让 Bjarne Stroustrup 老爹听到了,暗自羞愧,于是在 C++11 里整出了个 initializer_list 做出回应5。

auto mylist = std::vector<int>{1,2,3,4};

mylist.push_back(5);

可人又说了,Python 里创造个 Dictionary 简单的跟什么一样6。

myDict = {5: "foo", 6: "bar"}

print(myDict[5])

切,C++ 本身就有 map 类型,现在又多了个哈希表 unordered_map,更像了:

auto myDict = std::unordered_map<int, const char*>{ { 5, "foo" }, { 6, "bar" } };

std::cout << myDict[5];

Lambda 表达式

Python 祭出大神器,1994年就有的 Lambda 表达式:

mylist.sort(key = lambda x: abs(x))

C++11 开始了拙劣的模仿:

std::sort(mylist.begin(), mylist.end(), [](int x, int y){ return std::abs(x) < std::abs(y); });
而 Python 在 2001 年加了一把力,引入了 Nested Scopes 的技术7:

def adder(amount):

return lambda x: x + amount

...

print(adder(5)(5))

C++11 不甘示弱,整出了 capture-list 的概念8。

auto adder(int amount) {

    return [=](int x){ return x + amount; };

}

...

std::cout << adder(5)(5);

内置算法

Python 里有诸多内置的强大算法函数,如 filter:

result = filter(mylist, lambda x: x >= 0)
C++11 倒也可以用 std::copy_if 干同样的事情:

auto result = std::vector<int>{};

std::copy_if(mylist.begin(), mylist.end(), std::back_inserter(result), [](int x){ return x >= 0; });

这样的函数在 <algorithm> 中屡见不鲜,而且都在与 Python 中的某种功能遥相呼应:transform, any_of, all_of, min, max.

可变参数

Python 从一开始就支持可变参数了。你可以定义一个变参的函数,个数可以不确定,类型也可以不一样。

def foo(*args):

    for x in args:

        print(x);

foo(5, "hello", True)

C++11 里 initializer_list 可以支持同类型个数可变的参数(C++ Primer 5th 6.2.6)。

void foo(std::initializer_list<int> il) {

    for (auto x : il)

        std::cout << x;

}
foo({4, 5, 6});

看到这里,你是否发现用 C++ 学习 Python 也不失为一种很妙的方式呢? 从这个问题的答案,可以看出 @Milo Yip 也是同道中人呢。

继续

觉得不错?想要大展拳脚? 看看这个 repo 吧。上面有更多的方式,教你用 C++ 来学习 Python.

Python 相关文章推荐
Python通过解析网页实现看报程序的方法
Aug 04 Python
Python中字典和JSON互转操作实例
Jan 19 Python
Python中的深拷贝和浅拷贝详解
Jun 03 Python
Python入门_条件控制(详解)
May 16 Python
Python数据结构与算法之字典树实现方法示例
Dec 13 Python
Python实现的自定义多线程多进程类示例
Mar 23 Python
python石头剪刀布小游戏(三局两胜制)
Jan 20 Python
Python for循环与range函数的使用详解
Mar 23 Python
python 自动轨迹绘制的实例代码
Jul 05 Python
django admin管理工具自定义时间区间筛选器DateRangeFilter介绍
May 19 Python
opencv 形态学变换(开运算,闭运算,梯度运算)
Jul 07 Python
Pygame Time时间控制的具体使用详解
Nov 17 Python
python入门之语句(if语句、while语句、for语句)
Jan 19 #Python
Python实现删除Android工程中的冗余字符串
Jan 19 #Python
Python中字典和JSON互转操作实例
Jan 19 #Python
Python中的字典遍历备忘
Jan 17 #Python
Python中处理unchecked未捕获异常实例
Jan 17 #Python
Python实现过滤单个Android程序日志脚本分享
Jan 16 #Python
Python中的对象,方法,类,实例,函数用法分析
Jan 15 #Python
You might like
亚洲咖啡有什么?亚洲咖啡产地介绍 亚洲咖啡有什么特点?
2021/03/05 新手入门
php学习之数据类型之间的转换代码
2011/05/29 PHP
PHP反射API示例分享
2016/10/08 PHP
php简单实现单态设计模式的方法分析
2017/07/28 PHP
js下弹出窗口的变通
2007/04/18 Javascript
jQuery 动画弹出窗体支持多种展现方式
2010/04/29 Javascript
公共js在页面底部加载的注意事项介绍
2013/07/18 Javascript
jquery删除ID为sNews的tr元素的内容
2014/04/10 Javascript
DOM基础教程之使用DOM控制表格
2015/01/20 Javascript
nodejs中使用多线程编程的方法实例
2015/03/24 NodeJs
JSON格式的时间/Date(2367828670431)/格式转为正常的年-月-日 格式的代码
2016/07/27 Javascript
BootStrap入门教程(二)之固定的内置样式
2016/09/19 Javascript
js中的eval()函数把含有转义字符的字符串转换成Object对象的方法
2016/12/02 Javascript
Node.js中sequelize时区的配置方法
2017/12/10 Javascript
重学 JS:为啥 await 不能用在 forEach 中详解
2019/04/15 Javascript
javascript设计模式 ? 状态模式原理与用法实例分析
2020/04/22 Javascript
python 获取et和excel的版本号
2009/04/09 Python
Python的Flask框架中SQLAlchemy使用时的乱码问题解决
2015/11/07 Python
python动态网页批量爬取
2016/02/14 Python
python PIL模块与随机生成中文验证码
2016/02/27 Python
Python 递归函数详解及实例
2016/12/27 Python
Python实现的排列组合计算操作示例
2017/10/13 Python
python 用lambda函数替换for循环的方法
2018/06/09 Python
Python如何基于smtplib发不同格式的邮件
2019/12/30 Python
介绍一下linux的文件权限
2014/07/20 面试题
生物制药毕业生自荐信
2013/10/16 职场文书
爱情检讨书大全
2014/01/21 职场文书
初三政治教学反思
2014/01/30 职场文书
研讨会主持词
2014/04/02 职场文书
流动人口婚育证明范本
2014/09/26 职场文书
罚站检讨书
2015/01/29 职场文书
优秀党员主要事迹范文
2015/11/05 职场文书
高一英语教学反思
2016/03/03 职场文书
http通过StreamingHttpResponse完成连续的数据传输长链接方式
2022/02/12 Python
MyBatis核心源码深度剖析SQL语句执行过程
2022/05/20 Java/Android
ant design vue的form表单取值方法
2022/06/01 Vue.js