免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
3
卯兔
日期:2013-08-15 13:17:31处女座
日期:2014-01-10 11:35:23双子座
日期:2014-01-25 02:16:06
1 [报告]
发表于 2012-04-26 21:16 |显示全部楼层
第一个正式学习的语言就是Python,这里的“正式学习”是指真正开始用一门语言做东西,在学校里开了《XXX程序设计》一门课并去上了但没自己做东西不算。

先发点牢骚吧。大环境所致,用Python做东西,别人会说你不“正统”:
情节1:
“我要用Python写程序”
——“厉害的程序都是C/C++写的,。。。(此处不宜显示,省略)”。
“做相同的事情,Python用的代码比其他语言要少,能节省时间”。
——“年轻人不要怕吃苦,光想着偷懒”。

情节2:
“我这是Python写的,来学吧,Python会节省大量的时间!”
——“哦,我看看,。Python安装哪个版本啊?”
“先用2.7的”
——“……@#¥%……(安装中)没有像C#一样的官方IDE啊?”
“IDE只是个工具,(解释。。。)”
——“Python用到的库都要自己配,怎么界面还不能拖出来,还有那么多“界面库”(某位同学是这么称呼的)工具,选哪个啊?”
“有Python自带的tk,还有wxPython、PyQt、PyGTK。这些都有各自的所见即所得的界面设计工具”
——“什么乱七八糟的,不玩了,去看我的C#去。。。”

情节3:
(碰到一个用Python的,先聊了一会。。。捧了下Python)
——“你是用什么框架的,Django?”
“我是用Python做桌面的”
——“Python的长处是做网络的啊,做桌面的速度多慢啊。”
“(沉默,不知道怎么回答)”

     当然,这跟我处的环境有关,我一般接触不到纯粹以写代码为工作的人。而是一些为了完成一些目标,用一些程序来实现,看这些目标能否实现。他们认为,无法快速“拖”出窗口的语言,就不是简单易学的语言(微软“害人不浅”啊)。

    接触到Python的人,都会听说Python的代码量少,尽管Python的教材上有了暗含的例子,可是并没有直观的印象。这里就贴一段比较代码吧(Wiki上找到的,根据“合理引用“规则引用,版权归Wiki所有)。
归并排序的,C++代码
  1. void Merge(int a[], int b[], int low, int mid, int high)
  2. {
  3.     int k = low;
  4.     int begin1 = low;
  5.     int end1 = mid;
  6.     int begin2 = mid + 1;
  7.     int end2 = high;
  8.     while(begin1 <= end1 && begin2 <= end2)
  9.     {
  10.         if(a[begin1] <= a[begin2])
  11.             b[k++] = a[begin1++];
  12.         else
  13.             b[k++] = a[begin2++];
  14.     }
  15.     if(begin1 <= end1)
  16.         for(int q = begin1; q <= end1; q++)
  17.             b[k++] = a[q];
  18.     else
  19.         for(int q = begin2; q <= end2; q++)
  20.             b[k++] = a[q];
  21. }

  22. void MergePass(int a[], int b[], int seg, int size)
  23. {
  24.     int seg_start_ind = 0;
  25.     while(seg_start_ind <= size - 2 * seg)
  26.     {
  27.         Merge(a, b, seg_start_ind, seg_start_ind + seg - 1, seg_start_ind + seg * 2 - 1);
  28.         seg_start_ind += 2 * seg;
  29.     }
  30.    
  31.     if(seg_start_ind + seg < size)
  32.         Merge(a, b, seg_start_ind, seg_start_ind + seg - 1, size - 1);
  33.     else
  34.         for(int j = seg_start_ind; j < size; j++)
  35.             b[j] = a[j];
  36. }

  37. void MergeSort(int a[], int size)
  38. {
  39.     int* temp = new int[size];
  40.     int seg = 1;
  41.     while(seg < size)
  42.     {
  43.         MergePass(a, temp, seg, size);
  44.         seg += seg;
  45.         MergePass(temp, a, seg, size);
  46.         seg += seg;
  47.     }
  48. }

  49. int main()
  50. {
  51.     int a[] = {3, 5, 3, 6, 4, 7, 5, 7, 4};
  52.     MergeSort(a, sizeof(a) / sizeof(*a));
  53.     //输出
  54.     for(int i = 0; i < sizeof(a) / sizeof(*a); i++)
  55.         cout << a[i] << ' ';
  56.     cout << endl;

  57.     return 0;
  58. }
复制代码
对应的Python代码:
  1. def merge(l1,l2):
  2.     final=[]
  3.     while l1 and l2:
  4.         final.append(l1[0] <= l2[0] and l1.pop(0) or l2.pop(0))
  5.     return final +l1 + l2
  6. def mergesort(List):
  7.     mid=int(len(List)/2)
  8.     if len(List)<=1:return List
  9.     return merge(mergesort(List[:mid]),mergesort(List[mid:]))
