python速成指南

95
. . . . . . Python 语言速成 刘鑫 <[email protected]> 两小时内学会 Python November 11, 2010

Upload: march-liu

Post on 14-May-2015

19.969 views

Category:

Education


1 download

DESCRIPTION

给同事做的 Python 速成讲座

TRANSCRIPT

Page 1: Python速成指南

. . . . . .

Python 语言速成

刘鑫 <[email protected]>

两小时内学会 Python

November 11, 2010

Page 2: Python速成指南

. . . . . .

预备内容

Page 3: Python速成指南

. . . . . .

目标人群

I 有其它语言经验的技术人员

I 对 Python 很少或没有了解I 想要短时间学会实用的 Python 编程知识I 想要了解深入学习 Python 的切入点

Page 4: Python速成指南

. . . . . .

目标人群

I 有其它语言经验的技术人员I 对 Python 很少或没有了解

I 想要短时间学会实用的 Python 编程知识I 想要了解深入学习 Python 的切入点

Page 5: Python速成指南

. . . . . .

目标人群

I 有其它语言经验的技术人员I 对 Python 很少或没有了解I 想要短时间学会实用的 Python 编程知识

I 想要了解深入学习 Python 的切入点

Page 6: Python速成指南

. . . . . .

目标人群

I 有其它语言经验的技术人员I 对 Python 很少或没有了解I 想要短时间学会实用的 Python 编程知识I 想要了解深入学习 Python 的切入点

Page 7: Python速成指南

. . . . . .

我们的目标

I 了解常用的 Python 开发环境

I Python 的基本语法,达到可用程度I 了解一些常用的小技巧I 了解 Python “特有”的一些开发方法I 学会管理 Python 环境I 面向 2.6/2.7 版

Page 8: Python速成指南

. . . . . .

我们的目标

I 了解常用的 Python 开发环境I Python 的基本语法,达到可用程度

I 了解一些常用的小技巧I 了解 Python “特有”的一些开发方法I 学会管理 Python 环境I 面向 2.6/2.7 版

Page 9: Python速成指南

. . . . . .

我们的目标

I 了解常用的 Python 开发环境I Python 的基本语法,达到可用程度I 了解一些常用的小技巧

I 了解 Python “特有”的一些开发方法I 学会管理 Python 环境I 面向 2.6/2.7 版

Page 10: Python速成指南

. . . . . .

我们的目标

I 了解常用的 Python 开发环境I Python 的基本语法,达到可用程度I 了解一些常用的小技巧I 了解 Python “特有”的一些开发方法

I 学会管理 Python 环境I 面向 2.6/2.7 版

Page 11: Python速成指南

. . . . . .

我们的目标

I 了解常用的 Python 开发环境I Python 的基本语法,达到可用程度I 了解一些常用的小技巧I 了解 Python “特有”的一些开发方法I 学会管理 Python 环境

I 面向 2.6/2.7 版

Page 12: Python速成指南

. . . . . .

我们的目标

I 了解常用的 Python 开发环境I Python 的基本语法,达到可用程度I 了解一些常用的小技巧I 了解 Python “特有”的一些开发方法I 学会管理 Python 环境I 面向 2.6/2.7 版

Page 13: Python速成指南

. . . . . .

Python 环境

Page 14: Python速成指南

. . . . . .

Python Shell

Python Shell 对于 Python 使用者来说是重要的工作环境,所以除了内置的命令行,还有一些强化的 Shell 环境。Python 开发工具中也有一些提供了内置的 Python Shell。

Page 15: Python速成指南

. . . . . .

Pure Python Shell

Python 内置提供两套命令行环境:基于控制台的交互环境和基于 TK 图形系统的 IDLE。

Figure: Python

Page 16: Python速成指南

. . . . . .

Pure Python Shell

IPython 是 Python 官方文档中推荐的第三方扩展Shell ,易学易用,外观友好,功能丰富,与系统环境融合良好,是非常好用的交互式环境。

Figure: IPython

Page 17: Python速成指南

. . . . . .

Pure Python Shell

