资讯专栏INFORMATION COLUMN

你们以为我在学C++?其实我在学 Python

史占广 / 1071人阅读

摘要:但与的不同在于只能在编译期通过模板来使用,而不像那样在运行期作为单个对象来使用。看到这里,你是否发现用学习也不失为一种很妙的方式呢从这个问题的答案,可以看出也是同道中人呢。上面有更多的方式,教你用来学习参考资料

我会随便说,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:Python27Doc";
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{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{ { 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{};
std::copy_if(mylist.begin(), mylist.end(), std::back_inserter(result), [](int x){ return x >= 0; });

这样的函数在 中屡见不鲜,而且都在与 Python 中的某种功能遥相呼应:transform, any_of, all_of, min, max.

可变参数

Python 从一开始就支持可变参数了。你可以定义一个变参的函数,个数可以不确定,类型也可以不一样。

def foo(*args):
    for x in args:
        print(x);
        
foo(5, "hello", True)

C++11 增加了对参数包的支持。但与 Python 的不同在于:只能在编译期通过模板来使用,而不像 Python 那样在运行期作为单个对象来使用。

template  auto foo(T&&... args) {
    return std::make_tuple(args...);
}

auto triple = foo(5, "hello", true);

看到这里,你是否发现用 C++ 学习 Python 也不失为一种很妙的方式呢? 从这个问题的答案,可以看出 @MiloYip 也是同道中人呢。

继续

觉得不错?想要大展拳脚? 看看这个 repo 吧。上面有更多的方式,教你用 C++ 来学习 Python.


参考资料:http://preshing.com/20141202/cpp-has-become-more-pythonic


文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/45349.html

相关文章

  • 自学 JAVA 的几点建议

    摘要:自制力好的人,估计在保存后会翻出来看两眼,过几天又忘得一干二净了。多思考学会思考,养成多思考的习惯。以项目来驱动自己学习,整个过程将会有趣得多。后语以上就是我对自学的几点建议,希望对你们有帮助。 微信公众号:一个优秀的废人如有问题或建议,请后台留言,我会尽力解决你的问题。 showImg(https://segmentfault.com/img/remote/1460000018208...

    klinson 评论0 收藏0
  • 转行测试,11k入职,写了份1000多字的分享,每一笔都是经历

    摘要:从白天到晚上,不是在学就是在学的路上,从测试理论到实战操作,大大小小的问题,在群里前辈的帮助下,总是能很快解决。慢慢的,测试方法,用例设计,测试,测试,接口测试。大概面试了一周多,我就拿下了的。 ...

    luzhuqun 评论0 收藏0
  • 终于理解了伪类和伪元素

    摘要:伪类和伪元素,对于绝大多数同学来说,都是耳熟能详的名字,但确实又有很多人搞不清楚它们之间的区别,以致于混淆概念。除了上面这个本质区别以外,在中,伪类用单冒号表示而伪元素用双冒号表示。 showImg(https://segmentfault.com/img/bV4WC1?w=510&h=310); 伪类和伪元素,对于绝大多数同学来说,都是耳熟能详的名字,但确实又有很多人搞不清楚它们之间...

    张迁 评论0 收藏0
  • #的21天#《ES6 标准入门》-D1

    摘要:块级作用域中的块级作用域很有可能导致局部变量覆盖全局变量或者局部变量泄露成全局变量。也就是局部变量与全局变量不会打架块级作用域的出现,实际上使得获得广泛应用的立即执行匿名函数不再必要了。 let 和 const命令 1.let 命令 基本用法 语法类似 var,但是所声明的变量,只在 let 命令所在的代码块内有效。 在 for 循环中,就非常适合使用 let 声明变量。 var a...

    LeexMuller 评论0 收藏0
  • 耗时一周整理的Python资料,包含各阶段所需网站、项目,收藏了?慢慢来

    摘要:希望能够帮助到大家,减少在起步阶段的油耗,集中精神突破技术。在平时写代码的时候你不一定会用到,但是他却是你解决问题的思想源泉如果说算法是一个程序员的九阳神功,那么设计模式就是你的乾坤大挪移。 showImg(https://segmentfault.com/img/remote/1460000019249986); 不知怎么的,最近不少关注我的读者都开始私信我怎么学好python?零基...

    wean 评论0 收藏0

发表评论

0条评论

史占广

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<