《Think Python》(1):变量、函数、接口设计

《Think python》的全称是《Think Python - How to Think Like a Computer Scientist》,中文名是《像计算机科学家一样思考Python》。这不仅是一本python入门的书籍,还是编程思想入门的书籍,非常适合没有编程基础的人上手。作者在讲述的时候并不拘泥于语法细节,而是逐步渗透编程的理念,每章都会介绍一些实用的调试技巧,非常实用。书中的练习也是循序渐进,跟着做书中练习水平会逐步提高。作者在官网上也给出了习题的参考答案,方面读者检查。下面按章节写一下读书笔记:

第1章 程序之道

  • 计算机科学家最重要的技能是问题解决。问题解决意味着发现问题,创造性地思考解决方案,以及清晰准确地表达解决方案的能力
  • Python是解释语言:源代码 -> 解释器 -> 输出
  • 几乎所有语言都会出现几类基本指令

    • 输入:从键盘、文件或者其他设备中获取数据
    • 输出:将数据显示到屏幕或者发送到文件或其他设备中
    • 数学:进行基本数学操作,比如加法和减法
    • 条件执行:坚持某种条件的状态,并执行相应的代码
    • 重复:重复执行某种动作,往往在重复中有一些变化
  • 调试:每当你试验新的语言特性时,应当试着故意犯错。这种试验会帮助你记住所读的内容,并能帮你学会调试,因为这样能看到不同的错误信息代表着什么。现在故意犯错,总比今后在编码中意外出错好。

第2章 变量、表达式和语句

  • 变量:大小写敏感,字母开头,可包含字母、数字、下划线
  • 0开头的整数是把八进制转换成十进制
  • /是舍入式除法,例如3/2=1,如果除数和被除数有一个为浮点,则为传统除法,例如3.0/2=1.5
  • #是单行注释,”””多行注释”””

第3章 函数

  • int可以将浮点数转换为整数,但不会做四舍五入操作,而是直接舍弃小数部分。
  • 函数的调用
1
2
3
4
5
6
7
8
9
import math #导入math模块
print math.pi #调用时用句点表示法
from math import pi #导入math模块的pi
print pi
from math import * #导入math模块的所以成员,直接调用,不需要句点表示法
#math是python内置的模块,如果把源文件和自己编写的模块放在同一目录下,可直接import 文件名,文件名不用加上.py
  • 练习3-5-2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
def do_twice(f):
f()
f()
def do_four(f):
do_twice(f)
do_twice(f)
def one_four_one(a,b,c):
a()
do_four(b)
c()
def print_plus():
print '+',
def print_dash():
print '-',
def print_shu():
print '|',
def print_space():
print '',
def print_end():
print
def nothing():
'do nothing'
def jian_jia():
one_four_one(nothing,print_dash,print_plus)
def hang1():
one_four_one(print_plus,jian_jia,print_end)
def shu():
one_four_one(nothing,print_space,print_shu)
def hang2():
one_four_one(print_shu,shu,print_end)
def shu_plus_dash():
one_four_one(nothing,hang2,hang1)
def print_grid():
one_four_one(hang1,shu_plus_dash,nothing)
print_grid()

案例分析:接口设计

  • 封装和泛化:

    1. 最开始写一下小程序,而不想要函数定义
    2. 一旦程序成功运行,将它封装到一个函数中,并加以命名
    3. 泛化这个函数,并添加合适的形参
    4. 重复步骤1到步骤3,直到你得到一组可行的函数。复制粘贴代码,以避免重复输入以及重复调试。
    5. 寻找可以使用会从狗来改善程序的机会。例如如果发现程序中几处地方有相似的代码,可以考虑将它们抽取出来做一个合适的通用函数。
  • 练习4-2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
from swampy.TurtleWorld import *
import math
def polyline(t, n, length, angle):
"""画多边线
t:对象
n:边数
length:边长
angle:角度
"""
for i in range(n):
fd(t, length)
lt(t, angle)
def arc(t, r, angle):
#画圆弧
arc_length = 2 * math.pi * r * angle /360 #弧长
n = int(arc_length / 3) + 1 #根据周长选择合适的n,使多边线接近圆弧
step_length = arc_length / n
step_angle = float(angle) / n
polyline(t, n, step_length, step_angle)
def double_arc(t, r, angle):
for i in range(2):
arc(t, r, angle)
lt(t, 180-angle)
def flower(t, n, r, angle):
"""画一个花
t:对象
n:花瓣的个数
r:圆弧的半径
angle:圆弧对应的角度
"""
for i in range(n):
double_arc(t, r, angle)
lt(t, 360.0/n)
world = TurtleWorld()
bob = Turtle()
bob.delay = 0
print bob
flower(bob, 10, 50, 60)
wait_for_user()
  • 练习4-3:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
from swampy.TurtleWorld import *
import math
def sanjiaoxing(t,r,angle):
"""等腰三角形
t:对象
r:半径
angle:三角形的顶角,角度
"""
dibian = 2*r*math.sin(angle*math.pi/360)
dijiao = (180-angle)/2.0
rt(t,angle/2)
fd(t,r)
lt(t,180-dijiao)
fd(t,dibian)
lt(t,180-dijiao)
fd(t,r)
lt(t,180+angle/2)
def one_pie(t,r,n):
"""画一个正多边形,中心和各顶点连线也连起来
t:对象
r:半径
n:多边形边数
"""
angle = 360.0/n
for i in range(n):
sanjiaoxing(t,r,angle)
def draw_pie(t, r, n):
"""画一个多边形,并把t移到右边
"""
one_pie(t, r, n)
pu(t)
fd(t, r*2 + 20)
pd(t)
world = TurtleWorld()
bob = Turtle()
bob.delay = 0
print bob
draw_pie(bob,50,5)
draw_pie(bob,50,6)
draw_pie(bob,50,7)
wait_for_user()

小结

按照书中的练习,一步步向前进行,不要跳着看。例题先自己想,不要急着看解释,练习不要直接看解答。如果是自己想不出来的,也不要只是把答案粘过来,尽可能的手打。现在用Visual Studio Community 2013感觉还不错,代码提示很方便,调试也很容易上手。