通过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遍历C盘dll文件的方法
May 06 Python
python使用smtplib模块通过gmail实现邮件发送的方法
May 08 Python
Python urllib、urllib2、httplib抓取网页代码实例
May 09 Python
Python使用cx_Oracle模块将oracle中数据导出到csv文件的方法
May 16 Python
python二分查找算法的递归实现方法
May 12 Python
Windows下安装python MySQLdb遇到的问题及解决方法
Mar 16 Python
python使用matplotlib画柱状图、散点图
Mar 18 Python
Python文件操作函数用法实例详解
Dec 24 Python
Python实现动态循环输出文字功能
May 07 Python
python怎么提高计算速度
Jun 11 Python
Windows 平台做 Python 开发的最佳组合(推荐)
Jul 27 Python
Python实现简单的俄罗斯方块游戏
Sep 25 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笔记之:日期函数的使用介绍
2013/04/24 PHP
PHP静态调用非静态方法的应用分析
2013/05/02 PHP
详解PHP中的mb_detect_encoding函数使用方法
2015/08/18 PHP
javascript Split方法,indexOf方法、lastIndexOf 方法和substring 方法
2009/03/21 Javascript
JQuery循环滚动图片代码
2011/12/08 Javascript
jquery搜索框效果实现方法
2015/01/16 Javascript
JQuery给网页更换皮肤的方法
2015/05/30 Javascript
js闭包引起的事件注册问题介绍
2016/03/29 Javascript
Javascript 实现简单计算器实例代码
2016/10/23 Javascript
详解如何在Vue2中实现组件props双向绑定
2017/03/29 Javascript
微信小程序日历组件calendar详解及实例
2017/06/08 Javascript
详解如何使用Node.js编写命令工具——以vue-cli为例
2017/06/29 Javascript
Vue.js组件间的循环引用方法示例
2017/12/27 Javascript
Nuxt升级2.0.0时出现的问题(小结)
2018/10/08 Javascript
通过JS运行机制的角度说说作用域
2019/03/12 Javascript
mongodb初始化并使用node.js实现mongodb操作封装方法
2019/04/02 Javascript
js实现无刷新监听URL的变化示例代码详解
2020/06/03 Javascript
js实现表格数据搜索
2020/08/09 Javascript
关于Js中new操作符的作用详解
2021/02/21 Javascript
[02:57]DOTA2亚洲邀请赛小组赛第四日 赛事回顾
2015/02/02 DOTA
python抓取京东价格分析京东商品价格走势
2014/01/09 Python
Python中的匿名函数使用简介
2015/04/27 Python
python数据结构之链表的实例讲解
2017/07/25 Python
python爬虫爬取淘宝商品信息(selenum+phontomjs)
2018/02/24 Python
使用11行Python代码盗取了室友的U盘内容
2018/10/23 Python
Python3.7 读取 mp3 音频文件生成波形图效果
2019/11/05 Python
PyTorch中topk函数的用法详解
2020/01/02 Python
python 安装教程之Pycharm安装及配置字体主题,换行,自动更新
2020/03/13 Python
分布式全文检索引擎ElasticSearch原理及使用实例
2020/11/14 Python
PyQt5通过信号实现MVC的示例
2021/02/06 Python
芭比波朗加拿大官方网站:Bobbi Brown Cosmetics CA
2020/11/05 全球购物
中专毕业生个人职业生涯规划
2014/02/19 职场文书
中级会计职业生涯规划书
2014/03/01 职场文书
化工专业求职信
2014/07/01 职场文书
公司人事管理制度
2015/08/05 职场文书
解决python3安装pandas出错的问题
2021/05/20 Python