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

 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. C#读取信息备份

    class Program { static void Main(string[] args) { var wc = new WebClient(); var html = wc.DownloadSt ...

  2. Jmeter关于数据库的测试(mysql数据库)

    建立jdbc链接:创建JDBC Connection Configuration. 添加——配置元件——JDBC Connection configuration: 配置JDBC Connection ...

  3. mybatis的resultMap自定义结果映射规则

    dao接口 User myGetUserById(Integer id); sql xml自定义封装规则 <!--自定义某个javabean的封装规则 type:自定义规则的java类型 id: ...

  4. spring加载属性(properties)文件

    一.注解方式加载 jdbc.driver=org.mariadb.jdbc.Driver jdbc.url=jdbc:mariadb://localhost:3306/kt jdbc.user=roo ...

  5. 绘图驱动-OSD原理2

    转载自:http://blog.pfan.cn/programming/21209.html 现在已经可以通过修改存储单元内容来改变OSD的像素,但还有个关键的问题是如何根据需要来进行操作,即如何将某 ...

  6. Office365学习笔记—获取当前用户

    1,页面上有个_spPageContextInfo对象,可以获取一些我们需要的东西. (1)获取当前用户Id var userId=_spPageContextInfo.userId; (2)获取当前 ...

  7. python3爬虫编码问题

    使用爬虫爬取网页经常遇到各种编码问题,因此产生乱码今天折腾了一天,全部总结一遍环境:win10,pycharm,python3.41.首先先来网页编码是utf-8的:以百度首页为例:使用request ...

  8. Oracle查找lobsegment、lobindex对应的表

    在查看表空间的使用情况的时候,发现有几个LOBSEGMENT.LOBINDEX类型的对象占用了大量的空间.于是想找出那些表占用了大量的空间,以便于清理.        Oracle对BLOB类型的定义 ...

  9. springBoot 官方整合的redis 使用教程:(StringRedisTemplate 方式存储 Object类型value)

    前言:最近新项目准备用 redis 简单的缓存 一些查询信息,以便第二次查询效率高一点. 项目框架:springBoot.java.maven  说明:edis存储的数据类型,key一般都是Strin ...

  10. ASP.Net 中的三种控件

    ---恢复内容开始--- 第一种:HTML控件 ASP.Net把HTML控件当成普通字符串渲染到浏览器端,不去检查正确性.无法在服务器端进行处理. 比如: <input111 type=&quo ...