BPython 外观优美,提供了很多实用的 Python命令行功能,如自动完成,代码提示,代码保存,命令行回溯等,是一个非常有特点的 PythonShell。 Figure: BPython

Page 18: Python速成指南

. . . . . .

常见开发工具

I IDLE

I Emacs/VIMI PyDevI 第三方编辑器

Page 19: Python速成指南

. . . . . .

常见开发工具

I IDLEI Emacs/VIM

I PyDevI 第三方编辑器

Page 20: Python速成指南

. . . . . .

常见开发工具

I IDLEI Emacs/VIMI PyDev

I 第三方编辑器

Page 21: Python速成指南

. . . . . .

常见开发工具

I IDLEI Emacs/VIMI PyDevI 第三方编辑器

Page 22: Python速成指南

. . . . . .

工具选择的几个参考因素

I 支持 Python 語法加亮

I 智能缩进I TAB/空格转换I 多内码支持

Page 23: Python速成指南

. . . . . .

工具选择的几个参考因素

I 支持 Python 語法加亮I 智能缩进

I TAB/空格转换I 多内码支持

Page 24: Python速成指南

. . . . . .

工具选择的几个参考因素

I 支持 Python 語法加亮I 智能缩进I TAB/空格转换

I 多内码支持

Page 25: Python速成指南

. . . . . .

工具选择的几个参考因素

I 支持 Python 語法加亮I 智能缩进I TAB/空格转换I 多内码支持

Page 26: Python速成指南

. . . . . .

基本语法

Page 27: Python速成指南

. . . . . .

变量、命名与数据类型

Page 28: Python速成指南

. . . . . .

Hello World

�1 >>> print "Hello World" #我是注释2 Hello World3 >>> print u"你好!" #这里是一个字符串unicode你好�

Page 29: Python速成指南

. . . . . .

变量、命名与对象

Python 中使用变量无需声明,每一个命名赋值后即在其命名域中生效,成为一个变量,每个命名都绑定到一个对象。�

1 >>> print x # 会出错2 . . .3 >>> x = " I 'm a var" #赋值即定义4 >>> print x5 I 'm a var�

Page 30: Python速成指南

. . . . . .

桌面计算器

Python 有无限长数值类型,支持各数数值计算。�1 >>> 20 ∗ 5.0 # 普通数学运算2 100.03 >>> 7 ∗∗ 2 # 幂运算4 495 >>> 1 + 2j # 内置复数类型6 (1+2j )7 >>> import math # 导入模块8 >>> dir (math) # 查看 math9 . . .10 >>> help (math. sin ) # 自省11 . . .12 # 欧拉公式,限于浮点精度,得到一个极小复数13 >>> math.e∗∗(math. pi∗1 j )+114 1.2246063538223773e−16j�

Page 31: Python速成指南

. . . . . .

“面向数据结构”的 Python

对于 Python 来说,内置的数据结构不仅仅是语法糖,更是Python 架构的基本组成部分。�

1 l = [ '1 ' , 2 , 'abc ' , None] # 这是一个 L is t2 d = { 'a ' :1 , 'b ' :2} # 这是一个 dict3 t = ( 'x ' , 'y ' , ' z ' ) # 这是一个 tuple4 s = set ([1 , 2, 3]) # 这是一个 set5 s = {1, 2, 3} # 这是一个 set ,2.7 新语法�

Page 32: Python速成指南

. . . . . .

逻辑与逻辑运算符

Python 有基本的逻辑类型,多种数据类型参与逻辑判断时,规则类似于 C 语言。�

1 >>> True2 True3 >>> False4 False5 >>> [ ] and 1 # and / or 运算符6 [ ]7 >>> [ ] or 1 # Python 的隐式逻辑判断规则类似 c�

Page 33: Python速成指南

. . . . . .

None

类似于关系型数据库的 NULL�1 >>> None23 >>> None and 145 >>> None or 16 17 >>> False == None8 False�

Page 34: Python速成指南

. . . . . .

基本流程控制

Page 35: Python速成指南

. . . . . .

逻辑判断

