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')