zoukankan      html  css  js  c++  java
  • 模块导入

    一、模块导入

    对于一个真实的pyhton程序,我们不可能自己完成所有的工作,通常都需要借助于第三方类库。此外,也不可能在一个源文件中编写整个程序的源代码,这些都需要以模块化的方式来组织项目的源代码。

    导入模块需要用到import语法。import有两个主要的用法:

    1.import 模块名 导入整个模块

    2.form 模块名 import 成员名

    二、 模块导入方式一:import 模块名

    import md

    在一个py文件下运行程序的步骤:

    1首先会创建一个该py文件的名称空间

    2运行模块(md.py文件)中的代码,并将成圣的名字和值存放在内存空间中

    注意:不要多次导入相同模块

    1.2访问模块名称空间中名字方法:模块名.名字

    import md
    md.read1()
    md.read2()
    md.change()

    下面是md.py文件中的代码

    money = 1000
    def read1():
      print('md',money)
    def read2():
      print('md模块')
      read1()
    def change():
      global money
      money = 0

    这样避免与执行py文件中的名字冲突。

     1.3多个模块的导入

    应该转行写。并且写在执行文件的开头

    import os
    import time
    import md

     1.4当模块名比较复杂,可以给模块名取别名

     为已经导入的模块起别名的方式对编写可扩展的代码很有用

    1 import spam as sm
    2 print(sm.money)

    1.5在一行导入多个模块

    1 import sys,os,re

    三、模块导入方式二:from 模块名 import 成员名

    这个方法是导入的模块中的具体某个功能

    记住:

    这个方法import后面是模块中的成员名;

    而import 模块名方法,则import后面跟的模块名。

    执行文件的代码:

    from md import money
    money = '我是执行文件中的money

    print(money)

    下面是md.py文件中的代码

    money = 1000

     运行结果是:我是执行文件中的money。如果模块导入放在money下面结果就不一样了。原因用到from 模块名 import 具体内容的流程

    会先创建执行文件的名称空间
        首次导入md.py模块
            1.运行md.py
            2.将产生的名字存放到md.py名称空间中
            3.直接拿到指向模块md.py名称空间中某个值的名字

     总结:from 模块名 import 成员名句式的缺点

    1.访问模块中的名字不需要加模块名前缀
    (因为这样,极易与执行文件的名字重复,导致打印结果不对。)
    2.在访问模块中的名字可能会与当前执行文件中的名字冲突

     补充:

    一、from 模块名(文件名) import 具体功能(需要调用的具体功能)

    假如需要使用导入模块中的多个具体功能。可以用*号代替

    from md1 import * 

    但是这引起了一个缺点:占内存(一次性将所有名字放入内存)和不知道哪些名字能够使用(没有重复)

    二、__all__

    在这个模块调用模式下,写在被调用模块的代码中限制被执行文件获取的名字

    __all__ = ['money','read1','read2']

     现在只有这些名字可以被执行文件引用

     四、循环导入

    如果出现循环导入问题 那么一定是你的程序设计的不合理
    循环导入问题应该在程序设计阶段就应该避免

    执行文件代码:

    from dir1.dir import m1
    m1.f1()

    m1的代码

    print('正在导入m1')
    def f1():
      from dir1.dir.m2 import y,f2
      print('m1.f1>>>y:',y)
      f2()
    x = 'm1'

    m2的代码

    print('正在导入m2')
    def f2():
      from dir1.dir.m1 import x
      print('m2.f2>>>x:',x)
    y = 'm2'

    解决循环导入问题的方式

    1.方式1
    将循环导入的句式写在文件最下方()

    2.方式2
    函数内导入模块

    1.方式1
    将循环导入的句式写在文件最下方()

    2.方式2
    函数内导入模块

    五、_name_的使用

    当一个文件被当做模块调用时,不希望一调用就出来打印结果,那么可以在被调用的文件中加入:

    if __name__=='__main__':
        函数1()
        函数2()

    因为文件被调用有一个特点,被当做执行文件时,__name__打印结果是__main__

    当被当做模块导入时,结果为模块名

    关于上面的代码还有一个简写形式:
    输入main直接tab键

    五、模块的查找顺序:

    1、模块的查找顺序:

    ①、先从内存中找

    ②、再从内置中找

    ③、最后在sys.path中找(可以理解为环境变量),sys.path是一个大列表,里面放了一堆文件路径,第一个路径永远是执行文件所在的文件夹

    2、注意点:一定分清楚谁是执行文件谁是被导入文件(******),py文件名不应该与模块名(内置的,第三方的)冲突

    3、将文件路径添加到sys.path中

    import sys
    sys.path.append(r'D:Python项目dir1')
    from dir1.dir import md
    # 当需要导入的模块不在执行文件的目录下时,可以利用这种方式找到模块文件
    # 缺点:添加的路径太过绝对,用户自定义安装后会导致该路径失效,软件崩溃。

    六、绝对导入和相对导入

    绝对导入必须依据执行文件所在的文件夹路径为准
    1绝对导入无论在执行文件中还是被导入文件都适用

    相对导入
    .代表的当前路径
    ..代表的上一级路径
    ...代表的是上上一级路径

    注意相对导入不能再执行文件中使用
    相对导入只能在被导入的模块中使用,使用相对导入 就不需要考虑
    执行文件到底是谁 只需要知道模块与模块之间路径关系

    from dir1.dir import m1

    意思为:调用dir1下的dir文件夹中的m1文件

    七、软件开发目录规范

    项目名
        bin
            start.py(项目启动文件)
        conf
            settings.py(项目配置文件)
        core
            src.py(项目核心逻辑)
        db
            数据库相关文件
        lib
            common.py(项目所用到的公共的功能)
        log
            log.log(项目的日志文件)
        readme.txt(项目简介)
      1、strat.py
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    import os
    import sys
     
    BASE_DIR = os.path.dirname(os.path.dirname(__file__))
    sys.path.append(BASE_DIR)
    """
    pycharm会自动将你新建的最顶层的目录添加到sys.path中
    上面这两句话,不是针对你的,是针对下载你这个软件的用户
    """
     
    from core import src
     
    if __name__ == "__main__":
        src.run()
     
    # 当start.py文件主动执行时才会调用src.run()函数
     
    # 1.将core文件路径添加到system path中  (...太low)
    # 2.将项目文件夹添加到system path中
    注意:不要手动拼接路径,跨系统时可能会出错
  • 相关阅读:
    hdu 4710 Balls Rearrangement()
    hdu 4707 Pet(DFS水过)
    hdu 4706 Children's Day(模拟)
    hdu 4712 Hamming Distance(随机函数暴力)
    csu 1305 Substring (后缀数组)
    csu 1306 Manor(优先队列)
    csu 1312 榜单(模拟题)
    csu 1303 Decimal (数论题)
    网络爬虫
    Python处理微信利器——itchat
  • 原文地址:https://www.cnblogs.com/ZDQ1/p/11196130.html
Copyright © 2011-2022 走看看