�1 >>> a = 'x ' i f 1 > 2 else 'y ' # i f / else 表达式2 >>> # Python 强制缩进,每一个冒号符的下一行缩进一级3 >>> i f 0xf > 0b11011101:4 . . . print 'abc '5 . . . else :6 . . . print 1237 . . .8 123�

Page 36: Python速成指南

. . . . . .

逻辑判断

多重逻辑分支�1 >>> i f 0 < x <= 2:2 . . . print '0 < x <= 2 '3 . . . elif 2 < x <= 4:4 . . . print '2 < x <= 4 '5 . . . elif 4 < x <= 8:6 . . . print '4 < x <= 8 '7 . . . else :8 . . . print 'x > 8 '9 . . .10 x > 8�

Page 37: Python速成指南

. . . . . .

For 循环

Python 的 For 循环基于对线性容器的迭代。�1 >>> l = range(5 , 10, 2)2 >>> for i in l :3 . . . print i4 55 76 9�

Page 38: Python速成指南

. . . . . .

迭代仿线性对象

只要接口符合,即使不是线性容器也可以:�1 >>> f = open( "sample0.py" )2 >>> for l ine in f :3 . . . print l ine4 . . .�

Page 39: Python速成指南

. . . . . .

While 循环

C 式的 for 循环与 while 同构,Python 也提供了这种形式:�1 >>> x = 102 >>> while x % 13 != 0:3 . . . print x4 . . . x+=15 . . .6 107 118 12�

Page 40: Python速成指南

. . . . . .

错误与异常

Page 41: Python速成指南

. . . . . .

异常处理

至 Python 2.5 ,Python 已经有了相当完整的异常处理机制�1 f = None2 try :3 f = open( "sample0.py" )4 for l ine in f :5 print l ine6 except Exception as e:7 print e8 finally :9 f . close ( )�

Page 42: Python速成指南

. . . . . .

With 语句

作为一种退化的形式,with 可以更简洁的保护外部资源,使之不会因异常而泄漏。�

1 >>> with open( "sample0.py" ) as f :2 . . . for l ine in f :3 . . . print l ine4 . . .�

Page 43: Python速成指南

. . . . . .

代码抽象

Page 44: Python速成指南

. . . . . .

函数

`return` 从函数中退出,并携带返回值,�1 >>> def foo (x ) : # 基本定义2 . . . # 2.6 + 的字符串格式化3 . . . return 'you input {0} ' . format (x)4 >>> print foo ( ' l iuxin2 ' )5 you input l iuxin2�

Page 45: Python速成指南

. . . . . .

函数参数技巧

下例涉及参数默认值、可变参数和关键字参数�1 def ploynomial (x=0, ∗args , ∗∗keys ) :2 ploy = {}3 i f x == 0:4 return 05 # 同时迭代出序列索引和元素6 for times , factor in enumerate(args ) :7 ploy [ times] = factor�

Page 46: Python速成指南

. . . . . .

函数参数技巧

续上页�1 # 在字典上迭代2 for times , factor3 in keys . iteritems ( ) :4 # 这里运用了切片技巧5 ploy [ int ( times [1 : ] ) ] = factor6 return sum(value∗x∗∗key7 for key , value8 in ploy . iteritems ( ) )�

Page 47: Python速成指南

. . . . . .

函数参数技巧

使用上例的函数,计算 7 + 2 ∗ x2 + 5 ∗ x3 + 20 ∗ x9 + 21 ∗ x12 在x = 5 时的值:�

1 >>> print ploynomial (5 , 7, 2, 5,2 x9=20, x12=21)3 51660157674 >>> l = [7 , 2, 5]5 # 这个字典的构造过程也使用了关键字参数6 >>> d = dict (x9=20, x12=21)7 >>> print ploynomial (5 , ∗ l , ∗∗d)�

Page 48: Python速成指南

. . . . . .

面向对象

Python 的面向对象机制类似 Smalltalk。采用全动态语法。

Page 49: Python速成指南

. . . . . .

类定义

�1 import datetime23 class MyClass( object ) : # 单根类4 def i n i t ( se l f ) : # 显式自引用变量5 sel f . create at = \6 datetime . datetime .now()7 def s t r ( se l f ) : # 重载父类的方法8 return "my create at {0}"\9 . format ( se l f . create at )�

