Python速成指南

22,164 views

Published on

给同事做的 Python 速成讲座

Published in: Education, Technology
4 Comments
83 Likes
Statistics
Notes
No Downloads
Views
Total views
22,164
On SlideShare
0
From Embeds
0
Number of Embeds
1,792
Actions
Shares
0
Downloads
1,168
Comments
4
Likes
83
Embeds 0
No embeds

No notes for slide

Python速成指南

  1. 1. . . . . . . Python 语言速成 刘鑫 <liuxin2@kingsoft.com> 两小时内学会 Python November 11, 2010
  2. 2. . . . . . . 预备内容
  3. 3. . . . . . . 目标人群 有其它语言经验的技术人员
  4. 4. . . . . . . 目标人群 有其它语言经验的技术人员 对 Python 很少或没有了解
  5. 5. . . . . . . 目标人群 有其它语言经验的技术人员 对 Python 很少或没有了解 想要短时间学会实用的 Python 编程知识
  6. 6. . . . . . . 目标人群 有其它语言经验的技术人员 对 Python 很少或没有了解 想要短时间学会实用的 Python 编程知识 想要了解深入学习 Python 的切入点
  7. 7. . . . . . . 我们的目标 了解常用的 Python 开发环境
  8. 8. . . . . . . 我们的目标 了解常用的 Python 开发环境 Python 的基本语法,达到可用程度
  9. 9. . . . . . . 我们的目标 了解常用的 Python 开发环境 Python 的基本语法,达到可用程度 了解一些常用的小技巧
  10. 10. . . . . . . 我们的目标 了解常用的 Python 开发环境 Python 的基本语法,达到可用程度 了解一些常用的小技巧 了解 Python “特有”的一些开发方法
  11. 11. . . . . . . 我们的目标 了解常用的 Python 开发环境 Python 的基本语法,达到可用程度 了解一些常用的小技巧 了解 Python “特有”的一些开发方法 学会管理 Python 环境
  12. 12. . . . . . . 我们的目标 了解常用的 Python 开发环境 Python 的基本语法,达到可用程度 了解一些常用的小技巧 了解 Python “特有”的一些开发方法 学会管理 Python 环境 面向 2.6/2.7 版
  13. 13. . . . . . . Python 环境
  14. 14. . . . . . . Python Shell Python Shell 对于 Python 使用者来说是重要的工作环境,所 以除了内置的命令行,还有一些强化的 Shell 环境。Python 开 发工具中也有一些提供了内置的 Python Shell。
  15. 15. . . . . . . Pure Python Shell Python 内置提供两套命 令行环境:基于控制台的 交互环境和基于 TK 图形 系统的 IDLE。 Figure: Python
  16. 16. . . . . . . Pure Python Shell IPython 是 Python 官方 文档中推荐的第三方扩展 Shell ,易学易用,外观 友好,功能丰富,与系统 环境融合良好,是非常好 用的交互式环境。 Figure: IPython
  17. 17. . . . . . . Pure Python Shell BPython 外观优美,提 供了很多实用的 Python 命令行功能,如自动完 成,代码提示,代码保 存,命令行回溯等,是一 个非常有特点的 Python Shell。 Figure: BPython
  18. 18. . . . . . . 常见开发工具 IDLE
  19. 19. . . . . . . 常见开发工具 IDLE Emacs/VIM
  20. 20. . . . . . . 常见开发工具 IDLE Emacs/VIM PyDev
  21. 21. . . . . . . 常见开发工具 IDLE Emacs/VIM PyDev 第三方编辑器
  22. 22. . . . . . . 工具选择的几个参考因素 支持 Python 語法加亮
  23. 23. . . . . . . 工具选择的几个参考因素 支持 Python 語法加亮 智能缩进
  24. 24. . . . . . . 工具选择的几个参考因素 支持 Python 語法加亮 智能缩进 TAB/空格转换
  25. 25. . . . . . . 工具选择的几个参考因素 支持 Python 語法加亮 智能缩进 TAB/空格转换 多内码支持
  26. 26. . . . . . . 基本语法
  27. 27. . . . . . . 变量、命名与数据类型
  28. 28. . . . . . . Hello World § 1 >>> print "Hello World" #我是注释 2 Hello World 3 >>> print u"你好!" #这里是一个字符串unicode你好 ¦
  29. 29. . . . . . . 变量、命名与对象 Python 中使用变量无需声明,每一个命名赋值后即在其命名域 中生效,成为一个变量,每个命名都绑定到一个对象。 § 1 >>> print x # 会出错 2 . . . 3 >>> x = " I 'm a var" #赋值即定义 4 >>> print x 5 I 'm a var ¦
  30. 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. 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. 32. . . . . . . 逻辑与逻辑运算符 Python 有基本的逻辑类型,多种数据类型参与逻辑判断时,规 则类似于 C 语言。 § 1 >>> True 2 True 3 >>> False 4 False 5 >>> [] and 1 # and / or 运算符 6 [] 7 >>> [] or 1 # Python 的隐式逻辑判断规则类似 c ¦
  33. 33. . . . . . . None 类似于关系型数据库的 NULL § 1 >>> None 2 3 >>> None and 1 4 5 >>> None or 1 6 1 7 >>> False == None 8 False ¦
  34. 34. . . . . . . 基本流程控制
  35. 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. 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. 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. 38. . . . . . . 迭代仿线性对象 只要接口符合,即使不是线性容器也可以: § 1 >>> f = open( "sample0.py" ) 2 >>> for line in f : 3 . . . print line 4 . . . ¦
  39. 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 ¦
  40. 40. . . . . . . 错误与异常
  41. 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. 42. . . . . . . With 语句 作为一种退化的形式,with 可以更简洁的保护外部资源,使之 不会因异常而泄漏。 § 1 >>> with open( "sample0.py" ) as f : 2 . . . for line in f : 3 . . . print line 4 . . . ¦
  43. 43. . . . . . . 代码抽象
  44. 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. 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. 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. 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. 48. . . . . . . 面向对象 Python 的面向对象机制类似 Smalltalk。采用全动态语法。
  49. 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. 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. 51. . . . . . . 更多自由,更少限制 Python 中没有真正意义的私有成员(可以定义形如 __obj 的 成员以阻止外部访问)。Python 编程风格不强制类型匹配和转 换,通常鼓励直接访问成员。——即所谓 duck typing。
  52. 52. . . . . . . 代码组织
  53. 53. . . . . . . 模块与包 Python 中,每一个文件被视作一个模块(module),每个带有 __init__.py 文件的目录被视作一个包(package)。
  54. 54. . . . . . . 模块与包的搜索 除了当前目录,Python 虚拟机按 sys.path 中的路径搜索包 所在的位置,可以通过以下方式修改: 修改 sys.path 在 sys.path 指定的目录中加入.pth 文件,其中写入路径 文本 定制一个名为 PYTHONPATH 的系统变量
  55. 55. . . . . . . 生存期行为 除非显式 reload ,否则每进程内,每个模块最多加载一次,在 不同位置 import 不会重复加载
  56. 56. . . . . . . 深入 Python
  57. 57. . . . . . . 生成器 yield
  58. 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. 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. 60. . . . . . . 列表及迭代推导式 comprehension
  61. 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. 62. . . . . . . 修饰器 decorator
  63. 63. . . . . . . 修饰器 修饰器可以将函数“修饰”为完全不同的行为,可以有效的将业务 逻辑正交分解,如用于将权限和身份验证从业务中独立出来。 § 1 2 # 常见的用法 3 @require logined 4 def dosomeing(arg ) : 5 . . . ¦
  64. 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. 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. 66. . . . . . . 有关闭包实现的讨论
  67. 67. . . . . . . 闭包 闭包模式近几年开始受到关注,在 Python 中有几种方式可以实 现闭包。
  68. 68. . . . . . . 闭包的定义 闭包可以用来在一个函数与一组“私有”变量之间创建关联关系。 在给定函数被多次调用的过程中,这些私有变量能够保持其持久 性。变量的作用域仅限于包含它们的函数,因此无法从其它程序 代码部分进行访问。不过,变量的生存期是可以很长,在一次函 数调用期间所创建所生成的值在下次函数调用时仍然存在。正因 为这一特点,闭包可以用来完成信息隐藏,并进而应用于需要状 态表达的某些编程范型中。——维基百科
  69. 69. . . . . . . 简单的闭包 如果不追求通用的闭包模式,以下就是一个简单的闭包,它有一 个只读的自由变量作用域: § 1 def closure (base ) : 2 def re (x ) : 3 return base∗∗x 4 return re ¦
  70. 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. 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. 72. . . . . . . 使用修饰器闭包 可以从以下函数调用中看到函数访问闭包携带的状态所带来的修 改。 § 1 >>> print foo(10) 2 10 3 >>> print foo(20) 4 30 5 >>> print foo(−30) 6 0 ¦
  73. 73. . . . . . . python 3 的闭包 Python 3 中增加了 nonlocal 关键字,允许用户以更精确的方 式控制变量访问的命名域。在 Python 3 中闭包成为一个更自 然、易用的模式。
  74. 74. . . . . . . 双向迭代器与协作模式
  75. 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. 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. 77. . . . . . . 常见框架、工具和库
  78. 78. . . . . . . pypi pypi 是 Python 社区的在线资源服务,要使用它,需要安装 setuptools 。然后执行 easy install 命名即可安装所需的软件 包。 下面所提到的组件和框架,除了已经内置在 Python 发行版中 的,其它都可以通过这种方式安装
  79. 79. . . . . . . 并发 进程库 subprocess
  80. 80. . . . . . . 并发 进程库 subprocess 并发库(2.6+)multiprocessing
  81. 81. . . . . . . 并发 进程库 subprocess 并发库(2.6+)multiprocessing 线程库 threading/threads
  82. 82. . . . . . . 并发 进程库 subprocess 并发库(2.6+)multiprocessing 线程库 threading/threads 协程并发库(高性能,合作式并发,第三方)gevent
  83. 83. . . . . . . 测试工具 内嵌式的文档式测试工具 doctesting。
  84. 84. . . . . . . 测试工具 内嵌式的文档式测试工具 doctesting。 单元测试工具 unittest
  85. 85. . . . . . . 测试工具 内嵌式的文档式测试工具 doctesting。 单元测试工具 unittest 性能分析工具 profile/cprofile
  86. 86. . . . . . . 数据库驱动 内置的 sqlite3
  87. 87. . . . . . . 数据库驱动 内置的 sqlite3 KV 库 BDB 的封装 shelve.BsdDbShelf
  88. 88. . . . . . . 数据库驱动 内置的 sqlite3 KV 库 BDB 的封装 shelve.BsdDbShelf mysql 封装 mysqldb
  89. 89. . . . . . . 数据库驱动 内置的 sqlite3 KV 库 BDB 的封装 shelve.BsdDbShelf mysql 封装 mysqldb postgresql 封装 psycopg2
  90. 90. . . . . . . 数据库驱动 内置的 sqlite3 KV 库 BDB 的封装 shelve.BsdDbShelf mysql 封装 mysqldb postgresql 封装 psycopg2 通用 ORM 工具 SQLAlchemy
  91. 91. . . . . . . Web 框架 公司使用最多的 Django
  92. 92. . . . . . . Web 框架 公司使用最多的 Django 值得关注的轻量级框架 web.py
  93. 93. . . . . . . Web 框架 公司使用最多的 Django 值得关注的轻量级框架 web.py 高性能框架 tornado
  94. 94. . . . . . . Web 框架 公司使用最多的 Django 值得关注的轻量级框架 web.py 高性能框架 tornado 积木式的 turbogears/pylons
  95. 95. . . . . . . 谢谢大家!再见! Power By LATEX!

×