Python起源


Python的创始人为吉多·范罗苏姆(Guido van Rossum);
在Google内部的很多项目,例如Google Engine使用C++编写性能要求极高的部分,然后用Python或Java/Go调用相应的模块。在操控硬件的场合使用 C++,在快速开发时候使用 Python。

使用Python编写的著名应用

* Reddit - 社交分享网站


* Dropbox - 文件分享服务


* 豆瓣网 - 图书、唱片、电影等文化产品的资料数据库网站


* Django - 鼓励快速开发的Web应用框架



Python的设计哲学


“优雅”、“明确”、“简单”;
用Python编程是一种 愉快的事;
Python语言是少有的一种可以称得上 即简单又功能强大的编程语言:1.阅读Python代码就像读英语,2.无须考虑内存管理等底层细节,3.解释性语言,无须考虑编译链接库等;4.标准库丰富强大;5.开源,无须修改代码便可移植到几乎任何平台;



程序员的话


● Eric S. Raymond是《The Cathedral and the Bazaar》的作者、“开放源码”一词的提出人。
他说 Python已经成为了他最喜爱的编程语言。这篇文章也是促使我第一次接触Python的
真正原动力。
● Bruce Eckel著名的《Thinking in Java》和《Thinking in C++》的作者。他说 没有一种语言
比得上Python使他的工作效率如此之高。同时他说Python可能是唯一一种旨在帮助程序
员把事情弄得更加简单的语言。请阅读完整的采访以获得更详细的内容。
● Peter Norvig是著名的Lisp语言书籍的作者和Google公司的搜索质量主任(感谢Guido van
Rossum告诉我这一点)。他说Python始终是Google的主要部分。事实上你看一下 Google
招聘的网页就可以验证这一点。在那个网页上,Python知识是对软件工程师的一个必需
要求。


Python简介

Python是完全面向对象的语言。函数、模块、数字、字符串都是对象。并且完全支持继承、重载、派生、多继承,有益于增强源代码的复用性。Python支持重载运算符,因此Python也支持泛型设计。



Python 语言利用缩进表示语句块的开始和退出(Off-side规则)。根据 PEP 的规定,必须使用4个空格来表示每级缩进;


避免在程序中使用分号;



python -V 查看版本


在命令行的shell提示符下键入python,启动解释器,按Ctrl-d退出提示符;



#!/usr/bin/python 其中#!这两个字符告诉linux系统应该运行哪个解释器;



使用help功能来快速查看函数帮助;


python中的注释使用#



Python中的数据类型

整数       2


长整数   不过是大一些的整数


浮点数    2.12


字符串


bool    True, False


复数     (-5+4j)



内置类:list、tuple、dict



None是Python中表示没有任何东西的特殊类型。例如,如果一个变量的值为None,可以表示它没有值。


在Python中没有专门的char数据类型;

字符串单引号、双引号、三引号

单引号:     'hello world'


双引号:与单引号完全相同,并且可以包含单引号     


"hello i'm world"


换行用法 "hello \


i'm world"


三引号:多行,可以包含双引号


'''hello i'm


"world"


'''


级联字符串


"hello ""world"


unicode字符串 


u"hello world"


自然字符串,可用于正则表达式,不希望转义处理


r"hello world"



运算符的特殊用法

3+5为8


'a'+'b'为'ab'


2*3为6


'la'*3为'lalala'


x**y 幂,x的y次方


与或非 and or not



控制流的特殊用法

if语句后面的冒号表示后面跟着语句块


if True:
    print 'Yes, it is true'



python中没有switch语句;


while True:
    print 'Yes, it is true.'
else:
    print 'loop is done.'



for i in [1, 2, 3, 4]:
    print i
else:
    print 'The for loop is over'



for..in..后面必须是序列(list、tuple、str)

range(1,5)等价于[1, 2, 3, 4];


break语句退出循环,else分支也不会执行了;


一个重要的注释是,如果你从for或while循环中 终止 ,任何对应的循环else块将不执行。


函数

def sayHello():
    print 'Hello World!'
sayHello()



函数内部定义的变量作用域只限函数,想使用外部的变量,用global;


def someFunction():
    pass



pass语句在Python中表示一个空的语句块。


除非你提供你自己的return语句,每个函数都在结尾暗含有return None语句。

强烈建议为每个函数编写文档字符串;
文档字符串的惯例是一个多行字符串,它的首行以大写字母开始,句号结尾。第二行是空行,从第三行开始是详细的描述。
使用__doc__或者help()可以显示文档字符串。

模块

如果你想要直接使用所有sys模块使用的名字(避免每次打sys.argv),那么你可以使用from sys import *语句;


一般说来,应该避免使用from..import而使用,为了避免名称的冲突;


每个Python模块都有它的__name__,如果它是'__main__',这说明这个模块被用户单独运行,而不是import;


import..as语法:这是一种便利方法,以便于我们可以使用更短的模块名称‘


关于del的一点注释——这个语句在运行后被用来 删除 一个变量/名称。在这个例子中,del a,你将无法再使用变量a——它就好像从来没有存在过一样。


内建数据结构


shoplist = ['apple', 'banana', 'mango'];
for item in shoplist:
    print item
shoplist[0]
shoplist.append('carrot')
shoplist.sort()
del shoplist[0]



元组:不可变。也是一个序列。help(tuple)


zoo = ('wolf', 'elephant', 'penguin')
zoo[0]
singleton = (2 , )



字典:无序的键值对。不是序列。help(dict)

ab = { 'Swaroop' : 'swaroopch@byteofpython.info', 'Larry' : 'larry@wall.org'}
print ab['Saroop']
del ab['Spammer']
for name, address in ab.items():
      print 'Contact %s at %s' % (name, address)
if 'Guido' in ab: # OR ab.has_key('Guido')
      print "\nGuido's address is %s" % ab['Guido']



列表、元组和字符串都是序列。


序列的两个主要特点是索引操作符和切片操作符。


shoplist[1:3]:1、2


shoplist[:]:全部


shoplist[-1]表示序列的最后一个元素;


shoplist[-2]抓取序列的倒数第二个项目。


引用

当你创建一个对象并给它赋一个变量的时候,这个变量仅仅 引用 那个对象,而不是表示这个对象本身!也就是说,变量名指向你计算机中存储那个对象的内存。这被称作名称到对象的绑定。


shoplist = ['apple', 'mango', 'carrot', 'banana']
mylist = shoplist
del shoplist[0]



如果你想要复制一个列表或者类似的序列或者其他复杂的对象(不是如整数那样的简单 对象 ),那么你必须使用切片操作符来取得拷贝。



传递参数的时候,python不允许程序员选择采用传值还是传引用。Python参数传递采用的肯定是“传对象引用”的方式。实际上,这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符串或者元组)的引用,就不能直接修改原始对象--相当于通过“传值'来传递对象。



正确的过程是先编写出简单可用的第一个版本,然后一次次重复这个编写-测试-使用的周期。

记住“软件是长出来的,而不是一次建成的”。

类包括域和方法;


记住“域和方法可以合称为类的属性“



类的方法必须有一个额外的第一个参数名称self,但是在调用这个方法的时候你不为这个参数赋值;

class Person:
      def __init__(self, name):
            self.name = name
      def sayHi(self):
            print 'Hello, my name is', self.name
p = Person('Swaroop')
p.sayHi()



Python中所有的类成员(包括数据成员)都是 公共的 ,所有的方法都是 有效的 。


只有一个例外:如果你使用的数据成员名称以 双下划线前缀 比如__privatevar,Python的名称管理体系会有效地把它作为私有变量。


有一个惯例,如果某个变量只想在类或对象中使用,就应该以单下划线前缀,例如_privateData。而其他的名称都将作为公共的,可以被其他类/对象使用。



python中,没有任何形式的函数重载;


Python不会自动调用基本类的constructor,你得亲自专门调用它。


文件


for item in [1,2,3]:
     print item,



cPickle用于持久储存对象;



import cPickle as pshoplist = ['apple', 'mango', 'carrot']p.dump(shoplist, f)storedlist = p.load(f)



f = file('poem.txt')
while True: 
      line = f.readline()
      if len(line) == 0:
            break

len(line)表示读到EOF



退出程序



列表综合


listone = [2, 3, 4]
listtwo = [2*i for i in listone if i > 2]



可变参数


def test(*args):
    for i in args:
        print i




lambda

lambda语句被用来创建新的函数对象,并且在运行时返回它们。

twice = lambda s: s*2
print twice('word')