Page 50: Python速成指南

. . . . . .

更多自由,更少限制

Python 可以在运行时动态的修改对象结构。�1 import new2 obj = MyClass ( )3 obj . hello = "Hello " # 动态添加成员对象4 say = lambda se l f : se l f . create at5 obj . say = new. instancemethod(6 lambda se l f : se l f . create at ,7 obj , MyClass)8 # 动态添加成员方法,得到 obj .。create at9 print obj . say ( )�

Page 51: Python速成指南

. . . . . .

更多自由,更少限制

Python 中没有真正意义的私有成员(可以定义形如 __obj 的成员以阻止外部访问)。Python 编程风格不强制类型匹配和转换,通常鼓励直接访问成员。——即所谓 duck typing。

Page 52: Python速成指南

. . . . . .

代码组织

Page 53: Python速成指南

. . . . . .

模块与包

Python 中,每一个文件被视作一个模块(module),每个带有__init__.py 文件的目录被视作一个包(package)。

Page 54: Python速成指南

. . . . . .

模块与包的搜索

除了当前目录,Python 虚拟机按 sys.path 中的路径搜索包所在的位置,可以通过以下方式修改:

I 修改 sys.pathI 在 sys.path 指定的目录中加入.pth 文件,其中写入路径

文本I 定制一个名为 PYTHONPATH 的系统变量

Page 55: Python速成指南

. . . . . .

生存期行为

除非显式 reload ,否则每进程内,每个模块最多加载一次,在不同位置 import 不会重复加载

Page 56: Python速成指南

. . . . . .

深入 Python

Page 57: Python速成指南

. . . . . .

生成器 yield

Page 58: Python速成指南

. . . . . .

生成器 yield

yield 关键字临时挂起函数,返回值,然后继续执行,最初用于简写迭代子(iterator)逻辑,现在通常视为实现 coroutine 模式的通用工具。�

1 def xrange(x=None, y=None, step=1):2 . . . # 容错代码,详见示例文件中的 xrange3 s = start4 i f start < stop and z > 0:5 while s < stop :6 yield s7 s += z8 elif start > stop and z < 0:9 while s > stop :10 yield s11 s += z�

Page 59: Python速成指南

. . . . . .

调用

用生成器和列表推导式生成序列。列表推导式技术随后我们詳細的讨论。�

12 >>> print [ i for i in xrange(10)]3 [0 , 1, 2, 3, 4, 5, 6, 7, 8, 9]4 >>> print [ i for i in xrange(2 , 10)]5 [2 , 3, 4, 5, 6, 7, 8, 9]6 >>> print [ i for i in xrange(10 , 2)]7 [ ]8 >>> print [ i for i in xrange(2 , 10, 5)]9 [2 , 7]10 >>> print [ i for i in xrange(10 , 2, −1)]11 [10 , 9, 8, 7, 6, 5, 4, 3]�

Page 60: Python速成指南

. . . . . .

列表及迭代推导式 comprehension

Page 61: Python速成指南

. . . . . .

推导式

推导式可以方便的生成序列逻辑,可以用于简化map/filter/reduce 组合。�

1 >>> [x for x in xrange(5)] #成生列表2 [0 , 1, 2, 3, 4]3 >>> # 生成 32˜ 126 的码表4 >>> dict ( ( c , chr (c ) ) for c in range(32 , 127))5 . . .6 >>> # 组合技巧,生成以内的因数表1007 >>> l =[(x ,y) for x in xrange(1 , 100)8 for y in xrange(1 , 100)9 i f x>y and x%y==0]10 >>> # 将上表组合为更为友好的字典形式11 >>> d = dict ( (k , tuple ( t [1] for t in l12 i f t[0]==k) )13 for k in range(1 , 100))�

Page 62: Python速成指南

. . . . . .

修饰器 decorator

Page 63: Python速成指南

. . . . . .

修饰器

修饰器可以将函数“修饰”为完全不同的行为,可以有效的将业务逻辑正交分解,如用于将权限和身份验证从业务中独立出来。�

