通过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创建xml文件示例
Mar 22 Python
Python 中迭代器与生成器实例详解
Mar 29 Python
matplotlib在python上绘制3D散点图实例详解
Dec 09 Python
python实现神经网络感知器算法
Dec 20 Python
详解通过API管理或定制开发ECS实例
Sep 30 Python
python使用正则筛选信用卡
Jan 27 Python
django数据库自动重连的方法实例
Jul 21 Python
python中bytes和str类型的区别
Oct 21 Python
python内打印变量之%和f的实例
Feb 19 Python
django 数据库返回queryset实现封装为字典
May 19 Python
Python logging模块原理解析及应用
Aug 13 Python
python3.8.3安装教程及环境配置的详细教程(64-bit)
Nov 28 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
[转帖]PHP世纪万年历
2006/12/06 PHP
PHP正则提取不包含指定网址的图片地址的例子
2014/04/21 PHP
关于Laravel参数验证的一些疑与惑
2019/11/19 PHP
33种Javascript 表格排序控件收集
2009/12/03 Javascript
JS构建页面的DOM节点结构的实现代码
2011/12/09 Javascript
Js可拖拽放大的层拖动特效实现方法
2015/02/25 Javascript
浅析jQuery操作select控件的取值和设值
2016/12/07 Javascript
提高JavaScript执行效率的23个实用技巧
2017/03/01 Javascript
jquery动态添加以及遍历option并获取特定样式名称的option方法
2018/01/29 jQuery
js中获取URL参数的共用方法getRequest()方法实例详解
2018/10/24 Javascript
Node.js事件的正确使用方法
2019/04/05 Javascript
vue-cli3项目展示本地Markdown文件的方法
2019/06/07 Javascript
js canvas实现5张图片合成一张图片
2019/07/15 Javascript
react使用antd表单赋值,用于修改弹框的操作
2020/10/29 Javascript
微信小程序中target和currentTarget的区别小结
2020/11/06 Javascript
使用webpack5从0到1搭建一个react项目的实现步骤
2020/12/16 Javascript
Python实现保证只能运行一个脚本实例
2015/06/24 Python
Python heapq使用详解及实例代码
2017/01/25 Python
python3使用scrapy生成csv文件代码示例
2017/12/28 Python
python实现判断一个字符串是否是合法IP地址的示例
2018/06/04 Python
Python常用模块之requests模块用法分析
2019/05/15 Python
numpy concatenate数组拼接方法示例介绍
2019/05/27 Python
python覆盖写入,追加写入的实例
2019/06/26 Python
解决yum对python依赖版本问题
2019/07/05 Python
深入理解Python变量的数据类型和存储
2021/02/01 Python
用css3实现转换过渡和动画效果
2020/03/13 HTML / CSS
《姥姥的剪纸》教学反思
2014/02/25 职场文书
党风廉政建设责任书
2014/04/14 职场文书
3的组成教学反思
2014/04/30 职场文书
应届生求职信范文
2014/06/30 职场文书
尊老爱亲美德少年事迹材料
2014/08/14 职场文书
2014年十一国庆节活动方案
2014/09/16 职场文书
幼儿教师年度个人总结
2015/02/05 职场文书
培训通知
2015/04/17 职场文书
秋季运动会加油词
2015/07/18 职场文书
村主任当选感言
2015/08/01 职场文书