python 备忘

1 模块 包 库

模块:
在python中一个py文件就是一个模块(Module),也就是把相同功能的变量及函数放在一个文件,比如abc.py
模块包含 自定义模块、python内置模块以及第三方模块,在开发功能时可以引用他们
使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,但是也要注意,尽量不要与内置函数名字冲突。
但是存在一个新问题,不同开发者编写模块不能完全保证不会重名,如果模块名相同那怎么办?很大程度上,包就是为解决此问题而设计的.

包:
为了避免模块名冲突,Python引入了按目录来组织模块的方法,称为包(Package)
比如上述的abc.py和其他模块重名了,通过包来组织模块,避免冲突。方法是选择一个顶层包名,比如mypkg,按照如下目录组织:
mypkg
|- init.py
|-abc.py

引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。现在abc.py模块 的名称变成了mypkg.abc
每一个包目录下面都会有一个__init__.py的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。
init.py可以是空文件,也可以有Python代码,因为__init__.py本身就是一个模块,而它的模块名就是mypkg

这么一个简单包的结构我们了解之后,就可以组织更复杂的包,可以有多级目录,组成多级层次的包结构,比如:
newpkg
├─ info
│ ├─ init.py
│ ├─ test.py
│ └─ ddd.py
├─ init.py
├─ abc.py
└─ efg.py
按照上述,此时ddd.py的模块名变为newpkg.info.ddd

包也是特殊的模块,相比于普通模块,由于它是文件夹,所以多了一个__path的属性。

【需要注意的是:】
自身创建模块时要注意命名,不能和Python自带的模块名称冲突。
例如,系统自带了sys模块,自己的模块就不可命名为sys.py,否则将无法导入系统自带的sys模块。

库:
具备特定功能的包,用户安装后导入该模块 既可以使用

1.1 包/模块导入

当我们向文件导入某个模块时,导入的是该模块中那些名称不以下划线(单下划线“_”或者双下划线“__”)开头的变量、函数和类。
另外,我们也可以借助模块提供的 all 变量,该变量的值是一个列表,存储的是当前模块中一些成员(变量、函数或者类)的名称,通过在模块文件中显示设置 all 变量,当其它文件以“from 模块名 import *”的形式导入该模块时,该文件中只能使用 all 列表中指定的成员。
但是需要注意,这种使用 __all__限定只针对以“from 模块名 import *”的方式引入才生效,对于其他2种方式是无效的:import 模块名”、from 模块名 import 成员”。

除了模块,当导入包时,也可以在对应层级__init__.py中设置__all__ 变量 以指定导入的子包和模块,具体见下面详细说明。

1.1.1模块导入查询顺序

python 模块导入查询顺序
<1> 首先导入内建模块
<2> 在sys.path返回的列表中寻找,此时寻找有先后顺序:

程序的根目录(即当前运行python文件的目录,工程代码路径)
PYTHONPATH环境变量设置的目录
标准库的目录> DLLs lib
任何能够找到的*.pth文件的内容>(*.pth文件 可以添加在site.getsitepackages() 显示的路径下)
第三方扩展的site-package目录

1.1.2 init.py文件作用

__init__作用
实际上,如果目录中包含了 init.py 时,当用 import 导入该目录时,会执行 init.py 里面的代码。
(1 ) init.py主要控制包的导入行为,这样我们可以在__init__.py文件中批量导入我们所需要的模块,而不再需要一个一个的导入。(不建议这样使用)
比如有些库我们不想每次都一一导入,可以添加到__init__.py文件中:

#mypkg
#__init__.py
import os
import sys
#a.py
import mypkg

此时,我们访问__init__引入的module,需要加上包名,mypkg.os

(2) init.py还有一个重要的变量__all__, 用来将模块全部导入:

#mypkg
#__init__.py
__all__ = ['os', 'sys']
#a.py
from mypkg import *

此时,注册在__init__.py文件中__all__列表中的模块和包导入到当前文件中。__all__对 “全部导入”包操作(不用单独再导入子包)时很有用,可以在列表中列出需要导入的子包以及模块,比如:

package
  |- subpackage1
      |- __init__.py
      |- a.py
  |- subpackage2
      |- __init__.py
      |- b.py
  |- c.py
  |- d.py
  |- __init__.py
  
#外层 __init__.py
__all__ = ["c", "subpackage1"]

当我们在其他文件中执行: from package import *时,我们自定义的导入package其中的部分模块和子包。

1.1.3 模块导入方式

模块或者包导入的几种方式:
<1> import 包名[.模块名 [as 别名]]
<2> from 包名 import 模块名 [as 别名]
<3> from 包名.模块名 import 成员名 [as 别名]
用 [] 括起来的部分,是可选部分,即可以使用,也可以直接忽略。
注意,导入包的同时,会在包目录下生成一个含有 init.cpython-36.pyc 文件的 pycache 文件夹。

对于第一种:

通过此语法格式导入包中的指定模块后,在使用该模块中的成员(变量、函数、类)时,需添加“包名.模块名”为前缀;另外,当直接导入指定包时,程序会自动执行该包所对应文件夹下的 init.py 文件中的代码,并不会将包中所有模块全部导入到程序中,它的作用仅仅是导入并执行包下的 init.py 文件。【但是,如果需要,可以使用__init__.py来包含任何和所有子模块和子包。】
包的本质就是模块,导入模块时,当前程序中会包含一个和模块名同名且类型为 module 的变量,导入包也是如此,可以如下查看:
import my_package
print(my_package)
print(my_package.doc)
print(type(my_package))

