《简明Python教程》笔记

简明Python教程是A Byte of Python的中译本, 旨在引导读者快速入门。本文总结了该教程Python 2.x版Python 3.x版的内容和差异。

介绍

Python的特色

  • 解释型
  • 面向对象
  • 动态数据类型
  • 胶水语言
  • 标准库功能齐全

起步

使用交互式的提示符

  • 在命令行输入python进入交互环境。
  • Python 2.x 直接输入print 'hello world'。Python 3.x 中print不再是操作符,而成为函数,使用方法为print('hello world')
  • 运行help()获取帮助,按q退出帮助。help(func)得到函数的信息。加入引号print('str')可得到操作符的信息。

使用源文件

  • 将代码保存为helloworld.py。然后,在终端执行python helloworld.py或者./helloworld.py
  • 要直接运行Python程序,在Unix有个标准的实现方法:在源文件行首加上#!/usr/bin/python。它被称作组织行,源文件的头两个字符是#!(叫做pound bang或者shebang),后面跟着一个程序的绝对路径。如果不知道位置,可以写成#!/usr/bin/env python,但有多个python版本共存时不可以,因为旧版本的Python可能运行程序。
  • Unix/Linux用户需要chmod a+x helloworld.py命令使文件可执行。

基本概念

  • 四种类型:整数、长整数、浮点数、复数

