通过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中的getattr(),setattr(),delattr(),hasattr()
Jun 14 Python
利用Python爬取可用的代理IP
Aug 18 Python
微信跳一跳小游戏python脚本
Jan 05 Python
儿童python练习实例
May 27 Python
浅谈python写入大量文件的问题
Nov 09 Python
python3.6实现学生信息管理系统
Feb 21 Python
Python 常用模块 re 使用方法详解
Jun 06 Python
django 中使用DateTime常用的时间查询方式
Dec 03 Python
python requests模拟登陆github的实现方法
Dec 26 Python
python3.9实现pyinstaller打包python文件成exe
Dec 13 Python
python中tkinter复选框使用操作
Nov 11 Python
python基础之//、/与%的区别详解
Jun 10 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
10个实用的PHP代码片段
2011/09/02 PHP
thinkphp3.2实现跨控制器调用其他模块的方法
2017/03/14 PHP
PHP PDOStatement::bindParam讲解
2019/01/30 PHP
ExtJs中简单的登录界面制作方法
2010/08/19 Javascript
10个基于Jquery的幻灯片插件教程
2010/10/29 Javascript
jQuery学习笔记之jQuery的动画
2010/12/22 Javascript
按钮JS复制文本框和表格的代码
2011/04/01 Javascript
windows系统下简单nodejs安装及环境配置
2013/01/08 NodeJs
javascript中不等于的代码是什么怎么写
2013/12/29 Javascript
JS使用ajax从xml文件动态获取数据显示的方法
2015/03/24 Javascript
jQuery制作效果超棒的手风琴折叠菜单
2015/04/03 Javascript
JavaScript实现点击按钮切换网页背景色的方法
2015/10/17 Javascript
EasyUI Pagination 分页的两种做法小结
2016/07/09 Javascript
Angular多选、全选、批量选择操作实例代码
2017/03/10 Javascript
JS闭包用法实例分析
2017/03/27 Javascript
详解如何用babel转换es6的class语法
2018/04/03 Javascript
JavaScript This指向问题详解
2019/11/25 Javascript
python实现的一个火车票转让信息采集器
2014/07/09 Python
纯Python开发的nosql数据库CodernityDB介绍和使用实例
2014/10/23 Python
python中assert用法实例分析
2015/04/30 Python
Python标准库之Sys模块使用详解
2015/05/23 Python
将Python的Django框架与认证系统整合的方法
2015/07/24 Python
Python打造出适合自己的定制化Eclipse IDE
2016/03/02 Python
tensorflow 获取变量&amp;打印权值的实例讲解
2018/06/14 Python
解决Python plt.savefig 保存图片时一片空白的问题
2019/01/10 Python
Python+PyQt5实现美剧爬虫可视工具的方法
2019/04/25 Python
PyCharm 创建指定版本的 Django(超详图解教程)
2019/06/18 Python
python实现电子词典
2020/03/03 Python
Java ExcutorService优雅关闭方式解析
2020/05/30 Python
Nuts.com:优质散装,批发坚果、干果和巧克力等
2017/03/21 全球购物
口头翻译求职人自荐信
2013/12/07 职场文书
校园达人秀策划书
2014/01/12 职场文书
幼儿园2015年度工作总结
2015/04/01 职场文书
2015教师节通讯稿
2015/07/20 职场文书
严以律己专题学习研讨会发言材料
2015/11/09 职场文书
表扬信范文
2019/04/22 职场文书