通过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中尝试多线程编程的一个简明例子
Apr 07 Python
python使用socket向客户端发送数据的方法
Apr 29 Python
利用Python获取赶集网招聘信息前篇
Apr 18 Python
python判断字符串编码的简单实现方法(使用chardet)
Jul 01 Python
Python简单生成随机数的方法示例
Mar 31 Python
python中将一个全部为int的list 转化为str的list方法
Apr 09 Python
利用django+wechat-python-sdk 创建微信服务器接入的方法
Feb 20 Python
Django 拆分model和view的实现方法
Aug 16 Python
python二分法查找算法实现方法【递归与非递归】
Dec 06 Python
Python pandas如何向excel添加数据
May 22 Python
通过实例解析python创建进程常用方法
Jun 19 Python
提取视频中的音频 Python只需要三行代码!
May 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
php中生成随机密码的自定义函数代码
2013/10/21 PHP
PHP引用(&amp;)各种使用方法实例详解
2014/03/20 PHP
CI框架给视图添加动态数据
2014/12/01 PHP
Laravel 5 框架入门(三)
2015/04/09 PHP
PHP生成json和xml类型接口数据格式
2015/05/17 PHP
PhpStorm本地断点调试的方法步骤
2018/05/21 PHP
基于Laravel-admin 后台的自定义页面用法详解
2019/09/30 PHP
使用JS操作页面表格,元素的一些技巧
2007/02/02 Javascript
js正文内容高亮效果的实现方法
2013/06/30 Javascript
jquery实现select下拉框美化特效代码分享
2015/08/18 Javascript
js只执行1次的函数示例
2016/07/20 Javascript
JS简单实现仿百度控制台输出信息效果
2016/09/04 Javascript
js实现带缓动动画的导航栏效果
2017/01/16 Javascript
Vue单页及多页应用全局配置404页面实践记录
2018/05/22 Javascript
vue 中引用gojs绘制E-R图的方法示例
2018/08/24 Javascript
基于Webpack4和React hooks搭建项目的方法
2019/02/05 Javascript
浅谈JavaScript 声明提升
2020/09/14 Javascript
浅谈Python单向链表的实现
2015/12/24 Python
Python使用正则表达式抓取网页图片的方法示例
2017/04/21 Python
Python字符串格式化%s%d%f详解
2018/02/02 Python
Python解析Excle文件中的数据方法
2018/10/23 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
2019/06/19 Python
利用OpenCV和Python实现查找图片差异
2019/12/19 Python
Python 使用 prettytable 库打印表格美化输出功能
2019/12/26 Python
Python中实现输入超时及如何通过变量获取变量名
2020/01/18 Python
python 用Matplotlib作图中有多个Y轴
2020/11/28 Python
HTML5打开本地app应用的方法
2016/03/31 HTML / CSS
canvas中普通动效与粒子动效的实现代码示例
2019/01/03 HTML / CSS
土木工程专业个人求职信
2013/12/30 职场文书
聘用意向书范本
2014/04/01 职场文书
学习教师法的心得体会
2014/09/03 职场文书
感恩祖国演讲稿
2014/09/09 职场文书
早读课迟到检讨书
2014/09/25 职场文书
临床医学生职业规划书范文
2014/10/25 职场文书
新员工试用期自我评价
2015/03/10 职场文书
银行安全保卫工作总结
2015/08/10 职场文书