通过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的Django框架实现事务交易管理的教程
Apr 20 Python
python实现的二叉树定义与遍历算法实例
Jun 30 Python
浅谈python日志的配置文件路径问题
Apr 28 Python
如何实现删除numpy.array中的行或列
May 08 Python
使用Python对微信好友进行数据分析
Jun 27 Python
如何用Python实现简单的Markdown转换器
Jul 16 Python
python正则表达式之对号入座篇
Jul 24 Python
使用python实现http及ftp服务进行数据传输的方法
Oct 26 Python
Python实现蒙特卡洛算法小实验过程详解
Jul 12 Python
python实现简易淘宝购物
Nov 22 Python
Python Mock模块原理及使用方法详解
Jul 07 Python
Python DataFrame使用drop_duplicates()函数去重(保留重复值,取重复值)
Jul 20 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
2020年4月新番动漫目录 官方宣布4月播出的作品一览
2020/03/08 日漫
PHP利用func_get_args和func_num_args函数实现函数重载实例
2014/11/12 PHP
php结合正则获取字符串中数字
2015/06/19 PHP
教大家制作简单的php日历
2015/11/17 PHP
thinkPHP框架对接支付宝即时到账接口回调操作示例
2016/11/14 PHP
Laravel框架控制器的request与response用法示例
2019/09/30 PHP
Javascript保存网页为图片借助于html2canvas库实现
2014/09/05 Javascript
jQuery对指定元素中指定字符串进行替换的方法
2015/03/17 Javascript
JS动画效果打开、关闭层的实现方法
2015/05/09 Javascript
jQuery多级联动下拉插件chained用法示例
2016/08/20 Javascript
Mui使用jquery并且使用点击跳转新窗口的实例
2017/08/19 jQuery
微信小程序使用slider设置数据值及switch开关组件功能【附源码下载】
2017/12/09 Javascript
微信小程序版翻牌小游戏
2018/01/26 Javascript
JavaScript对象拷贝与Object.assign用法实例分析
2018/06/20 Javascript
Vue中实现权限控制的方法示例
2019/06/07 Javascript
JavaScript实现切换多张图片
2021/01/27 Javascript
[01:08]2014DOTA2展望TI 剑指西雅图LGD战队专访
2014/06/30 DOTA
Python使用Flask框架获取当前查询参数的方法
2015/03/21 Python
在Python的Flask框架中使用日期和时间的教程
2015/04/21 Python
Python编写一个闹钟功能
2017/07/11 Python
对Django项目中的ORM映射与模糊查询的使用详解
2019/07/18 Python
pandas中DataFrame修改index、columns名的方法示例
2019/08/02 Python
keras 解决加载lstm+crf模型出错的问题
2020/06/10 Python
在keras中model.fit_generator()和model.fit()的区别说明
2020/06/17 Python
如何用python写个模板引擎
2021/01/14 Python
BSTN意大利:德国街头和运动文化高品质商店
2020/12/22 全球购物
下述程序的作用是计算机数组中的最大元素值及其下标
2012/11/26 面试题
药学专业个人自我评价
2013/11/11 职场文书
应聘会计求职信
2014/06/11 职场文书
环卫工人节活动总结
2014/08/29 职场文书
民族学专业大学生职业规划范文:清晰未来的构想
2014/09/20 职场文书
教师群众路线心得体会
2014/11/04 职场文书
2014年护士个人工作总结
2014/11/11 职场文书
2014年工作总结与下年工作计划
2014/11/27 职场文书
学校食堂食品安全承诺书
2015/04/29 职场文书
Python词云的正确实现方法实例
2021/05/08 Python