复制代码
代码量的多少一目了然。
正如同楼主所说,关于Python和其他语言做比较的文章在Google上一大把,这里就不细说了。
就那一句:Python的确能节省你很多时间!!!

最后,还有一个小小的希望:希望PyPy能火起来。。。

论坛徽章:
3
卯兔
日期:2013-08-15 13:17:31处女座
日期:2014-01-10 11:35:23双子座
日期:2014-01-25 02:16:06
2 [报告]
发表于 2012-04-27 13:49 |显示全部楼层
回复 15# ecjtubaowp


    恩,谢谢指正,本代码转自wiki,代码我也看了,是多了一点,但即使简化一点也还是Python的两倍以上。

论坛徽章:
3
卯兔
日期:2013-08-15 13:17:31处女座
日期:2014-01-10 11:35:23双子座
日期:2014-01-25 02:16:06
3 [报告]
发表于 2012-04-27 21:04 |显示全部楼层
回复 31# Sevk


    代码是引自wiki上的,复制时也没发生错误。所有代码都亲测可行。请阁下指出错误在哪。

论坛徽章:
3
卯兔
日期:2013-08-15 13:17:31处女座
日期:2014-01-10 11:35:23双子座
日期:2014-01-25 02:16:06
4 [报告]
发表于 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
5 [报告]
发表于 2012-05-04 20:35 |显示全部楼层
回复 60# starwing83


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

论坛徽章:
3
卯兔
日期:2013-08-15 13:17:31处女座
日期:2014-01-10 11:35:23双子座
日期:2014-01-25 02:16:06
6 [报告]
发表于 2012-05-05 15:11 |显示全部楼层
回复 74# 幻の上帝


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

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

论坛徽章:
3
卯兔
日期:2013-08-15 13:17:31处女座
日期:2014-01-10 11:35:23双子座
日期:2014-01-25 02:16:06
7 [报告]
发表于 2012-05-07 11:09 |显示全部楼层
本帖最后由 sunny7476 于 2012-05-07 11:11 编辑

回复 80# starwing83


    在我说明他的行数时,我已经注明是根据风格的不同得到不同的计算结果。单一的算法实现,这里我是把main加进去,并按大括号另起来计算的(若您的观点不同,我尊重,我实在不想争这些。。。)。重要的是我哪句话说了“不能用C++11”的,我只是点明了他写的代码使用了C++11的功能。

您在第二段内容的观点我完全同意,我在77楼的开头也说了,他写的那三段代码很优秀(不过他还谦虚的说是“瞎写”的)。但您的语气好像是我将代码的行数与代码的技术含量简单的归纳成一个正比关系一样,请问你是从哪里得出我有这样的观点的?

谈到“比拼”的话题,很容易就走入极端。没想到一个想说明“Python通常情况下比C++短”的观点中一段“逻辑简单而书写繁琐”的代码会引起C++使用者的关注,然后尽力缩短C++的长度(语言的比较就此打住,这个观点在许多论坛上都发动一场结果是谁也不服谁的圣战)。这本书——《梦断代码》中,其中也有Guido的一句话,说Python的代码在通常情况下会比C++短3倍,5倍,甚至10倍(这是我回想的,可能与原话有点出入)。我的观点就是认同Guido的这个观点,他默认的前提应该是相似的代码复杂度(说清楚,不然又被制造出什么观点来了)。

我认同你在帖子里关于代码书写速度与行数的观点,但不要为了表达某种观点而事先假定别人持某种观点!

论坛徽章:
3
卯兔
日期:2013-08-15 13:17:31处女座
日期:2014-01-10 11:35:23双子座
日期:2014-01-25 02:16:06
8 [报告]
发表于 2012-05-07 17:10 |显示全部楼层
回复 87# 幻の上帝


    以后还多向你们学习学习。

论坛徽章:
3
卯兔
日期:2013-08-15 13:17:31处女座
日期:2014-01-10 11:35:23双子座
日期:2014-01-25 02:16:06
9 [报告]
发表于 2012-05-14 16:51 |显示全部楼层
回复 132# haitao


    嗯,是的,这两处比较有失偏颇,以至于一些C++众对我口诛笔伐了。其实我的本意值是想说明Python比C++简洁一点,仅此而已了。当然,C++的那一段太臃肿了。

论坛徽章:
3
卯兔
日期:2013-08-15 13:17:31处女座
日期:2014-01-10 11:35:23双子座
日期:2014-01-25 02:16:06
10 [报告]
发表于 2012-05-15 07:54 |显示全部楼层
回复 135# walleeee


    是的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP