通过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+Django在windows下的开发环境配置图解
Nov 11 Python
python 字符串split的用法分享
Mar 23 Python
使用Python爬取最好大学网大学排名
Feb 24 Python
opencv改变imshow窗口大小,窗口位置的方法
Apr 02 Python
python利用pandas将excel文件转换为txt文件的方法
Oct 23 Python
用Python写一个模拟qq聊天小程序的代码实例
Mar 06 Python
关于python多重赋值的小问题
Apr 17 Python
Python3简单实现串口通信的方法
Jun 12 Python
python 数据分析实现长宽格式的转换
May 18 Python
Python 处理日期时间的Arrow库使用
Aug 18 Python
Python3 用什么IDE开发工具比较好
Nov 28 Python
Django展示可视化图表的多种方式
Apr 08 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采集相关教程之一 CURL函数库
2010/02/15 PHP
探讨PHP删除文件夹的三种方法
2013/06/09 PHP
php curl请求信息和返回信息设置代码实例
2015/04/27 PHP
PHP时间类完整实例(非常实用)
2015/12/25 PHP
详解PHP序列化和反序列化原理
2018/01/15 PHP
jquery 插件学习(三)
2012/08/06 Javascript
js中复制行和删除行的操作实例
2013/06/25 Javascript
JavaScript中window、doucment、body的解释
2013/08/14 Javascript
JS小功能(button选择颜色)简单实例
2013/11/29 Javascript
使用jQuery的toggle()方法对HTML标签进行显示、隐藏的方法(示例)
2016/09/01 Javascript
JS自定义混合Mixin函数示例
2016/11/26 Javascript
详解Nodejs的timers模块
2016/12/22 NodeJs
AngularJS打开页面隐藏显示表达式用法示例
2016/12/25 Javascript
angular仿支付宝密码框输入效果
2017/03/25 Javascript
React 使用browserHistory项目访问404问题解决
2018/06/01 Javascript
vue请求服务器数据后绑定不上的解决方法
2019/10/30 Javascript
微信小程序swiper左右扩展各显示一半代码实例
2019/12/05 Javascript
vue中利用iscroll.js解决pc端滚动问题
2020/02/15 Javascript
0基础学习前端开发的一些建议
2020/07/14 Javascript
[01:18]DOTA2超级联赛专访hanci ForLove淘汰感言曝光
2013/06/04 DOTA
[56:47]Ti4 循环赛第三日 iG vs Liquid
2014/07/12 DOTA
[02:04]2018DOTA2亚洲邀请赛Secret赛前采访
2018/04/03 DOTA
[36:45]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[01:04:05]Mineski vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
读写json中文ASCII乱码问题的解决方法
2016/11/05 Python
wxPython实现文本框基础组件
2019/11/18 Python
python中封包建立过程实例
2021/02/18 Python
英国游戏机和游戏购物网站:365games.co.uk
2018/06/18 全球购物
英国户外服装品牌:Craghoppers
2019/04/25 全球购物
教育学专业毕业生的自我评价
2013/11/21 职场文书
学生会竞聘书范文
2014/03/31 职场文书
关于责任的演讲稿
2014/05/20 职场文书
2014年学习全国道德模范事迹思想汇报
2014/09/15 职场文书
乡镇群众路线教育实践活动整改措施
2014/10/04 职场文书
导游词之千岛湖
2019/09/23 职场文书
python爬虫--selenium模块
2021/03/31 Python