免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 无风之谷
打印 上一主题 下一主题

每个程序员都应该学习使用Python或Ruby,你怎么认为? [复制链接]

论坛徽章:
0
71 [报告]
发表于 2012-05-04 17:26 |只看该作者
回复 60# starwing83

这是语义问题。语法上可以换汤不换药。

论坛徽章:
3
卯兔
日期:2013-08-15 13:17:31处女座
日期:2014-01-10 11:35:23双子座
日期:2014-01-25 02:16:06
72 [报告]
发表于 2012-05-04 20:33 |只看该作者
回复 70# 幻の上帝


    感谢你的关注。我的本意只是想说明完成相同的任务,Python的代码量会少一点。想给大家一个直观的印象,而不是讨论算法的实现,这个C++代码也不是最优实现。

关于你提出的两个看法。
第一,为什么在这个算法实现中将C++程序main也计算在内,原因是这里进行对等比较,Python的代码可以进行单独输出。而C++的代码没有main入口,无法进行单独的输出。而且,在网上的C/C++算法中,大部分情况下是将main包含在内的。

每个Python脚本都有一个__name__属性,当直接执行这个脚本时,那么__name__将等于__main__,也就认为其有一个main程序,这个main程序就是脚本本身。这就是Python的优势之处。

第二,关于此处C++归并算法的代码长度,这里的归并算法只使用了<iostream>,但在代码中连include及using namespace都没有包含在内。相反,Python代码已经是完整的代码了。

诚然,此处归并算法的C++实现是很长,还有更好的实现。正如我在文中注明的那样,这个C++实现代码及下面的Python代码都是转自wiki相同的页面,我并没有说这是最佳的C++实现。再者,在不使用标准库的归并算法中,正常格式的C++代码再短,估计也有Python代码的3倍以上吧(30+行)。

论坛徽章:
3
卯兔
日期:2013-08-15 13:17:31处女座
日期:2014-01-10 11:35:23双子座
日期:2014-01-25 02:16:06
73 [报告]
发表于 2012-05-04 20:35 |只看该作者
回复 60# starwing83


    顺便说下,你写的非常好!

论坛徽章:
0
74 [报告]
发表于 2012-05-05 10:46 |只看该作者
回复 72# sunny7476

第一,环境支持代码包括UI在内不应该算作算法实现,这个有问题么?
在“可以运行的程序”中,大多数情况下,C++和python的代码长度的确不在一个层次上。但是你考虑过没有,C++适应多少环境,python又能适应多少?
第二,说过这段代码的罗嗦的原因不只是复用得烂了。目测不看算法都能缩掉1/3。

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
75 [报告]
发表于 2012-05-05 12:10 |只看该作者
这真让人遗憾

论坛徽章:
0
76 [报告]
发表于 2012-05-05 12:11 |只看该作者
本帖最后由 幻の上帝 于 2012-05-05 12:25 编辑

回复 10# sunny7476

python代码对应的C++代码也太挫了点……
替静态类型擦屁股的确得多费点劲,但也不至于这么罗嗦。瞎写了个:
  1. template<typename T>
  2. list<T> merge(list<T> l1, list<T> l2){
  3.         list<T> final;
  4.         while(!l1.empty() && !l2.empty())l1.front() < l2.front() ? (final.push_back(l1.front()), l1.pop_front()) : (final.push_back(l2.front()), l2.pop_front());
  5.         return final.splice(final.end(), l1), final.splice(final.end(), l2), final;
  6. }
  7. template<typename T>
  8. list<T> mergesort(list<T> l){
  9.         if(l.size() <= 1)return l;
  10.         auto mid(l.cbegin());
  11.         advance(mid, l.size() / 2);
  12.         return merge(mergesort(list<T>(l.cbegin(), mid)), mergesort(list<T>(mid, l.cend())));
  13. }
复制代码
对应的main:

  1. int main(){
  2.         auto l(mergesort(list<int>{3, 5, 3, 6, 4, 7, 5, 7, 4}));
  3.         for_each(l.begin(), l.end(), [](const int& i){cout<< i <<' ';});
  4.         cout << endl;
  5. }
复制代码
再补个用list::merge的:
  1. template<typename T>
  2. list<T> mergesort(list<T> l){
  3.         if(l.size() <= 1)return l;
  4.         const auto mid(next(l.cbegin(), l.size() / 2));
  5.         auto ll(mergesort(list<T>(l.cbegin(), mid)));
  6.         return ll.merge(mergesort(list<T>(mid, l.cend()))), ll;
  7. }
复制代码
(嘛……缩进莫名其妙乱了,再编辑一下好了。)

论坛徽章:
3
卯兔
日期:2013-08-15 13:17:31处女座
日期:2014-01-10 11:35:23双子座
日期:2014-01-25 02:16:06
77 [报告]
发表于 2012-05-05 15:11 |只看该作者
回复 74# 幻の上帝


    你写的C++代码的确费心了,水平很不错,这也是我目前见过最短的归并实现了,这个我承认,不过也有20多行(各自代码风格不一样,且使用了最新的C++11的标准库)。如果你说这是你瞎写的,那是我见识不够广,没话可说。不过此代码不适合用来给别人介绍归并算法。

至于我们争论的地方,其实中心点就一个,你也说出来了,那就是“大多数情况下,C++和python的代码长度的确不在一个层次上”,这一句就可以了。其他的都在话题之外。

论坛徽章:
1
未羊
日期:2014-09-08 22:47:27
78 [报告]
发表于 2012-05-06 10:24 |只看该作者
难道 Perl 很差吗?似乎这里的人对 Perl 不屑一顾。

论坛徽章:
0
79 [报告]
发表于 2012-05-06 21:30 |只看该作者
perl还行,可以玩单行脚本

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
80 [报告]
发表于 2012-05-07 09:44 |只看该作者
回复 77# sunny7476


    您不会数数么…………

不用stl的只有13行,用merge的只有7行,对应python却有9行,而且是在没有大括号的情况下(大括号单占一行很亏的)。别说不能用C++11,难道你工作的时候不允许用Python3.2?就算是这样难道你不喜欢新的Python?也别说不用stl,有本事python也别用[]啊append啊什么的,这和stl是平等的关系。

最重要的是,代码行数实际上和写代码的速度完全没有关系,如果要我说,在摈弃了编码速度的考虑下(对于打字还成为其编码瓶颈的人来说,行数越多更利于练习打字),编码的复杂度才是最最影响效率的。求圆周率的四行代码看过吧?我相信这四行你写一天也未必能搞出来。如果写无脑代码我相信任何程序员1000行/天都是小case。就这个代码,我以一个Python和C++的使用者的眼光看,最好写的是那个长长的C++,完全不必动脑,其次是Python,你得想很多东西,包括那个怪异的+l1,我相信在没有l1.copy()的年代里这个苦逼用法也并不是每个人都知道的。最后才是那几个超短的C++程序,虽然比Python短,单书写起来绝对更费脑子。

记住,代码行数绝不代表写这些代码的速度!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP