通过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实现excel转sqlite的方法
Jul 17 Python
Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】
Sep 28 Python
mac安装pytorch及系统的numpy更新方法
Jul 26 Python
python 2.7.13 安装配置方法图文教程
Sep 18 Python
Python实现定期检查源目录与备份目录的差异并进行备份功能示例
Feb 27 Python
django项目登录中使用图片验证码的实现方法
Aug 15 Python
python列表插入append(), extend(), insert()用法详解
Sep 14 Python
django使用xadmin的全局配置详解
Nov 15 Python
Python实现随机生成任意数量车牌号
Jan 21 Python
python 瀑布线指标编写实例
Jun 03 Python
Django自定义YamlField实现过程解析
Nov 11 Python
python读取pdf格式文档的实现代码
Apr 01 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 park、unpark、ord 函数使用方法(二进制流接口应用实例)
2010/10/19 PHP
深入PHP curl参数的详解
2013/06/17 PHP
PHP往XML中添加节点的方法
2015/03/12 PHP
PHP 9 大缓存技术总结
2015/09/17 PHP
php 截取GBK文档某个位置开始的n个字符方法
2017/03/08 PHP
教你如何解密js/vbs/vbscript加密的编码异处理小结
2008/06/25 Javascript
jquery ajax 登录验证实现代码
2009/09/23 Javascript
Jquery ajax不能解析json对象,报Invalid JSON错误的原因和解决方法
2010/03/27 Javascript
基于JQuery的Pager分页器实现代码
2010/07/17 Javascript
利用Jquery实现可多选的下拉框
2014/02/21 Javascript
JavaScript获取伪元素(Pseudo-Element)属性的方法技巧
2015/03/13 Javascript
基于JS如何实现类似QQ好友头像hover时显示资料卡的效果(推荐)
2016/06/09 Javascript
浅析为什么a=&quot;abc&quot; 不等于 a=new String(&quot;abc&quot;)
2017/10/25 Javascript
使用Nuxt.js改造已有项目的方法
2018/08/07 Javascript
详解微信图片防盗链“此图片来自微信公众平台 未经允许不得引用”的解决方案
2019/04/04 Javascript
Vue3.0结合bootstrap创建多页面应用
2019/05/28 Javascript
更强大的vue ssr实现预取数据的方式
2019/07/19 Javascript
解决layer 动态加载select 失效的问题
2019/09/18 Javascript
vue element-ui el-date-picker限制选择时间为当天之前的代码
2019/11/07 Javascript
Python编程语言的35个与众不同之处(语言特征和使用技巧)
2014/07/07 Python
Python3基础之基本数据类型概述
2014/08/13 Python
django模板加载静态文件的方法步骤
2019/03/01 Python
python控制台实现tab补全和清屏的例子
2019/08/20 Python
Python打印不合法的文件名
2020/07/31 Python
Pycharm2020最新激活码|永久激活(附最新激活码和插件的详细教程)
2020/09/29 Python
python实现三种随机请求头方式
2021/01/05 Python
美国女鞋品牌:naturalizer(娜然)
2016/08/01 全球购物
美国男女折扣服饰百货连锁店:Stein Mart
2017/05/02 全球购物
个人简历自荐信
2013/12/05 职场文书
员工拾金不昧表扬信
2014/01/09 职场文书
基督教婚礼主持词
2014/03/14 职场文书
教师师德考核自我评价
2014/09/13 职场文书
个人剖析材料及整改措施
2014/10/07 职场文书
2014年社区计生工作总结
2014/11/18 职场文书
2015羊年春节慰问信
2015/02/14 职场文书
厉害!这是Redis可视化工具最全的横向评测
2021/07/15 Redis