12 # 常见的用法3 @require logined4 def dosomeing(arg ) :5 . . .�

Page 64: Python速成指南

. . . . . .

定义修饰器

下例我们定义一个修饰器,强制函数参数必须是一个整数。需要注意的是修符器返回的是修饰后的函数,而不是函数结果。�

1 def require int ( foo ) :2 def re (arg ) :3 i f type(arg) == int :4 return foo (arg)5 else :6 raise ValueError (7 "the arg must be a int " )8 return re�

Page 65: Python速成指南

. . . . . .

使用修饰器

使用刚才的修饰器�1 @require int2 def get i t (arg ) :3 return " I got the %s"%arg45 get i t (0) # 正确6 get i t (20) # 正确7 get i t ( 'abc ' ) # 错误,会抛出异常。�

Page 66: Python速成指南

. . . . . .

有关闭包实现的讨论

Page 67: Python速成指南

. . . . . .

闭包

闭包模式近几年开始受到关注,在 Python 中有几种方式可以实现闭包。

Page 68: Python速成指南

. . . . . .

闭包的定义

闭包可以用来在一个函数与一组“私有”变量之间创建关联关系。在给定函数被多次调用的过程中,这些私有变量能够保持其持久性。变量的作用域仅限于包含它们的函数,因此无法从其它程序代码部分进行访问。不过,变量的生存期是可以很长,在一次函数调用期间所创建所生成的值在下次函数调用时仍然存在。正因为这一特点,闭包可以用来完成信息隐藏,并进而应用于需要状态表达的某些编程范型中。——维基百科

Page 69: Python速成指南

. . . . . .

简单的闭包

如果不追求通用的闭包模式,以下就是一个简单的闭包,它有一个只读的自由变量作用域:�

1 def closure (base ) :2 def re (x ) :3 return base∗∗x4 return re�

Page 70: Python速成指南

. . . . . .

如何携带可变状态?

但是,这种思路构造的闭包,不能自由的修改�1 def closure (base ) :2 accumulation = 03 def re (x ) :4 # 此处会报错5 accumulation += base∗∗x6 return accumulation7 return re8 # 通过以上方式得到的闭包函数,不能如预期累积计算结果�

Page 71: Python速成指南

. . . . . .

修饰器闭包

直接使用修饰器就可以得到功能更强的闭包。但需要一定的" 黑箱操作"。�

1 class Closure ( object ) :2 def i n i t ( self , ∗∗keywords ) :3 for keyword in keywords :4 # 这里使用对象的 d i c t 添加数据成员5 sel f . d i c t [keyword] = \6 keywords[keyword]7 # 重载括号运算符8 def c a l l ( self , foo ) :9 def re (∗args , ∗∗keywords ) :10 keywords[ ' se l f ' ] = sel f11 return foo (∗args , ∗∗keywords)12 return re�

Page 72: Python速成指南

. . . . . .

使用修饰器闭包

可以从以下函数调用中看到函数访问闭包携带的状态所带来的修改。�

1 >>> print foo(10)2 103 >>> print foo(20)4 305 >>> print foo(−30)6 0�

Page 73: Python速成指南

. . . . . .

python 3 的闭包

Python 3 中增加了 nonlocal 关键字,允许用户以更精确的方式控制变量访问的命名域。在 Python 3 中闭包成为一个更自然、易用的模式。

Page 74: Python速成指南

. . . . . .

双向迭代器与协作模式

Page 75: Python速成指南

. . . . . .

双向 yield

yield 不仅可以用于输入,也可以用于输出,它可以用于实现双向的协作(coroutine)模式。�

1 def rolladd ( xstart=1, ystart=1):2 x = yield xstart3 y = yield ystart4 while True :5 t = y6 y = x7 x = yield x+t�

Page 76: Python速成指南

. . . . . .

双向 yield 的应用

下例可以生成菲波那切数列,也可以通过初始状态设置和内外交互,生成其它的数列。�

1 fabber = rolladd ( )2 x = fabber .send(None)3 print x45 for i in range(1 , 10):6 x = fabber . send(x)7 print x�

Page 77: Python速成指南

. . . . . .

常见框架、工具和库

