Python - 模块编程要点

以下内容参考自《Python学习手册》。

(一)基本用法

#module1.py(示例模块)
x = 1
def printer():
	print x
  • import语句:模块中的成员要通过模块对象来获取。e.g.
    >>> import module1
    >>> module1.printer()
    1
    
  • from语句:把模块的成员复制到当前的全局作用域。这种情况下修改变量并不会影响模块对象的变量。
    >>> from module1 import printer
    >>> printer()
    1
    >>> from module1 import x
    >>> x = 2
    >>> import module1
    >>> module1.x
    1
    
  • from *语句:获取模块的所有成员的拷贝。
    >>> from module1 import *
    >>> printer()
    1
    
    使用from *语句时可以采用特定的措施限制拷贝的变量:
    • 变量名以_开头的成员无法被拷贝。e.g.
      # module2.py
      _a = 1
      
      >>> from module2 import *
      >>> _a
      Traceback (most recent call last):
        File "", line 1, in <module>
      NameError: name '_a' is not defined
      >>> import module2
      >>> module2._a
      1
      
    • 只拷贝__all__列表中变量名对应的成员。e.g.
      #module3.py
      __all__ = ["b"]
      b = 2
      c = 3
      
      >>> from a import *
      >>> b
      2
      >>> c
      Traceback (most recent call last):
        File "", line 1, in <module>
      NameError: name 'c' is not defined
      
  • as扩展:为模块或属性起别名。
    • import modulename as name相当于:
      import modulename
      name = modulename
      del modulename
      
    • from modulename import attrname as name

(二)模块导入与重载

  1. 导入只发生一次:模块只在第一次importfrom时载入并执行,因为该操作开销较大,之后的导入操作都只读取已加载的模块对象。
  2. 模块命名空间
    • 顶层的赋值语句会创建模块属性。
    • 模块的命名空间能通过属性__dict__dir(M)获取。内置属性__file__指明模块从哪个文件加载,__name__属性只指明导入文件的名称(如果文件是以顶层文件执行,__name__属性则为字符串"__main__")。
    • 模块是一个独立的作用域(本地变量就是全局变量)。变量的获取使用点号运算。
  3. 重载模块
    • python2:直接调用内置的reload函数。e.g.
    >>> reload(module1)
    
  • python3:调用imp模块的reload函数。e.g.
    >>> import imp
    >>> imp.reload(module1)
    
    注:reload不会影响from导入。

(三)模块包

  • 要引用路径为dir0\dir1\dir2\mod.py的模块(dir0为容器),import语句为import dir1.dir2.mod
  • 包导入语句的路径中的每个目录内都必须要有__init__.py这个文件。按照前面的示例:
    • dir1dir2中必须都含有一个__init__.py文件。导入模块时会自动执行__init__.py文件,而且只会执行一次。
    • dir0是容器,不需要__init__.py文件;如果有的话,这个文件也会被忽略。
    • dir0(而非dir0\dir1)必须列在模块搜索路径中(也就是此目录必须是主目录,或者列在PYTHONPATH中)。

(四)官方常用模块

  • copy模块
    • 浅复制:copy.copy(x)
    • 深复制:copy.deepcopy(x)
  • types模块

    以下为python2的types模块的部分源码:

    NoneType = type(None)
    TypeType = type
    ObjectType = object
    
    IntType = int
    LongType = long
    FloatType = float
    BooleanType = bool
    try:
        ComplexType = complex
    except NameError:
        pass
    
    StringType = str
    try:
        UnicodeType = unicode
        StringTypes = (StringType, UnicodeType)
    except NameError:
        StringTypes = (StringType,)
    
    BufferType = buffer
    
    TupleType = tuple
    ListType = list
    DictType = DictionaryType = dict
    
    def _f(): pass
    FunctionType = type(_f)
    LambdaType = type(lambda: None)
    CodeType = type(_f.func_code)
    
    def _g():
        yield 1
    GeneratorType = type(_g())
    
    class _C:
        def _m(self): pass
    ClassType = type(_C)
    UnboundMethodType = type(_C._m)
    _x = _C()
    InstanceType = type(_x)
    MethodType = type(_x._m)
    
    BuiltinFunctionType = type(len)
    BuiltinMethodType = type([].append)
    
    ModuleType = type(sys)
    FileType = file
    XRangeType = xrange
    
    SliceType = slice
    
    del sys, _f, _g, _C, _x	# Not for export
    __all__ = list(n for n in globals() if n[:1] != '_')
    
    • python2中有intlong之分,python3都归为int
    • python2中有经典类和新式类之分,python3则统一为新式类。e.g.
      >>> class A:
      ...     pass
      ...
      >>> type(A) is types.ClassType
      True
      >>> type(A()) is types.InstanceType
      True
      >>> class B(object):
      ...     pass
      ...
      >>> type(B) is type
      True
      >>> type(B()) is B
      True
      
  • os模块
    可参见Python - 文件和目录操作

  • random模块

    • 设置种子:random.seed(x=None)
    • [0, 1)之间的随机浮点数:random.random()
    • [a, b]之间的随机浮点数:random.uniform(a, b)
    • [a, b]之间的随机浮点数,mode参数用于调节结果的分布,默认是a和b的平均值:random.triangular(a=0.0, b=1.0, mode=None)
    • [a, b]之间的随机整数:random.randint(a, b)
    • 序列(str, list, tuple以及实现了__getitem__方法的其他类型)中的任意一个元素:random.choice(seq)
    • [a, b)之间指定间隔中的随机整数:random.randrange(a, b=None, step=1)
    • 从序列(同上)中随机选取指定个数的元素,随机排列并以list的形式返回:random.sample(seq, k)
    • 对序列(list以及同时实现了__getitem____setitem__方法的其他类型)进行重新随机排列,排列结果直接作用于参数:random.shuffle(seq)
  • re模块
    可参见Python 正则表达式

  • gc模块
    垃圾回收的原理可参见垃圾回收机制和gc模块
    常用方法:

    • gc.get_referents(obj):获取obj引用的对象列表。e.g.

      >>> a = [1, '1']
      >>> gc.get_referents(a)
      ['1', 1]
      >>> b = {'1': a}
      >>> gc.get_referents(b)
      ['1', [1, '1']]
      
    • gc.get_referrers(obj):获取引用了obj的对象列表。e.g.

      >>> gc.get_referrers(a)
      [{'1': [1, '1']}, {'a': [1, '1'], 'b': {'1': [1, '1']}, '__builtins__': <module '__builtin__' (built-in)>, '__package__': None, 'gc': <module 'gc' (built-in)>, '__name__': '__main__', '__doc__': None}]
      

      如果只是获取个数可使用sys.getrefcount(obj),返回结果会比正常个数多1。e.g.

      >>> sys.getrefcount(a)
      3
      

你可能感兴趣的:(编程语言,#,note)