程序员的冷笑话 python版本

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

 1 void tellStory()
 2 {
 3     printf("从前有座山\n");
 4     printf("山上有座庙\n");
 5     printf("庙里有个老和尚和一个小和尚\n");
 6     printf("有一天\n");
 7     printf("小和尚对老和尚说\n");
 8     printf("\"给我讲个故事吧\"\n");
 9     printf("于是, 老和尚说: \n");
10     tellStory();
11 }

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

 1 #!/bin/env
 2 # encoding: utf-8
 3
 4 def tellStory(cnt):
 5     print "从前有座山\n"
 6     print "山上有座庙\n"
 7     print "庙里有个老和尚和一个小和尚\n"
 8     print "有一天\n"
 9     print "小和尚对老和尚说\n"
10     print "\"给我讲个故事吧\"\n"
11     print "于是, 老和尚说: \n"
12     print "-----------\n在%s年前\n" % cnt
13     cnt += 2
14     tellStory(cnt)
15
16 if __name__ == ‘__main__‘:
17     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,特别是数据量巨大的情况下。

时间: 2024-11-04 22:47:19

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

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

今天发现微信公众号中,居然可以编写python代码,很是惊喜,觉得蛮有趣的. 步骤如下: 1.关注微信公众号“Python程序员” 2.关注成功后,点击右下角的“潘多拉”->"Python终端“->"阅读原文”. 3.Python开发页面被打开,在下面的输入框内,输入python代码,点击确认即可. 可以用来练习python,是不是很有趣呢?

程序员的瑞士军刀----Python

这篇文章比较难以成型.大概想表达的意思是,程序员应该通过脚本语言来完成一些"批量"或"自动化"的操作,而不是重复的去做体力劳动. 具体方式因人而异,比如有人非常熟悉bat或者shell的编写,或者有人非常熟悉php.perl的编写,而我更早接触了Python,所以很多工具更加习惯用Python来完成. 这里会先讲一下我的各种需求,以及脚本语言的选择,后面会针对Python逐渐补全很多"惯用法",把自己常用的功能和代码段记录下来. 一.综述 Pyt

程序员之数据分析Python技术栈

引言: Python是一种非常流行的脚本语言,其还提供了一个科学技术栈,可以进行快捷方便的数据分析,本系列文章将聚焦在如何使用基于Python的技术栈来构建数据分析的工具集合.工欲善其事,必先利其器,让我们来看看这些工具吧. 0. 数据分析 以及机器学习 信息时代唯一不变的就是变化. 随着信息化技术的推广和应用,大数据技术的大规模应用,于是乎数据分析.数据挖掘.机器学习甚至于从前高大上的人工智能(AI)已经开始频繁出现在各个场合,这一切昭示着数据时代的来临. 对于程序猿们来说,除了写代码,实现特

神级程序员巧用python开发王者荣耀把妹神器,一路升级上王者!

Python(发音:英[?pa?θ?n],美[?pa?θɑ:n]),是一种面向对象.直译式电脑编程语言,也是一种功能强大的通用型语言,已经具有近二十年的发展历史,成熟且稳定.它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务.它的语法非常简捷和清晰,与其它大多数程序设计语言不一样,它使用缩进来定义语句. Python支持命令式程序设计.面向对象程序设计.函数式编程.面向切面编程.泛型编程多种编程范式.与Scheme.Ruby.Perl.Tcl等动态语言一样,Python具备垃圾回收

资深程序员:深入Python进程间通信原理!

输出 3.14159262176 管道pipe 管道是Unix进程间通信最常用的方法之一,它通过在父子进程之间开通读写通道来进行双工交流.我们通过os.read()和os.write()来对文件描述符进行读写操作,使用os.close()关闭描述符. 上图为单进程的管道 上图为父子进程分离后的管道 输出 3.14159262176 无名套接字socketpair 我们知道跨网络通信免不了要通过套接字进行通信,但是本例的多进程是在同一个机器上,用不着跨网络,使用普通套接字进行通信有点浪费. 上图为

作为python程序员,你需要掌握这些技巧

本文和大家分享的是python开发必备的30 个小技巧,一起来看看吧,希望对大家学习和使用 python 语言有所帮助. 贴士#1. 原地交换两个数字 Python  提供了一个直观的在一行代码中赋值与交换(变量值)的方法,请参见下面的示例: x, y = 10, 20print(x, y) x, y = y, xprint(x, y) #1 (10, 20)#2 (20, 10) 赋值的右侧形成了一个新的元组,左侧立即解析(unpack )那个(未被引用的)元组到变量 和 . 一旦赋值完成,新

给Lisp程序员的Python简介

给Lisp程序员的Python简介 作者:Peter Norvig,译者:jineslong<[email protected]> 这是一篇为Lisp程序员写的Python简介(一些Python程序员告诉我,这篇文章对他们学习Lisp也有帮助,尽管这不是我的本意).基本上,Python可以看作一个拥有“传统”语法(Lisp社区称之为“中缀”或者“m-lisp”语法)的Lisp方言.一个来自comp.lang.python的帖子说到“我一直不明白为什么LISP是一个不错的想法,直到我开始玩上了P

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

转自AI算法联盟,理解python技术问题,以及一些常见的java面试中经常遇到的问题,这些面试问题分为四类: 是什么(what) 如何做(how) 说区别/谈优势(difference) 实践操作(practice) 1. 什么是Python? Python是一种编程语言,它有对象.模块.线程.异常处理和自动内存管理.可以加入与其他语言的对比.下面是回答这一问题的几个关键点: a. Python是一种解释型语言,python代码在运行之前不需要编译. b. Python是动态类型语言,在声明变

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

声明:本次教程主要适用于已经习得一门编程语言的程序员.想要学习第二门语言.有梦想,立志做全栈攻城狮的你 . 如果是小白,也可以学习本教程.不过可能有些困难.如有问题在文章下方进行讨论.或者添加QQ群538742639.群马上就满了,名额不多. 这是高级程序员快速入门Python语言课程.助你快速学习Python语言.这是第三课. 程序员带你十天快速入门Python,玩转电脑软件开发(一) 程序员带你十天快速入门Python,玩转电脑软件开发(二) 因技术知识连贯性,还没有学习前两课的同学,建议点