通过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之玩转字符串(1)
Sep 14 Python
python实现通过pil模块对图片格式进行转换的方法
Mar 24 Python
13个最常用的Python深度学习库介绍
Oct 28 Python
深入浅析Python中的yield关键字
Jan 24 Python
python根据文章标题内容自动生成摘要的实例
Feb 21 Python
Python发展简史 Python来历
May 14 Python
Pycharm使用之设置代码字体大小和颜色主题的教程
Jul 12 Python
tornado+celery的简单使用详解
Dec 21 Python
Python如何基于rsa模块实现非对称加密与解密
Jan 03 Python
Python Tricks 使用 pywinrm 远程控制 Windows 主机的方法
Jul 21 Python
Python批量修改xml的坐标值全部转为整数的实例代码
Nov 26 Python
pytest实现多进程与多线程运行超好用的插件
Jul 15 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
PHP5.3与5.5废弃与过期函数整理汇总
2014/07/10 PHP
php中spl_autoload详解
2014/10/17 PHP
php实现paypal 授权登录
2015/05/28 PHP
php实现生成code128条形码的方法详解
2017/07/19 PHP
JavaScript中的事件处理
2008/01/16 Javascript
javascript 框架小结 个人工作经验
2009/06/13 Javascript
JS window.opener返回父页面的应用
2009/10/24 Javascript
js 实现打印网页中定义的部分内容的代码
2010/04/01 Javascript
web的各种前端打印方法之jquery打印插件PrintArea实现网页打印
2013/01/09 Javascript
jquery animate实现鼠标放上去显示离开隐藏效果
2013/07/21 Javascript
js实现的折叠导航示例
2013/11/29 Javascript
jquery中get和post的简单实例
2014/02/04 Javascript
javascript中的this详解
2014/12/08 Javascript
基于javascript实现动态显示当前系统时间
2016/01/28 Javascript
用Angular实时获取本地Localstorage数据,实现一个模拟后台数据登入的效果
2016/11/09 Javascript
webpack入门必知必会
2017/01/16 Javascript
浅谈angularjs $http提交数据探索
2017/01/20 Javascript
设置cookie指定时间失效(实例代码)
2017/05/28 Javascript
优雅的elementUI table单元格可编辑实现方法详解
2018/12/23 Javascript
vue实现路由切换改变title功能
2019/05/28 Javascript
[17:00]DOTA2 HEROS教学视频教你分分钟做大人-帕克
2014/06/10 DOTA
[02:27]2014DOTA2国际邀请赛 VG赛后采访:更大的挑战在等着我们
2014/07/13 DOTA
python实现根据ip地址反向查找主机名称的方法
2015/04/29 Python
对python中数据集划分函数StratifiedShuffleSplit的使用详解
2018/12/11 Python
如何通过python实现人脸识别验证
2020/01/17 Python
推荐8款常用的Python GUI图形界面开发框架
2020/02/23 Python
法国二手手袋、手表和奢侈珠宝购物网站:Collector Square
2018/07/05 全球购物
EQVVS官网:设计师男装和女装
2018/10/24 全球购物
初中生三年学习生活的自我评价
2013/11/03 职场文书
励志演讲稿大全
2014/08/21 职场文书
致百米运动员广播稿5篇
2014/10/13 职场文书
2015年读书月活动总结
2015/03/26 职场文书
焦裕禄观后感
2015/06/03 职场文书
六年级作文之自救
2019/12/19 职场文书
MySQL中的隐藏列的具体查看
2021/09/04 MySQL
Tomcat执行startup.bat出现闪退的原因及解决办法
2022/04/20 Servers