通过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 命令行非阻塞输入的小例子
Sep 27 Python
python中django框架通过正则搜索页面上email地址的方法
Mar 21 Python
Python 列表(List) 的三种遍历方法实例 详解
Apr 15 Python
Python实现端口检测的方法
Jul 24 Python
python使用matplotlib画饼状图
Sep 25 Python
Python3 中作为一等对象的函数解析
Dec 11 Python
Python 解析pymysql模块操作数据库的方法
Feb 18 Python
python画图常规设置方式
Mar 05 Python
python zip()函数的使用示例
Sep 23 Python
Python抓包并解析json爬虫的完整实例代码
Nov 03 Python
python 制作简单的音乐播放器
Nov 25 Python
python调用百度AI接口实现人流量统计
Feb 03 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实现数字补零功能的2个函数介绍
2014/05/12 PHP
网站防止被刷票的一些思路与方法
2015/01/08 PHP
利用PHP获取访客IP、地区位置、浏览器及来源页面等信息
2017/06/27 PHP
jquery blockUI 遮罩不能消失与不能提交的解决方法
2011/09/17 Javascript
JavaScript基本编码模式小结
2012/05/23 Javascript
基于JavaScript实现继承机制之原型链(prototype chaining)的详解
2013/05/07 Javascript
JS Map 和 List 的简单实现代码
2013/07/08 Javascript
使用js实现关闭js弹出层的窗口
2014/02/10 Javascript
js实现星星打分效果的方法
2020/07/05 Javascript
简介JavaScript中的unshift()方法的使用
2015/06/09 Javascript
javascript高级选择器querySelector和querySelectorAll全面解析
2016/04/07 Javascript
JavaScript中子对象访问父对象的方式详解
2016/09/01 Javascript
jQuery选择器_动力节点Java学院整理
2017/07/05 jQuery
Angular.js自动化测试之protractor详解
2017/07/07 Javascript
Vue.js数据绑定之data属性
2017/07/07 Javascript
BootStrap Table复选框默认选中功能的实现代码(从数据库获取到对应的状态进行判断是否为选中状态)
2017/07/11 Javascript
jsTree事件和交互以及插件plugins详解
2017/08/29 Javascript
深入理解Vue router的部分高级用法
2018/08/15 Javascript
layui表格数据复选框回显设置方法
2019/09/13 Javascript
[53:10]完美世界DOTA2联赛决赛日 FTD vs GXR 第二场 11.08
2020/11/11 DOTA
Python 的 Socket 编程
2015/03/24 Python
python简单获取本机计算机名和IP地址的方法
2015/06/03 Python
Python中动态检测编码chardet的使用教程
2017/07/06 Python
对Python 3.2 迭代器的next函数实例讲解
2018/10/18 Python
详解Django CAS 解决方案
2019/10/30 Python
python分别打包出32位和64位应用程序
2020/02/18 Python
Python线程threading模块用法详解
2020/02/26 Python
HTML5验证以及日期显示的实现详解
2013/07/05 HTML / CSS
de Bijenkorf比利时官网:荷兰最知名的百货商店
2017/06/29 全球购物
英国羊绒服装购物网站:Pure Collection
2018/10/22 全球购物
存储过程的优点有哪些
2012/09/27 面试题
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
2014/07/27 面试题
医院标语大全
2014/06/23 职场文书
村级干部党员公开承诺事项
2015/05/04 职场文书
python中的3种定义类方法
2021/11/27 Python
在SQL Server中使用 Try Catch 处理异常的示例详解
2022/07/15 SQL Server