字符串

  • 双引号与单引号字符串完全相同
  • 三引号('''""")指示多行的字符串
  • 转义符\也可用于表示下一行继续
  • 自然字符串通过给字符串加上前缀rR来指定
  • Unicode字符串前加前缀uU
  • 字符串不可变
  • 相邻字符串会被自动级连,如'hello' 'world'会被自动转为'helloworld'。注意,如果输入print 'hello','world',逗号会变为空格,结果为hello world

标识符

  • 第一个字符为字母或下划线
  • 其他部分可以为字母、下划线、数字
  • 大小写敏感

对象

  • 数、字符串、函数都是对象
  • 使用变量时不需要声明或定义数据类型

逻辑行与物理行

  • 建议每个物理行只写一句逻辑行
  • 尽量避免使用分号

缩进

  • 同一层次的语句必须有相同的缩进

运算符与表达式

  • 运算符
  • 优先级
  • 表达式

控制流

  • if: 没有switch,用if..elif..else或字典完成同样工作
  • while: 有一个可选的else从句
  • for..in: 如for i in range(0,5), 可选else从句
  • break 和 continue: 在循环中使用

函数

global语句

  • global语句声明变量是全局的,当在函数内给赋变量的时候,变化也反映在主块中。

默认参数

  • 只有形参表末尾的参数可以有默认值。如def func(a, b=5)是有效的,def func(a=5, b)是无效的。

关键参数

  • 使用名字(关键字)而不是位置(默认从左到右赋值)来给函数指定实参。如def func(a,b=2,c=3):可以这样调用func(c=50, a=100)。有两个好处:1. 不必担心参数顺序。2. 可以只给我们想要的那些参数赋值

DocStrings

  • 文档字符串的惯例是一个多行字符串,它的首行以大写字母开始,句号结尾。第二行是空行,从第三行开始是详细的描述。
  • 可以通过func.__doc__(注意双下划线)得到函数的文档字符串属性。

模块

简介

  • 利用import语句输入sys模块
  • sys.argv包含了命令行参数的列表

字节编译的.pyc文件

  • 使输入模块更快
  • 与平台无关

from..import语句

  • 应避免使用from..import而使用import语句,因为这样可以使程序更易读,也可以避免名称的冲突。

模块的name属性

  • 每个Python模块都有它的__name__,如果它是'__main__',说明这个模块被用户单独运行。

dir()函数

  • 可以使用内建的dir()来列出模块定义的标识符,如dir(sys)。标识符有函数、类和变量。
  • 不给dir()传递参数,默认返回当前模块的属性列表。
  • 使用del语句删除当前模块中的变量/属性。

数据结构

列表

  • 列表是可变的数据类型
  • 列表中的项目包括在方括号中,如shoplist = ['apple', 'mango', 'carrot', 'banana']
  • 删除用del,如del shoplist[0]

元组

  • 元组和字符串一样是不可变的
  • 元组的项目包括在圆括号中,如zoo = ('wolf', 'elephant', 'penguin')

字典

  • 键值对包含在花括号中,如d = {key1 : value1, key2 : value2 }
  • del语句删除键/值对,如del dict['key']

序列

  • 列表、元组和字符串都是序列
  • 索引操作符和切片操作符
    • shoplist[0]抓取第一个项目
    • shoplist[-2]抓取倒数第二个项目
    • shoplist[:]返回整个序列的拷贝
    • shoplist[:-1]返回除最后一个项目外包含所有项目的序列切片
    • 开始位置包含在序列切片中,而结束位置被排斥在切片外。

引用

  • 创建一个对象并给它赋一个变量的时候,这个变量仅仅引用那个对象,而不是表示这个对象本身!也就是说,变量名指向你计算机中存储那个对象的内存。这被称作名称到对象的绑定。
  • 要复制一个列表或者类似的序列或者其他复杂的对象(不是如整数那样的简单对象),必须使用切片操作符来取得拷贝。

解决问题

  • Windows把反斜杠\作为目录分隔符,而Python中表示转义符。所以Windows下路径字符串应使用'C:\\Documents'r'C:\Documents'
  • os.sep变量会根据操作系统给出目录分隔符,即在Linux、Unix下是'/',在Windows下是'\\',在Mac OS下是':'。使用os.sep而非直接使用字符使程序具有移植性。
  • 推荐使用zipfiletarfile创建归档。不推荐使用os.system,它容易引发严重的错误。

面向对象编程

  • 假如有一个类MyClass和这个类的实例MyObject。调用MyObject.method(arg1, arg2)时,会由Python自动转为MyClass.method(MyObject, arg1, arg2)
  • 方法与函数的区别只是一个额外的self变量
  • __init__方法类似于C++、C#和Java中的constructor,__del__方法与destructor的概念类似。
  • Python中所有的类成员(包括数据成员)都是公共的,所有的方法都是有效的。
    只有一个例外:如果数据成员名称以双下划线前缀,比如__privatevar,Python的名称管理体系会把它作为私有变量。

输入输出

  • 使file类的read、readline、write、close方法
  • 读模式('r')、写模式('w')、追加模式('a')
  • 使用picklecpickle模块的dumpload方法实现存取对象

异常

  • 使用try..except语句来处理异常
  • 使用raise语句引发异常,可以引发的错误或异常应该分别是一个Error或Exception类的直接或间接导出类。
  • 在无论异常发生与否的情况下都执行特定语句,使用try..finally
  • 在一个try块下同时使用except从句和finally块,需要把一个嵌入另外一个。

标准库

sys模块

  • sys.argv
  • sys.version、sys.version_info
  • sys.stdin、sys.stdout、sys.stderr

os模块

  • os.name字符串指示正在使用的平台。比如Windows是'nt',Linux/Unix是'posix'
  • os.getcwd()得到当前Python脚本工作的目录路径。
  • os.getenv()和os.putenv()分别用来读取和设置环境变量。
  • os.listdir()返回指定目录下的所有文件和目录名。
  • os.remove()用来删除一个文件。
  • os.system()用来运行shell命令。
  • os.linesep字符串给出当前平台使用的行终止符。如Windows使用'\r\n',Linux使用'\n',而Mac使用'\r'
  • os.path.split()函数返回一个路径的目录名和文件名。
  • os.path.isfile()和os.path.isdir()分别检验给出的路径是文件还是目录。
  • os.path.exists()检验给出的路径是否真地存在。

更多

特殊的方法

  • 特殊的方法都被用来模仿某个行为。例如,想要为类使用x[key]这样的索引操作(就像列表和元组一样),只需要实现__getitem__()方法就可以。在《Python参考手册》中可以找到所有的特殊方法。

单语句块

  • 语句块通过缩进层次与其它块区分开。但如果语句块只包含一条语句,可以在条件语句或循环语句的同一行指明它。但这种写法不推荐使用
if True: print('YES')

列表综合

  • 通过列表综合,可以从一个已有的列表导出一个新的列表。
#!/usr/bin/python
# Filename: list_comprehension.py
listone = [2, 3, 4]
listtwo = [2*i for i in listone if i > 2]
print listtwo           # [6,8]

在函数中接收元组和列表

  • 在args变量前有*前缀,所有多余的函数参数都会作为一个元组存储在args中。如果使用的是**前缀,多余的参数会被认为是一个字典的键/值对。
    def powersum(power, *args):
        total = 0
        for i in args:
            total += pow(i, power)
        return total
    
    print powersum(3,2,1)   # 9
    print powersum(3,10)    # 1000

lambda语句

  • lambda需要一个参数,后面仅跟单个表达式作为函数体,而表达式的值被这个新建的函数返回。注意,即便是print语句也不能用在lambda形式中,只能使用表达式。
    def make_repeater(n):
        return lambda s: s*n

    twice = make_repeater(2)

    print twice('word')     # wordword
    print twice(5)          # 10

exec语句

  • exec用来执行储存在字符串或文件中的语句
    exec 'print "Hello World"'

eval语句

  • eval用来计算存储在字符串中的有效表达式
    eval('2*3')

assert语句

  • assert用来声明某个条件是真的,非真的时候引发AssertionError
    >>> mylist = ['item']
    >>> assert len(mylist) >= 1
    >>> mylist.pop()
    'item'
    >>> assert len(mylist) >= 1
    Traceback (most recent call last):
      File "", line 1, in ?
    AssertionError 

repr函数

  • repr函数用来取得对象的规范字符串表示。反引号(也称转换符)可以完成相同的功能。注意,在大多数时候有eval(repr(object)) == object。可以通过定义类的__repr__方法来控制对象在被repr函数调用的时候返回的内容。
    >>> i = []
    >>> i.append('item')
    >>> `i`
    "['item']"
    >>> repr(i)
    "['item']"

你可能感兴趣的:(《简明Python教程》笔记)