通过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基于PycURL自动处理cookie的方法
Jul 25 Python
Python中的变量和作用域详解
Jul 13 Python
python之pandas用法大全
Mar 13 Python
django admin 后台实现三级联动的示例代码
Jun 22 Python
Python3中exp()函数用法分析
Feb 19 Python
python操作kafka实践的示例代码
Jun 19 Python
在python中实现同行输入/接收多个数据的示例
Jul 20 Python
python求加权平均值的实例(附纯python写法)
Aug 22 Python
Docker如何部署Python项目的实现详解
Oct 26 Python
python pyg2plot的原理知识点总结
Feb 28 Python
Python 恐龙跑跑小游戏实现流程
Feb 15 Python
解决IDEA翻译插件Translation报错更新TTK失败不能使用
Apr 24 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在Web开发领域的优势
2006/10/09 PHP
PHP中字符安全过滤函数使用小结
2015/02/25 PHP
Yii中实现处理前后台登录的新方法
2015/12/28 PHP
php中10个不同等级压缩优化图片操作示例
2016/11/14 PHP
使用ucenter实现多站点同步登录的讲解
2019/03/21 PHP
深入聊聊Array的sort方法的使用技巧.详细点评protype.js中的sortBy方法
2007/04/12 Javascript
什么是json和jsonp,jQuery json实例详详细说明
2012/12/11 Javascript
jquery得到iframe src属性值的方法
2014/09/25 Javascript
详解js前端代码异常监控
2017/01/11 Javascript
详解如何在react中搭建d3力导向图
2018/01/12 Javascript
vue拖拽排序插件vuedraggable使用方法详解
2020/08/21 Javascript
Vue实现本地购物车功能
2018/12/05 Javascript
vue实现用户长时间不操作自动退出登录功能的实现代码
2020/07/23 Javascript
JavaScript实现简单验证码
2020/08/24 Javascript
Python里隐藏的“禅”
2014/06/16 Python
详细介绍Python函数中的默认参数
2015/03/30 Python
itchat和matplotlib的结合使用爬取微信信息的实例
2017/08/25 Python
Python3实现发送QQ邮件功能(文本)
2017/12/15 Python
Python爬虫工程师面试问题总结
2018/03/22 Python
使用python telnetlib批量备份交换机配置的方法
2019/07/25 Python
Django Aggregation聚合使用方法解析
2019/08/01 Python
关于Python核心框架tornado的异步协程的2种方法详解
2019/08/28 Python
python实现的多任务版udp聊天器功能案例
2019/11/13 Python
Otiumberg官网:英国半精致珠宝品牌
2021/01/16 全球购物
线程的基本概念、线程的基本状态以及状态之间的关系
2012/10/26 面试题
区域销售经理岗位职责
2013/12/10 职场文书
财务工作者先进事迹材料
2014/01/17 职场文书
计生工作先进事迹
2014/08/15 职场文书
导游词300字
2015/02/13 职场文书
大二学年个人总结
2015/03/03 职场文书
出国留学英文自荐信
2015/03/25 职场文书
2015年建筑工作总结报告
2015/05/04 职场文书
2019年浪漫婚礼证婚词
2019/06/27 职场文书
Python selenium模拟网页点击爬虫交管12123违章数据
2021/05/26 Python
Win11安装升级时提示“该电脑必须支持安全启动”
2022/04/19 数码科技
Apache Kafka 分区重分配的实现原理解析
2022/07/15 Servers