python教程

基础

环境

  • REPL
  • ipython
  • emacs

实践: hello, world

类型

  • 字符变量
  • 数字变量
  • 布尔变量
  • 序列容器
  • 非序列容器
  • 第一类函数对象(first class function)

结构

  • 选择结构
  • 循环结构
  • 迭代结构
  • 块结构

实践: Guess the number/with feedback

函数

  • 普通函数
  • 匿名函数
  • 变长参数
  • 参数默认值
  • 生成器

实践: fibonacci/memorized

小技巧

  • 列表推导式
  • 闭包
  • 装饰器
  • map/reduce

作用域规则(scoping)

  • LGB
  • LEGB
  • unbound

实践: 24 game

面对对象

  • 成员变量
  • 成员函数
  • 可见性
  • 继承
  • property
  • 多继承
  • plugin

实践:

  • balanced tree/two dimension
  • balanced tree/three dimension

异常

  • 执行转移
  • 系统异常和程序异常

实践: 异常重定向

模块

  • 路径和导入规则

实践: dynamic plugin modules

闭包和对象类的联系

class Out(object):
    def __init__(self, a, b, c):
        self.a, self.b, self.c = a, b, c
    def __call__(self):
        use self.a, self.b, self.c
        return xxx

装饰器注册

class Reg(object):
    def __init__(self):
        d = {}
    def register(self, path):
        def inner(f):
            self.d[path] = f
            return f
        return inner

reg = Reg()

@reg.register('/abc/')
def action1():
    pass

反模式

函数默认值

函数的默认值,在同一个函数内是同一个。不要用可变值作为默认值。

def sumobj(l=None):
    if l is None: l = []
    return reduce(lambda x, y: x+y, l)

局部变量定义

在内层中后定义的对象会导致先使用的对象出错,尤其在全局有同名变量时,这容易产生混淆。

a = 1
def func():
    print a
    a = 2

更具有迷惑性的例子:

a = 1
def func():
    if True: print a
    else: a = 2

battery inside

内置模块

  • os
  • sys
  • re
  • path
  • datetime
  • logging
  • math
  • random
  • shutil
  • hashlib
  • getopt
  • collections
  • ConfigParser

实践: getopt

文件系统

  • 读写
  • 管理
  • 对象序列化
  • json
  • pickle
  • marshal
  • 不同格式读写
  • csv
  • zipfile
  • tarfile

实践: find duplicate files

第三方模块

  • requests
  • beautifulsoap

高级特性

测试

  • unittest

示例:

  • hashlib

调试

  • pdb

  • 使用
  • 定义

  • 每次取得一个元素
  • 不可跳过下一个元素取得后续元素
  • 不可回朔前一个元素

过滤和映射

  • 列表推导 [map(i) for i in list if filter(i)]

  • 循环

    rslt = []
    for i in list:
    if filter(i): continue
    i = map(i)
    rslt.append(i)

  • 函数式

    def proc(i):
    do i
    def isi(i):
    test i
    map(proc, filter(isi, list))
    注意itertools的imap和ifilter才是生成器模式,2.7中的map和filter都是直接把结果list生成出来的。

  • dict过滤

    dict([(mapk(k, v), mapv(k, v)) for k, v in dict.iteritems() if filter(k, v)])

  • dict推导式(python3后有效) {k: v for k, v in dict.iteritems()}

列表推导和循环隐含假定不可并发,函数式隐含假定可并发。

过滤装饰器

结合生成器流和过滤的手法。

def filterxxx(list):
    for i in list:
        if filter(i): continue
        i = map(i)
        yield i
for i in filterxxx(source):
    do i

优点是很容易写出多层过滤正交。

实践: find duplicate files/insertable functions

网络

底层协议

  • tcp协议栈
  • 服务器端
  • 客户端
  • udp协议栈

实践: ping-echo server(tcp and udp mode)

应用层协议

  • urllib
  • smtplib

代码风格

过程式风格

  • 一行语句完成一项简单工作
  • 自行显式管理中间变量
  • 偏好迭代而非递归
  • 基本控制结构为分支和循环

面对对象风格

  • 复杂的对象和继承结构
  • 对象拥有众多方法
  • 对外暴露一致性抽象接口

要点

  • 不要在基类中声明一遍未实现
  • 可以放弃显式基类,改为约定基类(duck typing)
  • 多接口可以用maxin模式实现
  • 少用super

函数式风格

  • 大量使用高阶函数和第一类函数对象
  • 在小幅使用闭包替代微型类
  • 一行流,代码经常写成lisp缩进风格
  • 经常使用“无副作用函数”
  • 偏好递归而非迭代
  • 基本控制结构为函数构造形态

要点

  • 不要过度迷信函数对象,尤其是在python没有尾递归优化,函数调用开销又很高的情况下。
  • 注意什么时候用闭包,什么时候用类。
  • lisp风格的一行流不利于调试,python没有调用树中间显示,因此在这一行上报出的错误可能是在任何一个调用中,需要自行判断
  • lambda可以用于lazy evaluation,很有用

结合多种风格

  • 在面对对象风格的具体函数实现中,可能出现局部的过程风格和函数风格。
  • 对象可能大量产生一类函数对象,用于高阶函数中。
  • 完成目标的风格是最好的风格

哲学

duck typing

  • 没有基类,却行为一致,就可以互换使用
  • 不要将静态语言思路用于动态语言,尤其是多重继承和父类的空函数
  • 正确的传递和处理参数是程序员的责任,不是IDE的

POLA

the principle of least astonishment

  • 函数返回值是否有多种可能,需要根据情况来判断?
  • 函数返回值确定,但是值的类型是否多变?

错误处理

  • 函数不可能又返回值又返回错误,使用异常处理错误。
  • 尽早出错。不要做输入检测,不要写保护性代码,不要容错,不要处理异常。
  • 不要捕获额外的错误,尤其禁止捕获Exception
  • 尽量使用python现有的异常,例如ValueError。除非有必要做出区分。
  • Errors should never pass silently, Unless explicitly silenced.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容