开发需要在读 Python 核心编程,一些 Point 记录如下。

********************************************

版本相关

标准版的 Python 是用 C 来实现的,又称为 CPython,其他一些实现如 JPython、IronPython(C#)。

CPython 的一个局限是每个 Python 调用都会产生一个 C 函数调用(栈帧),意味着同时产生的调用是有限的,因此 CPython 难以实现用户级的线程库和复杂递归应用。

Stackless(对 Python 解释器做了修改,是独立分支)的 Python 实现可以突破这个限制,一个 C 栈帧可以拥有任意数量的 Python 栈帧,可以拥有几乎无穷的函数调用和巨大数量的线程。而另一个项目 Greenlets 也支持微线程,它是一个标准的 C 扩展,因此不需要对标准 Python 解释器做任何修改。

pypy 是用 Python 写的 Python 解释器,比 CPython 的执行性能好。建议安装预编译的 pypy 环境(可到 pkgs.org 下载)来编译安装新版 pypy(如果需要新版的话)。编译安装说明在这里,注意要达到要求的系统配置,否则很耗时(配置低要几天时间)。

PEP, Python Enhancement Proposal, 增强提案,是增加进 Python 的特性建议,提供了对新特性的完整描述。在新提案被整合进 Python 之前,需要通过社区、PEP 作者、实现者、Python 创始人(Guido van Rossum) 的一致同意。

Python 标准库提供了 unittest 模块,是一个叫做 PyUnit 的测试框架,需要对一个大系统进行回归测试时很有用。

有用的开发模块pdb 允许设置断点、检查堆栈;logging 用于日志功能;Python 2.5 中引入的 cProfile 提供性能测试。

********************************************

风格 & 设计

PEP20 写的是 Python 之禅 Pythonic。

  1. 典型模块的内部结构
  2.  
  3. # 1. Unix 起始行
  4. # 2. 模块文档
  5. # 3. 模块导入 (函数内部的 import 仅在该函数被执行时执行)
  6. # 4. 变量定义 (尽量少用全局变量)
  7. # 5. 类定义
  8. # 6. 函数定义
  9. # 7. 主程序

编码

文档字符串注释,在模块、类或者函数声名之后添加的字符串,可在运行时访问(xx.__doc__),也可自动生成文档。

缩进,避免使用 Tab 缩进,使用空格缩进,这样跨平台性和 IDE 通用性更好。

模块

__name__ 指示模块如何被加载,__name__ 为 module_name 或者 '__main__'

大部分 Python 模块都是用于导入调用的,直接运行模块应该调用该模块的回归测试代码。

所有模块都能执行代码,无缩进的代码在被 import 时就会执行。除了真正需要执行的代码外,所有的功能代码都应该在函数中。

通常只有主程序模块才有大量的顶级可执行代码,其他被导入的模块应该只有少量的顶级代码。

设计

在函数之外来做与用户交互的操作,除非函数本身就是用来做交互的过程。

工厂函数:类似于 file() int() dict() type() 等内建函数,返回一个对象。

********************************************

语法 & 技巧

Python 的对象(包括函数参数)都是传递引用,函数体内修改被传入的可变对象会影响这个对象,对于传入的不可变对象则不影响。

Python 有自动内存管理,不过 del 语句可以直接释放资源,导致对象的引用计数减少。

对于反复用到的模块属性,应该使用一个本地变量来指向它,以减少查询次数,提高执行速度。

Python 会缓存整数和字符串对象:>>> a=1; b=1; id(a)==id(b);       >>> a=1.0; b=1.0; id(a)!=id(b);

from types import IntType 并在代码中直接使用 IntType 比使用 types.IntType 好,因为可以减少一次查询(type.IntType)。

Python 中的 float 占据 8 个字节,完全遵守 IEEE 754 号规范。

  1. # 对象
  2. # 没有 __nonzero__() 方法的对象的默认 bool 值是 True
  3. >>> print x
  4. 'x'
  1. # 交互式环境
  2. >>> help( raw_input ) # 获得 raw_input() 的帮助
  3.  
  4. >>> str = 'hello'
    >>> print str # print 语句调用 str() 来显示对象,而交互式解释器使用 repr() 来显示对象
    'hello' # print var , 添加逗号可以使 print 不换行
  5.  
  6. >>> _ # 交互式环境中,_ 表示最后一个表达式的值
    hello
  7.  
  8. # print 支持将输出重定向到文件
    >>> print >> sys.stderr, 'Fatal error: invalid input!'
    >>> logfile = open('./mylog.txt','a')
    >>> print >> logfile, 'Fatal ...'
    >>> logfile.close()
  1. # 变量与运算符 - 复杂运算表达式尽量多用括号,代码会更健壮,可读性更强
  2. #
    # 运算符可重载,需要注意变量类型
    # 算术:+ - * / // % **,其中 // 用作浮点除法(不管操作数是什么类型)
  3. # 逻辑:and or not
  4. # 比较:< <= > >= == != <>,不等于推荐使用 C 风格的 !=,ABC/PASCAL 风格的 <> 慢慢地被淘汰了
    # Python 不支持 C 语言的自增和自减运算符,--n 会被解释为 -(-n),++n 会被解释为 +(+n) —— 当作单目运算符
    #
    # 变量名大小写敏感,built-in 关键字可以通过 iskeyword() 查询
    # 数字变量:int(有符号) long(大数) bool(算术运算中当作0/1) float complex(复数) decimal(十进制浮点数,无精度差)
    # 从 Python2.3 开始,不会再报整型溢出,超过 int 的运算结果会自动转换为 long,长整型后缀 L 也会变得可有可无
    # _ 前缀表示私有变量,在模块或类的外部不可见;__xxx 是类的私有变量,__xx__ 是系统的特殊变量
    #
    # 列表和元组可以当作数组用,切片运算可以得到子集,其区别在于:
    # 列表用 [] 包裹,元素个数和值可变
    # 元组用 () 包裹,不可以更改(尽管他们的内容可以),是只读列表
    # 字典用 {} 表示
    #
    # 数学运算的 built-in 函数:
    # abs() coerce()将两个数提升为同一种类型 divmod()得到商和余数 pow()可提供取余乘方 round()可选精度的舍尾
    # hex() oct() ord() chr() unichr() 仅用于整型
    >>> 3 < 4 < 5 # 在其他语言中一般不合法,但 Python 中合法且简洁,其意义为 3 < 4 and 4 < 5
    True
    >>> y = x = x + 1 # 链式赋值,但赋值语句不会返回值,这样是错误的:y = (x = x + 1)
    >>> y += 1 # 增量赋值,不需要复制引用的对象,Python 2.0 开始支持 += -= *= /= %= **= <<= >>= &= ^= |=
    >>> x, z = 1, 'str' # 元组赋值,建议使用 () 包裹元组以增加可读性。元组赋值可方便地交换变量:x,y=y,x
  1. # String
  2. # 对于字符串连接,''.join(list) 比 str1 + str2 高效,因为 + 会对参加连接的每个串分配新内存
    # 同理,('%s%s' % (str1,str2)).upper() 比 (str1+str2).upper() 高效
    # Python 字符串表示:'' 和 "" 没有差别,对转义符没差别,且 Python 中没有单个字符变量,只有子串
    # 字符串:索引 [] 和 切片 [:] 运算符得到子串,+ 用于连接,* 用于重复
    >>> url = urllib.urlopen('http://' # Python 允许将多个子串分行表示成一个长串,方便写注释
    ... 'localhost' # hostname
    ... ':8000' # port
    ... '/cgi-bin/friends2.py') # file
    >>> print url
    'http://localhost:8000/cgi-bin/friends2.py'
    >>> import re
    >>> m = re.search('\\[trn]', r'hello world\n') # 原始字符串以 r 开头,所有字符无转义,方便正则等场合
  1. # if exp: statement - elif - else exp 为非零或者 True 则为真
    #
    # for 可以迭代一个序列,使用 range() 可以迭代索引,Python2.3 中增加的 enumerate() 可以迭代索引+元素
    #
    # 列表解析:可以在一行中使用一个 for 将所有值放到一个列表当中:
    >>> squared = [ x ** 2 for x in range(4) ]
  2. >>> squared = [ x ** 2 for x in range(16) if not x % 2 ]
  3. 'tum'

Core Python Notes的更多相关文章

  1. Python notes

    1. range()函数的使用: a = range(n) # a = range(0,n) b = range(m,n) # b = range(m,n) alist = list(a) # ali ...

  2. 第一次碰到try-except(core python programming 2nd Edition 3.6)

    # coding: utf-8 # 使用Windows系统,首行'#!/usr/bin/env Pyton'无用,全部改为'# coding: utf-8' 'readtextfile.py -- r ...

  3. Core Python Programming一书中关于深浅拷贝的错误

    该书关于深浅拷贝的论述: 6.20. *Copying Python Objects and Shallow and Deep Copies "when shallow copies are ...

  4. 初识python notes

    python数据类型 数字 字符串 列表 元祖 字典 1.为什么要编程 编程的目的是解放人力,这就需要人通过编写程序的方式计算机代替人去自动干活 2.什么是编程语言 编程语言就是人与计算机之间沟通的介 ...

  5. core python

    一:正则表达式 闭包操作符 | 等同于 or   exp:a|b|c           . 匹配任意一个字符 (若匹配本字符,需转义使用 \.   不能匹配换行符\n及空字符串)    (^:匹配首 ...

  6. .net core && python

    最近.net core的发展,确实值得激动,强力推荐传教文章<.NET:持续进化的统一开发平台>http://www.cnblogs.com/wer-ltm/p/8776846.html ...

  7. core python applications

    第三章: 3.4 电子邮件 SMTP, POP 和 IMAP 协议 第五章: 5.1~5.3 tkinter 各种控件简介 Listbox

  8. 数值运算内建函数(core python programming 2nd edition 5.6.2)

    数值运算内建函数 函数  功能 abs(num) 返回 num 的绝对值 coerce(num1, num2) 将num1和num2转换为同一类型,然后以一个元组的形式返回. divmod(num1, ...

  9. [core python programming]chapter 7 programming MS office

    excel.pyw会有问题,解决如下: 因为python3x中没有tkMessageBox模块,Tkinter改成了tkinter你可以查看你的py当前支持的模块.在交互式命令行下输入>> ...

随机推荐

  1. Frame与启动流程

    1. frame与bounds的区别: frame是从屏幕的左上角开始计算位置,而bounds是从新添加view左上角作为(0,0)开始计算 bounds是以自身为参考系,所以左上角的点为原点 cen ...

  2. Java中的多线程总结(转)

      1.多线程概述 当一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执行流就是一个线程.主要以下几个优点: 线程之间很容易实现共享内存 创建线程代价较小 Java语言内置多线程功能支持 2.线 ...

  3. WPF会重写Windows GUI的历史吗?

    原文地址:http://tech.it168.com/zx/2007-09-15/200709141320653.shtml 你可能对微软的.NET框架3.0版本的最近的一次更新感到有点奇怪.主版本指 ...

  4. SequoiaDB 架构指南

    1 简介 SequoiaDB(巨杉数据库)是一款分布式非关系型文档数据库,可以被用来存取海量非关系型的数据,其底层主要基于分布式,高可用,高性能与动态数据类型设计,与当前主流分布式计算框架 Hadoo ...

  5. c# 循环语句练习题;

    1. 求100以内质数的和 2. 兔子问题 3. 九九乘法表:   一行一行打印: 4. 有一张超大的纸:   纸质的厚度是0.01:   对折多少次,可以达到珠峰的高度:   按照8848来计算: ...

  6. struts2框架通过jQuery实现AJAX应用

    众所周知,在web2.0时代,哪个web框架要是不跟AJAX沾点边,都不好意思说自己的框架有多么多么NB,当然struts也不例外,从 struts1开始到现在的struts2也都对AJAX有支持.A ...

  7. AC自动机(Aho-Corasick automation)模板 HDU:2222

    #include <iostream> #include <cstdio> #include <cstring> #include <queue> us ...

  8. VLC打开.264文件

    昨天收到几个文件名是:xxx.264的文件,这种文件属于视频图像的raw files,即只包含视频数据.由于缺少视频头文件,所以一般播放器难以播放出来.网上很多介绍的是.H264文件如何打开,以及用一 ...

  9. 《JavaScript语言精髓与编程实践》读书笔记一

    受到狗哥书单的影响,看到了豆瓣上的评论,买了这本书,然后囫囵吞枣似地用一个月的时间看完了.回头想想自己做的js项目,感觉都羞愧-什么东西都是拿来尝试了一下就用了,其实有很多写得超级丑的地方,看完这个让 ...

  10. python 解析 配置文件

    资料: https://docs.python.org/3/library/configparser.html 环境 python 3.4.4 RawConfigParser方式 example.cf ...