Contenu connexe Similaire à Python速成指南 (20) Python速成指南1. . . . . . .
Python 语言速成
刘鑫 <liuxin2@kingsoft.com>
两小时内学会 Python
November 11, 2010
3. . . . . . .
目标人群
有其它语言经验的技术人员
4. . . . . . .
目标人群
有其它语言经验的技术人员
对 Python 很少或没有了解
5. . . . . . .
目标人群
有其它语言经验的技术人员
对 Python 很少或没有了解
想要短时间学会实用的 Python 编程知识
6. . . . . . .
目标人群
有其它语言经验的技术人员
对 Python 很少或没有了解
想要短时间学会实用的 Python 编程知识
想要了解深入学习 Python 的切入点
7. . . . . . .
我们的目标
了解常用的 Python 开发环境
8. . . . . . .
我们的目标
了解常用的 Python 开发环境
Python 的基本语法,达到可用程度
9. . . . . . .
我们的目标
了解常用的 Python 开发环境
Python 的基本语法,达到可用程度
了解一些常用的小技巧
10. . . . . . .
我们的目标
了解常用的 Python 开发环境
Python 的基本语法,达到可用程度
了解一些常用的小技巧
了解 Python “特有”的一些开发方法
11. . . . . . .
我们的目标
了解常用的 Python 开发环境
Python 的基本语法,达到可用程度
了解一些常用的小技巧
了解 Python “特有”的一些开发方法
学会管理 Python 环境
12. . . . . . .
我们的目标
了解常用的 Python 开发环境
Python 的基本语法,达到可用程度
了解一些常用的小技巧
了解 Python “特有”的一些开发方法
学会管理 Python 环境
面向 2.6/2.7 版
13. . . . . . .
Python 环境
14. . . . . . .
Python Shell
Python Shell 对于 Python 使用者来说是重要的工作环境,所
以除了内置的命令行,还有一些强化的 Shell 环境。Python 开
发工具中也有一些提供了内置的 Python Shell。
15. . . . . . .
Pure Python Shell
Python 内置提供两套命
令行环境:基于控制台的
交互环境和基于 TK 图形
系统的 IDLE。
Figure: Python
16. . . . . . .
Pure Python Shell
IPython 是 Python 官方
文档中推荐的第三方扩展
Shell ,易学易用,外观
友好,功能丰富,与系统
环境融合良好,是非常好
用的交互式环境。
Figure: IPython
17. . . . . . .
Pure Python Shell
BPython 外观优美,提
供了很多实用的 Python
命令行功能,如自动完
成,代码提示,代码保
存,命令行回溯等,是一
个非常有特点的 Python
Shell。 Figure: BPython
18. . . . . . .
常见开发工具
IDLE
19. . . . . . .
常见开发工具
IDLE
Emacs/VIM
20. . . . . . .
常见开发工具
IDLE
Emacs/VIM
PyDev
21. . . . . . .
常见开发工具
IDLE
Emacs/VIM
PyDev
第三方编辑器
22. . . . . . .
工具选择的几个参考因素
支持 Python 語法加亮
23. . . . . . .
工具选择的几个参考因素
支持 Python 語法加亮
智能缩进
24. . . . . . .
工具选择的几个参考因素
支持 Python 語法加亮
智能缩进
TAB/空格转换
25. . . . . . .
工具选择的几个参考因素
支持 Python 語法加亮
智能缩进
TAB/空格转换
多内码支持
27. . . . . . .
变量、命名与数据类型
28. . . . . . .
Hello World
§
1 >>> print "Hello World" #我是注释
2 Hello World
3 >>> print u"你好!" #这里是一个字符串unicode你好
¦
29. . . . . . .
变量、命名与对象
Python 中使用变量无需声明,每一个命名赋值后即在其命名域
中生效,成为一个变量,每个命名都绑定到一个对象。
§
1 >>> print x # 会出错
2 . . .
3 >>> x = " I 'm a var" #赋值即定义
4 >>> print x
5 I 'm a var
¦
30. . . . . . .
桌面计算器
Python 有无限长数值类型,支持各数数值计算。
§
1 >>> 20 ∗ 5.0 # 普通数学运算
2 100.0
3 >>> 7 ∗∗ 2 # 幂运算
4 49
5 >>> 1 + 2j # 内置复数类型
6 (1+2j )
7 >>> import math # 导入模块
8 >>> dir (math) # 查看 math
9 . . .
10 >>> help (math. sin ) # 自省
11 . . .
12 # 欧拉公式,限于浮点精度,得到一个极小复数
13 >>> math.e∗∗(math. pi∗1 j)+1
14 1.2246063538223773e−16j
¦
31. . . . . . .
“面向数据结构”的 Python
对于 Python 来说,内置的数据结构不仅仅是语法糖,更是
Python 架构的基本组成部分。
§
1 l = [ '1 ' , 2, 'abc ' , None] # 这是一个 List
2 d = { 'a ' :1 , 'b ' :2} # 这是一个 dict
3 t = ( 'x ' , 'y ' , 'z ' ) # 这是一个 tuple
4 s = set ([1 , 2, 3]) # 这是一个 set
5 s = {1, 2, 3} # 这是一个 set ,2.7 新语法
¦
32. . . . . . .
逻辑与逻辑运算符
Python 有基本的逻辑类型,多种数据类型参与逻辑判断时,规
则类似于 C 语言。
§
1 >>> True
2 True
3 >>> False
4 False
5 >>> [] and 1 # and / or 运算符
6 []
7 >>> [] or 1 # Python 的隐式逻辑判断规则类似 c
¦
33. . . . . . .
None
类似于关系型数据库的 NULL
§
1 >>> None
2
3 >>> None and 1
4
5 >>> None or 1
6 1
7 >>> False == None
8 False
¦
35. . . . . . .
逻辑判断
§
1 >>> a = 'x ' if 1 > 2 else 'y ' # i f / else 表达式
2 >>> # Python 强制缩进,每一个冒号符的下一行缩进一级
3 >>> if 0xf > 0b11011101:
4 . . . print 'abc '
5 . . . else :
6 . . . print 123
7 . . .
8 123
¦
36. . . . . . .
逻辑判断
多重逻辑分支
§
1 >>> if 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
¦
37. . . . . . .
For 循环
Python 的 For 循环基于对线性容器的迭代。
§
1 >>> l = range(5 , 10, 2)
2 >>> for i in l :
3 . . . print i
4 5
5 7
6 9
¦
38. . . . . . .
迭代仿线性对象
只要接口符合,即使不是线性容器也可以:
§
1 >>> f = open( "sample0.py" )
2 >>> for line in f :
3 . . . print line
4 . . .
¦
39. . . . . . .
While 循环
C 式的 for 循环与 while 同构,Python 也提供了这种形式:
§
1 >>> x = 10
2 >>> while x % 13 != 0:
3 . . . print x
4 . . . x+=1
5 . . .
6 10
7 11
8 12
¦
41. . . . . . .
异常处理
至 Python 2.5 ,Python 已经有了相当完整的异常处理机制
§
1 f = None
2 try :
3 f = open( "sample0.py" )
4 for line in f :
5 print line
6 except Exception as e:
7 print e
8 finally :
9 f . close ()
¦
42. . . . . . .
With 语句
作为一种退化的形式,with 可以更简洁的保护外部资源,使之
不会因异常而泄漏。
§
1 >>> with open( "sample0.py" ) as f :
2 . . . for line in f :
3 . . . print line
4 . . .
¦
44. . . . . . .
函数
`return` 从函数中退出,并携带返回值,
§
1 >>> def foo (x ) : # 基本定义
2 . . . # 2.6 + 的字符串格式化
3 . . . return 'you input {0} ' . format(x)
4 >>> print foo ( ' liuxin2 ' )
5 you input liuxin2
¦
45. . . . . . .
函数参数技巧
下例涉及参数默认值、可变参数和关键字参数
§
1 def ploynomial(x=0, ∗args , ∗∗keys ) :
2 ploy = {}
3 if x == 0:
4 return 0
5 # 同时迭代出序列索引和元素
6 for times , factor in enumerate(args ) :
7 ploy [times] = factor
¦
46. . . . . . .
函数参数技巧
续上页
§
1 # 在字典上迭代
2 for times , factor
3 in keys . iteritems ( ) :
4 # 这里运用了切片技巧
5 ploy [ int (times [ 1 : ] ) ] = factor
6 return sum(value∗x∗∗key
7 for key, value
8 in ploy . iteritems ( ) )
¦
47. . . . . . .
函数参数技巧
使用上例的函数,计算 7 + 2 ∗ x2 + 5 ∗ x3 + 20 ∗ x9 + 21 ∗ x12 在
x = 5 时的值:
§
1 >>> print ploynomial(5 , 7, 2, 5,
2 x9=20, x12=21)
3 5166015767
4 >>> l = [7 , 2, 5]
5 # 这个字典的构造过程也使用了关键字参数
6 >>> d = dict (x9=20, x12=21)
7 >>> print ploynomial(5 , ∗ l , ∗∗d)
¦
48. . . . . . .
面向对象
Python 的面向对象机制类似 Smalltalk。采用全动态语法。
49. . . . . . .
类定义
§
1 import datetime
2
3 class MyClass( object ) : # 单根类
4 def i n i t ( self ) : # 显式自引用变量
5 self . create at =
6 datetime . datetime .now()
7 def s t r ( self ) : # 重载父类的方法
8 return "my create at {0}"
9 . format( self . create at )
¦
50. . . . . . .
更多自由,更少限制
Python 可以在运行时动态的修改对象结构。
§
1 import new
2 obj = MyClass ()
3 obj . hello = "Hello" # 动态添加成员对象
4 say = lambda self : self . create at
5 obj . say = new. instancemethod(
6 lambda self : self . create at ,
7 obj , MyClass)
8 # 动态添加成员方法,得到 obj .。create at
9 print obj . say ()
¦
51. . . . . . .
更多自由,更少限制
Python 中没有真正意义的私有成员(可以定义形如 __obj 的
成员以阻止外部访问)。Python 编程风格不强制类型匹配和转
换,通常鼓励直接访问成员。——即所谓 duck typing。
53. . . . . . .
模块与包
Python 中,每一个文件被视作一个模块(module),每个带有
__init__.py 文件的目录被视作一个包(package)。
54. . . . . . .
模块与包的搜索
除了当前目录,Python 虚拟机按 sys.path 中的路径搜索包
所在的位置,可以通过以下方式修改:
修改 sys.path
在 sys.path 指定的目录中加入.pth 文件,其中写入路径
文本
定制一个名为 PYTHONPATH 的系统变量
55. . . . . . .
生存期行为
除非显式 reload ,否则每进程内,每个模块最多加载一次,在
不同位置 import 不会重复加载
56. . . . . . .
深入 Python
57. . . . . . .
生成器 yield
58. . . . . . .
生成器 yield
yield 关键字临时挂起函数,返回值,然后继续执行,最初用于
简写迭代子(iterator)逻辑,现在通常视为实现 coroutine 模
式的通用工具。
§
1 def xrange(x=None, y=None, step=1):
2 . . . # 容错代码,详见示例文件中的 xrange
3 s = start
4 if start < stop and z > 0:
5 while s < stop :
6 yield s
7 s += z
8 elif start > stop and z < 0:
9 while s > stop :
10 yield s
11 s += z
¦
59. . . . . . .
调用
用生成器和列表推导式生成序列。列表推导式技术随后我们詳細
的讨论。
§
1
2 >>> 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]
¦
60. . . . . . .
列表及迭代推导式 comprehension
61. . . . . . .
推导式
推导式可以方便的生成序列逻辑,可以用于简化
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 >>> # 组合技巧,生成以内的因数表100
7 >>> l =[(x,y) for x in xrange(1 , 100)
8 for y in xrange(1 , 100)
9 if x>y and x%y==0]
10 >>> # 将上表组合为更为友好的字典形式
11 >>> d = dict ((k , tuple ( t [1] for t in l
12 if t[0]==k ))
13 for k in range(1 , 100))
¦
62. . . . . . .
修饰器 decorator
63. . . . . . .
修饰器
修饰器可以将函数“修饰”为完全不同的行为,可以有效的将业务
逻辑正交分解,如用于将权限和身份验证从业务中独立出来。
§
1
2 # 常见的用法
3 @require logined
4 def dosomeing(arg ) :
5 . . .
¦
64. . . . . . .
定义修饰器
下例我们定义一个修饰器,强制函数参数必须是一个整数。需要
注意的是修符器返回的是修饰后的函数,而不是函数结果。
§
1 def require int ( foo ) :
2 def re (arg ) :
3 if type(arg) == int :
4 return foo (arg)
5 else :
6 raise ValueError (
7 "the arg must be a int " )
8 return re
¦
65. . . . . . .
使用修饰器
使用刚才的修饰器
§
1 @require int
2 def get it (arg ) :
3 return " I got the %s"%arg
4
5 get it (0) # 正确
6 get it (20) # 正确
7 get it ( 'abc ' ) # 错误,会抛出异常。
¦
66. . . . . . .
有关闭包实现的讨论
67. . . . . . .
闭包
闭包模式近几年开始受到关注,在 Python 中有几种方式可以实
现闭包。
68. . . . . . .
闭包的定义
闭包可以用来在一个函数与一组“私有”变量之间创建关联关系。
在给定函数被多次调用的过程中,这些私有变量能够保持其持久
性。变量的作用域仅限于包含它们的函数,因此无法从其它程序
代码部分进行访问。不过,变量的生存期是可以很长,在一次函
数调用期间所创建所生成的值在下次函数调用时仍然存在。正因
为这一特点,闭包可以用来完成信息隐藏,并进而应用于需要状
态表达的某些编程范型中。——维基百科
69. . . . . . .
简单的闭包
如果不追求通用的闭包模式,以下就是一个简单的闭包,它有一
个只读的自由变量作用域:
§
1 def closure (base ) :
2 def re (x ) :
3 return base∗∗x
4 return re
¦
70. . . . . . .
如何携带可变状态?
但是,这种思路构造的闭包,不能自由的修改
§
1 def closure (base ) :
2 accumulation = 0
3 def re (x ) :
4 # 此处会报错
5 accumulation += base∗∗x
6 return accumulation
7 return re
8 # 通过以上方式得到的闭包函数,不能如预期累积计算结果
¦
71. . . . . . .
修饰器闭包
直接使用修饰器就可以得到功能更强的闭包。但需要一定的" 黑
箱操作"。
§
1 class Closure ( object ) :
2 def i n i t ( self , ∗∗keywords ) :
3 for keyword in keywords:
4 # 这里使用对象的 d i c t 添加数据成员
5 self . d i c t [keyword] =
6 keywords[keyword]
7 # 重载括号运算符
8 def c a l l ( self , foo ) :
9 def re (∗args , ∗∗keywords ) :
10 keywords[ ' self ' ] = self
11 return foo (∗args , ∗∗keywords)
12 return re
¦
72. . . . . . .
使用修饰器闭包
可以从以下函数调用中看到函数访问闭包携带的状态所带来的修
改。
§
1 >>> print foo(10)
2 10
3 >>> print foo(20)
4 30
5 >>> print foo(−30)
6 0
¦
73. . . . . . .
python 3 的闭包
Python 3 中增加了 nonlocal 关键字,允许用户以更精确的方
式控制变量访问的命名域。在 Python 3 中闭包成为一个更自
然、易用的模式。
74. . . . . . .
双向迭代器与协作模式
75. . . . . . .
双向 yield
yield 不仅可以用于输入,也可以用于输出,它可以用于实现双
向的协作(coroutine)模式。
§
1 def rolladd ( xstart=1, ystart=1):
2 x = yield xstart
3 y = yield ystart
4 while True :
5 t = y
6 y = x
7 x = yield x+t
¦
76. . . . . . .
双向 yield 的应用
下例可以生成菲波那切数列,也可以通过初始状态设置和内外交
互,生成其它的数列。
§
1 fabber = rolladd ()
2 x = fabber .send(None)
3 print x
4
5 for i in range(1 , 10):
6 x = fabber .send(x)
7 print x
¦
77. . . . . . .
常见框架、工具和库
78. . . . . . .
pypi
pypi 是 Python 社区的在线资源服务,要使用它,需要安装
setuptools 。然后执行 easy install 命名即可安装所需的软件
包。
下面所提到的组件和框架,除了已经内置在 Python 发行版中
的,其它都可以通过这种方式安装
79. . . . . . .
并发
进程库 subprocess
80. . . . . . .
并发
进程库 subprocess
并发库(2.6+)multiprocessing
81. . . . . . .
并发
进程库 subprocess
并发库(2.6+)multiprocessing
线程库 threading/threads
82. . . . . . .
并发
进程库 subprocess
并发库(2.6+)multiprocessing
线程库 threading/threads
协程并发库(高性能,合作式并发,第三方)gevent
83. . . . . . .
测试工具
内嵌式的文档式测试工具 doctesting。
84. . . . . . .
测试工具
内嵌式的文档式测试工具 doctesting。
单元测试工具 unittest
85. . . . . . .
测试工具
内嵌式的文档式测试工具 doctesting。
单元测试工具 unittest
性能分析工具 profile/cprofile
86. . . . . . .
数据库驱动
内置的 sqlite3
87. . . . . . .
数据库驱动
内置的 sqlite3
KV 库 BDB 的封装 shelve.BsdDbShelf
88. . . . . . .
数据库驱动
内置的 sqlite3
KV 库 BDB 的封装 shelve.BsdDbShelf
mysql 封装 mysqldb
89. . . . . . .
数据库驱动
内置的 sqlite3
KV 库 BDB 的封装 shelve.BsdDbShelf
mysql 封装 mysqldb
postgresql 封装 psycopg2
90. . . . . . .
数据库驱动
内置的 sqlite3
KV 库 BDB 的封装 shelve.BsdDbShelf
mysql 封装 mysqldb
postgresql 封装 psycopg2
通用 ORM 工具 SQLAlchemy
91. . . . . . .
Web 框架
公司使用最多的 Django
92. . . . . . .
Web 框架
公司使用最多的 Django
值得关注的轻量级框架 web.py
93. . . . . . .
Web 框架
公司使用最多的 Django
值得关注的轻量级框架 web.py
高性能框架 tornado
94. . . . . . .
Web 框架
公司使用最多的 Django
值得关注的轻量级框架 web.py
高性能框架 tornado
积木式的 turbogears/pylons
95. . . . . . .
谢谢大家!再见!
Power By LATEX!