Page 78: Python速成指南

. . . . . .

pypi

pypi 是 Python 社区的在线资源服务,要使用它,需要安装setuptools 。然后执行 easy install 命名即可安装所需的软件包。下面所提到的组件和框架,除了已经内置在 Python 发行版中的,其它都可以通过这种方式安装

Page 79: Python速成指南

. . . . . .

并发

I 进程库 subprocess

I 并发库(2.6+)multiprocessingI 线程库 threading/threadsI 协程并发库(高性能,合作式并发,第三方)gevent

Page 80: Python速成指南

. . . . . .

并发

I 进程库 subprocessI 并发库(2.6+)multiprocessing

I 线程库 threading/threadsI 协程并发库(高性能,合作式并发,第三方)gevent

Page 81: Python速成指南

. . . . . .

并发

I 进程库 subprocessI 并发库(2.6+)multiprocessingI 线程库 threading/threads

I 协程并发库(高性能,合作式并发,第三方)gevent

Page 82: Python速成指南

. . . . . .

并发

I 进程库 subprocessI 并发库(2.6+)multiprocessingI 线程库 threading/threadsI 协程并发库(高性能,合作式并发,第三方)gevent

Page 83: Python速成指南

. . . . . .

测试工具

I 内嵌式的文档式测试工具 doctesting。

I 单元测试工具 unittestI 性能分析工具 profile/cprofile

Page 84: Python速成指南

. . . . . .

测试工具

I 内嵌式的文档式测试工具 doctesting。I 单元测试工具 unittest

I 性能分析工具 profile/cprofile

Page 85: Python速成指南

. . . . . .

测试工具

I 内嵌式的文档式测试工具 doctesting。I 单元测试工具 unittestI 性能分析工具 profile/cprofile

Page 86: Python速成指南

. . . . . .

数据库驱动

I 内置的 sqlite3

I KV 库 BDB 的封装 shelve.BsdDbShelfI mysql 封装 mysqldbI postgresql 封装 psycopg2I 通用 ORM 工具 SQLAlchemy

Page 87: Python速成指南

. . . . . .

数据库驱动

I 内置的 sqlite3I KV 库 BDB 的封装 shelve.BsdDbShelf

I mysql 封装 mysqldbI postgresql 封装 psycopg2I 通用 ORM 工具 SQLAlchemy

Page 88: Python速成指南

. . . . . .

数据库驱动

I 内置的 sqlite3I KV 库 BDB 的封装 shelve.BsdDbShelfI mysql 封装 mysqldb

I postgresql 封装 psycopg2I 通用 ORM 工具 SQLAlchemy

Page 89: Python速成指南

. . . . . .

数据库驱动

I 内置的 sqlite3I KV 库 BDB 的封装 shelve.BsdDbShelfI mysql 封装 mysqldbI postgresql 封装 psycopg2

I 通用 ORM 工具 SQLAlchemy

Page 90: Python速成指南

. . . . . .

数据库驱动

I 内置的 sqlite3I KV 库 BDB 的封装 shelve.BsdDbShelfI mysql 封装 mysqldbI postgresql 封装 psycopg2I 通用 ORM 工具 SQLAlchemy

Page 91: Python速成指南

. . . . . .

Web 框架

I 公司使用最多的 Django

I 值得关注的轻量级框架 web.pyI 高性能框架 tornadoI 积木式的 turbogears/pylons

Page 92: Python速成指南

. . . . . .

Web 框架

I 公司使用最多的 DjangoI 值得关注的轻量级框架 web.py

I 高性能框架 tornadoI 积木式的 turbogears/pylons

Page 93: Python速成指南

. . . . . .

Web 框架

I 公司使用最多的 DjangoI 值得关注的轻量级框架 web.pyI 高性能框架 tornado

I 积木式的 turbogears/pylons

Page 94: Python速成指南

. . . . . .

Web 框架

I 公司使用最多的 DjangoI 值得关注的轻量级框架 web.pyI 高性能框架 tornadoI 积木式的 turbogears/pylons

Page 95: Python速成指南

. . . . . .

谢谢大家!再见!Power By LATEX!