谁能告诉我这个笑话的意思啊 JavaScript 程序员和 Python 程序员相遇了。 P

Python08

谁能告诉我这个笑话的意思啊 JavaScript 程序员和 Python 程序员相遇了。 P,第1张

JS: 说的是数字和字符串相加,都会先转换成字符串

'1' + 1 =>11

1 + '1' =>11

Python: 说的是duck typing ,方法一样就行,不管你的具体类型

“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”

我们并不关心对象是什么类型,到底是不是鸭子,只关心行为。

一、Python之禅(The Zen of Python) \x0d\x0aThe Zen of Python是Python语言的指导原则,遵循这些基本原则,你就可以像个Pythonista一样编程。具体内容你可以在Python命令行输入import this看到:\x0d\x0aThe Zen of Python, by Tim Peters\x0d\x0a\x0d\x0aBeautiful is better than ugly.\x0d\x0a# 优美胜于丑陋(Python以编写优美的代码为目标)\x0d\x0a\x0d\x0aExplicit is better than implicit.\x0d\x0a# 明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似)\x0d\x0a\x0d\x0aSimple is better than complex.\x0d\x0a# 简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现)\x0d\x0a\x0d\x0aComplex is better than complicated.\x0d\x0a# 复杂胜于凌乱(如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁)\x0d\x0a\x0d\x0aFlat is better than nested.\x0d\x0a# 扁平胜于嵌套(优美的代码应当是扁平的,不能有太多的嵌套)\x0d\x0a\x0d\x0aSparse is better than dense.\x0d\x0a# 间隔胜于紧凑(优美的代码有适当的间隔,不要奢望一行代码解决问题)\x0d\x0a\x0d\x0aReadability counts.\x0d\x0a# 可读性很重要(优美的代码是可读的)\x0d\x0a\x0d\x0aSpecial cases aren't special enough to break the rules.\x0d\x0aAlthough practicality beats purity.\x0d\x0a# 即便假借特例的实用性之名,也不可违背这些规则(这些规则至高无上)\x0d\x0a\x0d\x0aErrors should never pass silently.\x0d\x0aUnless explicitly silenced.\x0d\x0a# 不要包容所有错误,除非你确定需要这样做(精准地捕获异常,不写except:pass风格的代码)\x0d\x0a\x0d\x0aIn the face of ambiguity, refuse the temptation to guess.\x0d\x0a# 当存在多种可能,不要尝试去猜测\x0d\x0a\x0d\x0aThere should be one-- and preferably only one --obvious way to do it.\x0d\x0a# 而是尽量找一种,最好是唯一一种明显的解决方案(如果不确定,就用穷举法)\x0d\x0a\x0d\x0aAlthough that way may not be obvious at first unless you're Dutch.\x0d\x0a# 虽然这并不容易,因为你不是 Python 之父(这里的Dutch是指Guido)\x0d\x0aNow is better than never.\x0d\x0aAlthough never is often better than *right* now.\x0d\x0a# 做也许好过不做,但不假思索就动手还不如不做(动手之前要细思量)\x0d\x0aIf the implementation is hard to explain, it's a bad idea.\x0d\x0aIf the implementation is easy to explain, it may be a good idea.\x0d\x0a# 如果你无法向人描述你的方案,那肯定不是一个好方案;反之亦然(方案测评标准)\x0d\x0aNamespaces are one honking great idea -- let's do more of those!\x0d\x0a# 命名空间是一种绝妙的理念,我们应当多加利用(倡导与号召)\x0d\x0a\x0d\x0a这首特别的“诗”开始作为一个笑话,但它确实包含了很多关于Python背后的哲学真理。Python之禅已经正式成文PEP 20,具体内容见:PEP 20\x0d\x0a二、PEP8: Python编码规范(PEP8: Style Guide for Python Code) \x0d\x0aAbelson &Sussman在《计算机程序的构造和解释》一书中说道:程序是写来给人读的,只是顺带让机器执行。所以,我们在编码时应该尽量让它更易读懂。PEP8是Python的编码规范,官方文档见:PEP 8,PEP是Python Enhancement Proposal的缩写。PEP8包括很多编码的规范,下面主要介绍一下缩进和命名等内容。\x0d\x0a空格和缩进(WhiteSpace and Indentation)\x0d\x0a空格和缩进在Python语言中非常重要,它替代了其他语言中{}的作用,用来区分代码块和作用域。在这方面PEP8有以下的建议:\x0d\x0a1、每次缩进使用4个空格\x0d\x0a2、不要使用Tab,更不要Tab和空格混用\x0d\x0a3、两个方法之间使用一个空行,两个Class之间使用两个空行\x0d\x0a4、添加一个空格在字典、列表、序列、参数列表中的“,“后,以及在字典中的”:“之后,而不是之前\x0d\x0a5、在赋值和比较两边放置一个空格(参数列表中除外)\x0d\x0a6、紧随括号后面或者参数列表前一个字符不要存在空格\x0d\x0a\x0d\x0aPython命名\x0d\x0a命名规范是编程语言的基础,而且大部分的规范对于高级语言来说都是一样的,Python的基本规范如下:\x0d\x0a1、方法 &属性:joined_lower\x0d\x0a2、常量:joined_lower or ALL_CAPS\x0d\x0a3、类:StudlyCaps\x0d\x0a4、类属性:interface, _internal, __private\x0d\x0a5、camelCase only to conform to pre-existing conventions\x0d\x0a\x0d\x0a以上内容只是对PEP8做了非常简单的介绍,由于今天的主题不在于此,所以就不在这里多讲。想要更加深入的了解Python编码规范,可以阅读PEP8官方文档和Google Python编码规范等内容。\x0d\x0a三、交换变量值(Swap Values)\x0d\x0a在其他语言中,交换两个变量值的时候,可以这样写:\x0d\x0atemp = a\x0d\x0aa = b\x0d\x0ab = temp\x0d\x0a\x0d\x0a在Python中,我们可以简单的这样写:\x0d\x0ab, a = a, b\x0d\x0a\x0d\x0a可能你已经在其他地方见过这种写法,但是你知道Python是如何实现这种语法的吗?首先,逗号(,)是Python中tuple数据结构的语法;上面的语法会执行一下的操作:\x0d\x0a1、Python会先将右边的a, b生成一个tuple(元组),存放在内存中;\x0d\x0a2、之后会执行赋值操作,这时候会将tuple拆开;\x0d\x0a3、然后将tuple的第一个元素赋值给左边的第一个变量,第二个元素赋值给左边第二个变量。\x0d\x0a再举个tuple拆分的例子:\x0d\x0aIn [1]: people = ['David', 'Pythonista', '15145551234']\x0d\x0a\x0d\x0aIn [2]: name, title, phone = people\x0d\x0a\x0d\x0aIn [3]: name\x0d\x0aOut[3]: 'David'\x0d\x0a\x0d\x0aIn [4]: title\x0d\x0aOut[4]: 'Pythonista'\x0d\x0a\x0d\x0aIn [5]: phone\x0d\x0aOut[5]: '15145551234'\x0d\x0a\x0d\x0a这种语法在For循环中非常实用:\x0d\x0aIn [6]: people = [['David', 'Pythonista', '15145551234'], ['Wu', 'Student', '15101365547']]\x0d\x0a\x0d\x0aIn [7]: for name, title, phone in people:\x0d\x0a ...: print name, phone\x0d\x0a ...: \x0d\x0aDavid 15145551234\x0d\x0aWu 15101365547\x0d\x0a\x0d\x0aPS:在使用这种语法时,需要确保左边的变量个数和右边tuple的个数一致,否则,Python会抛出ValueError异常。\x0d\x0a更多tuple的例子:\x0d\x0a>>>1,\x0d\x0a(1,)\x0d\x0a>>>(1,)\x0d\x0a(1,)\x0d\x0a>>>(1)\x0d\x0a1\x0d\x0a>>>value = 1,\x0d\x0a>>>value\x0d\x0a(1,)\x0d\x0a\x0d\x0a我们知道:逗号(,)在Python中是创建tuple的构造器,所以我们可以按照上面的方式很方便的创建一个tuple;需要注意的是:如果声明只有一个元素的tuple,末尾必须要带上逗号,两个以上的元素则不需要。声明tuple的语法很简单,但同时它也比较坑:如果你发现Python中的变量不可思议的变成了tuple,那很可能是因为你多写了一个逗号。。\x0d\x0a四、Python控制台的"_"(Interactive "_")\x0d\x0a这是Python中比较有用的一个功能,不过有很多人不知道(我也是接触Python很久之后才知道的)。。在Python的交互式控制台中,当你计算一个表达式或者调用一个方法的时候,运算的结果都会放在一个临时的变量 _ 里面。_(下划线)用来存储上一次的打印结果,比如:\x0d\x0a>>>import math\x0d\x0a>>>math.pi / 3\x0d\x0a1.0471975511965976\x0d\x0a>>>angle = _\x0d\x0a>>>math.cos(angle)\x0d\x0a0.50000000000000011\x0d\x0a>>>_\x0d\x0a0.50000000000000011\x0d\x0a\x0d\x0aPS:当返回结果为None的时候,控制台不会打印,_ 里面存储的值也就不会改变。\x0d\x0a五、合并字符串(Building Strings from Sub strings)\x0d\x0a假如现在有一个list,里面是一些字符串,你现在需要将它们合并成一个字符串,最简单的方法,你可以按照下面的方式去处理:\x0d\x0acolors = ['red', 'blue', 'green', 'yellow']\x0d\x0a\x0d\x0aresult = ''\x0d\x0afor s in colors:\x0d\x0aresult += s\x0d\x0a\x0d\x0a但是,很快你会发现:这种方法非常低效,尤其当list非常大的时候。Python中的字符串对象是不可改变的,因此对任何字符串的操作如拼接,修改等都将产生一个新的字符串对象,而不是基于原字符串。所以,上面的方法会消耗很大的内存:它需要计算,存储,同时扔掉中间的计算结果。正确的方法是使用Python中的join方法:\x0d\x0aresult = ','.join(colors)\x0d\x0a\x0d\x0a当合并元素比较少的时候,使用join方法看不出太大的效果;但是当元素多的时候,你会发现join的效率还是非常明显的。不过,在使用的时候请注意:join只能用于元素是字符串的list,它不会进行任何的强制类型转换。连接一个存在一个或多个非字符串元素的list时将抛出异常。

python读取文本文件内容的方法主要有三种:read()、readline()、readlines()。

第一种:read()

read()是最简单的一种方法,一次性读取文件的所有内容放在一个大字符串中,即内存中。

read()的好处:方便、简单,一次性读出文件放在一个大字符串中,速度最快。

read()的坏处:文件过大的时候,占用内存会过大。

第二种:readline()

readline()逐行读取文本,结果是一个list。

readline()的好处:占用内存小,逐行读取。

readline()的坏处:逐行读取,速度比较慢。

第三种:readlines()

readlines()一次性读取文本的所有内容,结果是一个list。

readlines()的好处:一次性读取文本内容,速度比较快。

readlines()的坏处:随着文本的增大,占用内存会越来越多。