在伯乐在线上看到了个冷笑话,感觉很有意思。

 void tellStory()
{
printf("从前有座山\n");
printf("山上有座庙\n");
printf("庙里有个老和尚和一个小和尚\n");
printf("有一天\n");
printf("小和尚对老和尚说\n");
printf("\"给我讲个故事吧\"\n");
printf("于是, 老和尚说: \n");
tellStory();
}

原代码是C写的,试着转换成了python:

 #!/bin/env
# encoding: utf-8 def tellStory(cnt):
print "从前有座山\n"
print "山上有座庙\n"
print "庙里有个老和尚和一个小和尚\n"
print "有一天\n"
print "小和尚对老和尚说\n"
print "\"给我讲个故事吧\"\n"
print "于是, 老和尚说: \n"
print "-----------\n在%s年前\n" % cnt
cnt += 2
tellStory(cnt) if __name__ == '__main__':
tellStory(1)

不过由于python编译器对递归最大嵌套层数的限制,这个版本执行的并不理想,于是几经google有了以下版本:

#!/bin/env
# encoding: utf-8 from sys import maxint def tellStory(cnt):
rtn_str = ''
rtn_str += "从前有座山\n"
rtn_str += "山上有座庙\n"
rtn_str += "庙里有个老和尚和一个小和尚\n"
rtn_str += "有一天\n"
rtn_str += "小和尚对老和尚说\n"
rtn_str += "\"给我讲个故事吧\"\n"
rtn_str += "于是, 老和尚说: \n"
rtn_str += "-----------\n在%s年前\n" % cnt
yield rtn_str if __name__ == '__main__':
for i in xrange(1, maxint, 2):
for e in tellStory(i):
print e

使用yield+xrange代替print+range,避免出现中间变量过大导致的MemoryError。

这个版本会无限执行下去,直到达到py的最大整数"9223372036854775807"或系统内存不足。

总结:

1、Python中++运算符作用与其他语言有很大不同:

>>> i = 1
>>> ++i
1
>>> i++
File "<stdin>", line 1
i++
^
SyntaxError: invalid syntax
>>>

要实现自加或自减运算,最好使用+=或-=。

2、Python中range方法会直接生成一个list供遍历或其他操作,而xrange的工作方式类似使用了yield的生成器,每次调用时计算一个值返回。因此在遍历时,xrange的性能要优于range,特别是数据量巨大的情况下。

程序员的冷笑话 python版本的更多相关文章

  1. C程序员眼里的Python

    注释 Phython的注释和C语言非常不同,第一种 #开头的注释,类似于C的//开头,而"""对 包围注释,类似于C的/* */,以及xml类的<!--    -- ...

  2. [python]通过微信公众号“Python程序员”,编写python代码

    今天发现微信公众号中,居然可以编写python代码,很是惊喜,觉得蛮有趣的. 步骤如下: 1.关注微信公众号“Python程序员” 2.关注成功后,点击右下角的“潘多拉”->"Pyth ...

  3. 资深程序员:学Python我推荐你用这几款编辑器

    Python使用什么编辑比较好,Python编辑器推荐 各位 Pythoner 好啊!在这个烦躁的时代,相聚就是缘分,很高兴各位 Pythoner 能相聚于此,希望接下来的路,我们一起走下去,使用 P ...

  4. java程序员快速掌握python系列——概述

    这一系列主要是总结学习python过程中的方方面面(已经学完,时间大概是一周左右).当然限于个人水平java也就是够用,python短时间内也不可能深入到哪里去.所以这次的分享的目的是能够快速使用py ...

  5. 给Lisp程序员的Python简介

    给Lisp程序员的Python简介 作者:Peter Norvig,译者:jineslong<zzljlu@gmail.com> 这是一篇为Lisp程序员写的Python简介(一些Pyth ...

  6. Python/Java程序员面试必备常用问题解析与答案

    转自AI算法联盟,理解python技术问题,以及一些常见的java面试中经常遇到的问题,这些面试问题分为四类: 是什么(what) 如何做(how) 说区别/谈优势(difference) 实践操作( ...

  7. 30个有关Python的小技巧,给程序员的 30 个基本 Python 贴士与技巧

    30个有关Python的小技巧 2013/07/04 · Python, 开发 · 4 评论 · Python 分享到: 66 本文由 伯乐在线 - Kevin Sun 翻译.未经许可,禁止转载!英文 ...

  8. Python超级程序员使用的开发工具

    我以个人的身份采访了几个顶尖的Python程序员,问了他们以下5个简单的问题: 当前你的主要开发任务是什么? 你在项目中使用的电脑是怎样的? 你使用什么IDE开发? 你将来的计划是什么? 有什么给Py ...

  9. 程序员带你十天快速入门Python,玩转电脑软件开发(三)

    声明:本次教程主要适用于已经习得一门编程语言的程序员.想要学习第二门语言.有梦想,立志做全栈攻城狮的你 . 如果是小白,也可以学习本教程.不过可能有些困难.如有问题在文章下方进行讨论.或者添加QQ群5 ...

随机推荐

  1. 3springboot:springboot配置文件(外部配置加载顺序、自动配置原理,@Conditional)

    1.外部配置加载顺序 SpringBoot也可以从以下位置加载配置: 优先级从高到低 高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置  1.命令行参数 所有的配置都可以在命令行上进行指定 ...

  2. yolo2 anchor选择校招总结

    使用kmeans的聚类算法选择数据集最可能的anchor size和ratio.K-means算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大. ...

  3. h5做的app和原生app的区别

    之所以说h5做的app和原生app的区别,是因为一位博友的问题: 随着 h5 的普及,是不是不再需要开发 app ? 我的回答是要分业务需求,分场合而定. 比如现在的微信小程序这么流行,甚至也取代了不 ...

  4. VS2008 工具栏CMFCToolBar的使用总结(转)

    (一)自定义工具栏 自定义工具栏,分两种情况:一是直接添加工具栏,并自己绘制图标:二是,添加工具栏,然后与BMP关联,与VC6.0中的自定义彩色工具栏类似. 1.  自绘工具栏 1)添加Toolbar ...

  5. sql传统的拼接带来的危害

    现在大家来学习下sql是如何注入的,传统的拼接字符串会造成 注入形式就是在变量那使用<1=1>这样查询无论怎样都是正确的 -- var sql = "select name fr ...

  6. Gradle Goodness: Adding Tasks to a Predefined Group

    In Gradle we can group related tasks using the group property of a task. We provide the name of our ...

  7. 绘图驱动-OSD原理1

    OSD(On Screen Display)是屏幕显示技术的一种,用于在显示终端上显示字符.图形和图像.实现的过程为:存储器(一般为内存的一段)的内容与显示终端上的像素一一对应.这种一一对应的关系一般 ...

  8. MySql第几行到第几行语句

    1.查询第一行记录: select * from table limit 1 2.查询第n行到第m行记录 select * from table1 limit n-1,m-n; SELECT * FR ...

  9. trunc(sysdate)的含义是什么

    1.ORACLE中TRUNC是截取的函数

  10. 『ACM C++』 PTA 天梯赛练习集L1 | 046-47

    今日刷题 ------------------------------------------------L1-046----------------------------------------- ...