通过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 中文字符串的处理实现代码
Oct 25 Python
python中getaddrinfo()基本用法实例分析
Jun 28 Python
python比较两个列表是否相等的方法
Jul 28 Python
python中将函数赋值给变量时需要注意的一些问题
Aug 18 Python
使用paramiko远程执行命令、下发文件的实例
Oct 01 Python
浅谈Python中带_的变量或函数命名
Dec 04 Python
python如何重载模块实例解析
Jan 25 Python
解决python中使用PYQT时中文乱码问题
Jun 17 Python
简单了解Python生成器是什么
Jul 02 Python
django fernet fields字段加密实践详解
Aug 12 Python
Python实现定时监测网站运行状态的示例代码
Sep 30 Python
PyMongo 查询数据的实现
Jun 28 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开发需要注意的安全问题
2010/09/01 PHP
php存储过程调用实例代码
2013/02/03 PHP
thinkPHP5.0框架配置格式、加载解析与读取方法
2017/03/17 PHP
javascript innerHTML、outerHTML、innerText、outerText的区别
2008/11/24 Javascript
在多个页面使用同一个HTML片段《续》
2011/03/04 Javascript
Nodejs全栈框架StrongLoop推荐
2014/11/09 NodeJs
jQuery实现企业网站横幅焦点图切换功能实例
2015/04/30 Javascript
drag-and-drop实现图片浏览器预览
2015/08/06 Javascript
最棒的Angular2表格控件
2016/08/10 Javascript
AngularJs bootstrap详解及示例代码
2016/09/01 Javascript
JavaScript获取服务器时间的方法详解
2016/12/11 Javascript
jQuery获取table下某一行某一列的值实现代码
2017/04/07 jQuery
Vue学习之路之登录注册实例代码
2017/07/06 Javascript
nodejs socket服务端和客户端简单通信功能
2017/09/14 NodeJs
AngularJS 实现购物车全选反选功能
2017/10/24 Javascript
利用three.js画一个3D立体的正方体示例代码
2017/11/19 Javascript
vue+iview写个弹框的示例代码
2017/12/05 Javascript
JS严格模式知识点总结
2018/02/27 Javascript
nodejs 简单实现动态html的方法
2018/05/12 NodeJs
javascript中的数据类型检测方法详解
2019/08/07 Javascript
vue使用recorder.js实现录音功能
2019/11/22 Javascript
Python 爬虫多线程详解及实例代码
2016/10/08 Python
Zabbix实现微信报警功能
2016/10/09 Python
浅谈python 读excel数值为浮点型的问题
2018/12/25 Python
如何使用django的MTV开发模式返回一个网页
2019/07/22 Python
django 自定义过滤器(filter)处理较为复杂的变量方法
2019/08/12 Python
Python多线程及其基本使用方法实例分析
2019/10/29 Python
opencv python Canny边缘提取实现过程解析
2020/02/03 Python
Python中实现一行拆多行和多行并一行的示例代码
2020/09/06 Python
YOOX美国官方网站:全球著名的多品牌时尚网络概念店
2016/09/11 全球购物
澳大利亚免息网上购物:Shop Zero
2016/09/17 全球购物
Tretorn美国官网:瑞典外套和鞋类品牌,抵御风雨
2018/07/19 全球购物
QA工程师岗位职责
2013/11/20 职场文书
国庆节文艺活动方案
2014/02/03 职场文书
2016年教师节慰问信
2015/12/01 职场文书
JS封装cavans多种滤镜组件
2022/02/15 Javascript