对于第二种:

使用此语法格式导入包中模块后,在使用其成员时不需要带包名前缀,但需要带模块名前缀;此外,既然包也是模块,那么这种语法格式自然也支持 from 包名 import * 这种写法,它和 import 包名 的作用一样,都只是将该包的 init.py 文件导入并执行

第三种情况:

此语法格式用于向程序中导入“包.模块”中的指定成员(变量、函数或类)。通过该方式导入的变量(函数、类),在使用时可以直接使用变量名(函数名、类名)调用;另外,在使用此种语法格式加载指定包的指定模块时,可以使用 * 代替成员名,表示加载该模块下的所有成员

1.1.3.1 绝对导入

通过绝对路径导入包/模块,可以使用上述三种导入方式。

在当前模块中引入同级别的模块或者同级别的包下的模块的时候,最好把导入路径写完整。

绝对导入的不足之处:

导入同一个包下的模块需要写完整的导入路径;
假如要改变层级较高的包名,比如顶级包,那么所有导入路径都要改

1.1.3.2 相对导入

相对导入只能使用 from <> import <> 这种语法,并且使用 . 作为前导点
同一个包下的模块可以很方便的相互引用,使用像 from . import xxx 的语句;
顶层包的报名改了,包下的模块的相对导入的语句基本不用改.
eg:

package/
    __init__.py
    subpackage1/
        __init__.py
        moduleX.py
        moduleY.py
    subpackage2/
        __init__.py
        moduleZ.py
    moduleA.py
  
 #对于subpackage1/moduleX.py 或者 subpackage1/__init__.py 模块里面,可以使用相对导入的方式导入其它模块:
 #moduleX.py
from .moduleY import spam
from .moduleY import spam as ham
from . import moduleY
from ..subpackage1 import moduleY
from ..subpackage2.moduleZ import eggs
from ..moduleA import foo 

相对导入只适用于顶级包内的模块;
使用了相对导入的模块文件不能作为顶层执行文件.

1.1.4 其他

当模块名中间含空格或者以数字开头,此时直接导入会报错,这个时候我们需要python提供的内置函数 import() 引入模块,如:
import(“my test”)
import(“123test”)

1.2 如何查看一个模块/包包含哪些内容

方法一:
通过 dir() 函数,我们可以查看某指定模块包含的全部成员(包括变量、函数和类)。注意这里所指的全部成员,不仅包含可供我们调用的模块成员,还包含所有名称以双下划线“__”开头和结尾的成员,而这些“特殊”命名的成员,是为了在本模块中使用的,并不希望被其它文件调用。
若是想忽略那些特殊命令成员,可以:
print([e for e in dir(string) if not e.startswith(’_’)])

方法二:
还可以使用 all 变量
print(string.all)
all 变量在查看指定模块成员时,它不会显示模块中的特殊成员,过需要注意的是,并非所有的模块都支持使用 all 变量,因此对于获取有些模块的成员,就只能使用 dir() 函数。

1.3 进一步,查看包或者函数使用说明

查看具体某个module:
help(module)

查看模块中具体某个函数:

(1) help(module.func)
(2) 到方法的文件中去看函数的定义,利用module.__file__查看文件位置
(3)?module.func 大概看下方法
(4) 用 doc 变量获取其说明文档,help(module.func.doc)

eg:
如果我们想看下chrome驱动的选项模块中一个方法使用,可以如下操作:
help(selenium.webdriver.chrome.options.Options.add_argument)
注意,这里help能查看到使用说明需要模块中对应函数写了说明,否则显示为空

def add_argument(self, argument):
    """
    Adds an argument to the list

    :Args:
     - Sets the arguments
    """
    if argument:
        self._arguments.append(argument)
    else:
        raise ValueError("argument can not be null")

2 pip 包处理

查看安装的所有模块:pythom -m pydoc modules
查看pip安装的包:pip list
安装包:pip install module [=version]
卸载包:pip uninstall module
pip 升级: pip install -U pip

2.1 pip安装三方包路径

2.2 pip库镜像源

pip库镜像源修改:设置

默认镜像源: https://pypi.org/simple
修改pip默认镜像源后,有的包可能只有默认源有。临时使用默认源安装:
pip install [module] -i https://pypi.org/simple

3 python基础

test.py

#!/usr/bin/env python3 
#-*- coding: utf-8 -*-
' a test module ' #任何模块代码的第一个字符串都被视为模块的文档注释
__author__ = 'Michael Liao' #作者信息

import sys #模块导入

def test():
    args = sys.argv   # argv参数用列表存储命令行的所有参数
    if len(args)==1:  # 当列表长度为1时即只有一个参数时
        print('Hello, world!')
    elif len(args)==2: # 当命令行有两个参数时
        print('Hello, %s!' % args[1])
    else:
        print('Too many arguments!')

if __name__=='__main__':
    test()

第1行注释可以让这个hello.py文件直接在Unix/Linux/Mac上运行
第2行注释表示.py文件本身使用标准UTF-8编码;
另外注意到,Python解释器把一个特殊变量__name__置为__main__,而如果在其他地方导入该hello模块时,if判断将失败,因此,这种if测试可以让一个模块通过命令行运行时执行一些额外的代码,最常见的就是运行测试。
1)当文件是被调用时,__name__的值为模块名;
2)当文件被执行时,__name__的值为 ‘main

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值