python 学习笔记(摘自《Python基础教程第2版》)

这里有一篇很详细的, http://www.worldhello.net/doc/python/python.mm.htm
以下是我的笔记
  1.  尽量使用 import, 而不使用 from xx import xx

  2. 每个包必须包含一个名为 __init__.py 的文件,以区分正常的文件夹

  3. python 中添加中文注释:
    在 py 文件最顶行添加: # -*- coding: utf-8 -*

  4.  列表与元组
    • 列表(list)是可变的, 由 [] 表示
    • 元组(tuple)是不可变的, 由()表示, 创建一个元组必须加一个括号, 即使只有一个元素
      如 42 是一个整数, (42)也是一个整数; 而 42, 则是一个元组, 相当于 (42,)
      总算明白为什么有些代码里的元组定义最后一定要加一个括号了
    • 元组和列表的主要区别是:
      元组可以在映射(和集合的成员)中当键使用,因为其不可变性, 而列表则不行

  5. 对 string 的 formt 时, % 右边的如果是元组或字典,就会被格式化为多个值,而其他的序列,包括列表,都会被格式化为一个值, 对于列表,会自动调用 str 将其转化为字符串, 再替换掉 %s

  6. 字典(dict), 由 {} 表示. 键与值之间用 : 分隔, 项之间用 , 分隔
    • 字典的格式化字符串,可以用 %(key)s % dict 来表示,相当方便啊
      >>> phone
      {'zf': '123', 'zyz': '456'}
      >>> "zf's phone number is %(zf)s." % phone
      "zf's phone number is 123." 
    • 对 dict 的清空操作,clear() 与赋值 {} 是不一样的, clear 会清空所有引用的 dict, 而赋值 {} 不会影响引用的 dict
    • 使用下标访问 dict, 若找不到 key, 会出错. 使用 get 方法, 则不会出错, 而会返 None 值, 或者get参数所带的值

  7. 序列解包(sequence unpacking)
    将多个值的序列解开, 依次放在变量的序列中, 当一个函数返回一个无组时,可由此方便的进行赋值
    >>> values = 1, 2, 3
    >>> values
    (1, 2, 3)
    >>> x, y, z = values
    >>> x
    1

  8. 并行迭代: zip.
    zip 可将两个序缩到一起, 返回以 列表 为元素的元组

  9. 编号迭代: enumerate
    使用 for xx in yy 时, 如果在循环体内想知道当前 xx 在 yy 中的下标,如果又使用 yy.index[xx] 则比较不爽, 正确的写法是
    for index, xx in enumerate(yy)

  10. 列表推导(list comprehension)
    结果将会返回新列表, 可以增加更多 for 语句的部分
    >>> [x*x for x in range(10) if x % 3 ==0]
    [0, 9, 36, 81]

  11. python 中的参数都是不可改变的, 如果改变了, 则会创新新的复制.
    如果传递的是列表或元组, 则也只能改变列表或元组内部的值,而不能改变列表或元组

  12. python 中可以在函数调用时提供参数名字,这样就可以无需考虑参数顺序了
    如 def hello(x, y) 调用时可以按 hello(y='1', x='2') 来调用

  13. 收集参数
    • 如果在写义时在参数前面加*,则可按 hello(1,2) 或 hello(1) 传递任意可变参数,传递过来的参数会被当成元组处理
    • 如果定义参数时前面回**, 则可按 hello(y='1', x='2') 或 hello(x='2') 来传递任意数目参数,传递过来的参数,会被当成字典处理 

  14. 异常处理 P133
    try except else finally

  15. 应使用新的类定义形式 NewStyle 而不使用旧的类定义形式 OldStyle
    class NewStyle(object):
           pass

    class OldStyle:
           pass

  16. python 的类的默认构造函数及析构函数
    • 构造函数 def __init__()
      为了保证子类能用父类的类成员,应该在子类的构造函数中以父类的 类名.__init__() 调用父类的构造函数.
      如果是在 python 中, 则可用 super 函数, 可以避免当有多个父类时, 需要写出每个父类的 __init__() 调用
    • 析构函数 def __del__()  由于具体调用时间不可知,建议避免用户定义析构函数

  17. 使用 @ 操作符来定义静态方法和静态成员函数

  18. 迭代器: 带有 next 方法的简单对象
    iter(obj) 从一个可迭代对象得到迭代器

  19. 生成器: 包含了关键字 yield 的函数
    • 当被调用时, 生成器函数返回一个生成器(一种特殊的迭代器), 可使用 send, throw 和 close 方法让活动生成器与外界交互
    • 当生成器被调用时, 在函数体中的代码不会被执行,而会返回一个迭代器. 每次调用 .next() 请求一个值, 就会执行生成器中的代码, 直到遇到一个 yield 或者 return 语句. yield 语句意味着应该生成一个值, return 语句意味着生成器要停止执行(不再生成任何东西)

  20. 集合: set
    • 集合是可变的, 所以不能用做字典的键.
    • 集合本身只能包含不可变(可散列)值, 所以集合不能包含其他集合.但可以使用 fronzenset 将一个集合转成不可变的, 从面可以做为其他集合的子集

  21. 数据库操作游标
    • rowcount  返回结果行数
    • fetchone() 获取下一行
    • fetchmany([size]) 获取多行
    • fetchall() 获取剩余年有行

  22. 保留 N 位小数, 使用函数 round
    round(1.35, 1)    # 1.4
    round(1.34, 1)    # 1.3

展开阅读全文

没有更多推荐了,返回首页