返回顶部
首页 > 资讯 > 后端开发 > Python >Python基础之模块如何使用
  • 262
分享到

Python基础之模块如何使用

Python 2023-05-15 22:05:10 262人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

一、模块模块可以看成是一堆函数的集合体。一个py文件内部就可以放一堆函数,因此一个py文件就可以看成一个模块。如果这个py文件的文件名为module.py,模块名则是module。1、模块的四种形式在python中,总共有以下四种形式的模块

    一、模块

    模块可以看成是一堆函数的集合体。

    一个py文件内部就可以放一堆函数,因此一个py文件就可以看成一个模块。

    如果这个py文件的文件名为module.py,模块名则是module

    1、模块的四种形式

    python中,总共有以下四种形式的模块:

    • 自定义模块:如果你自己写一个py文件,在文件内写入一堆函数,则它被称为自定义模块,即使用Python编写的.py文件

    • 第三方模块:已被编译为共享库或DLL的C或c++扩展 ,如requests

    • 内置模块:使用C编写并链接到python解释器的内置模块 ,如time

    • 包(文件夹):把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包)

    2、为什么要用模块?

    • 用第三方或者内置的模块是一种拿来主义,可以极大地提升开发效率。

    • 自定义模块,将我们自己程序中用到的公共功能,写入一个python文件,然后程序的各部分组件可以通过导入的方式来引用自定义模块的功能。

    二、如何用模块

    一般我们使用import和from...import...导入模块。

    以下述spam.py内的文件代码为例。

    # spam.py
    print('from the spam.py')
    money = 1000
    def read1():
    print('spam模块:', money)
    def read2():
    print('spam模块')
    read1()
    def change():
    global money
    money = 0

    1、import 模块名

    语法如下:

    import module1[, module2[,... moduleN]

    import导入的模块,访问需要加前缀。

    import首次导入模块发生了3件事:

    • 以模块为准创造一个模块的名称空间

    • 执行模块对应的文件,将执行过程中产生的名字都丢到模块的名称空间

    • 在当前执行文件中拿到一个模块名

    注意:模块的重复导入会直接引用之前创造好的结果,不会重复执行模块的文件。

    # run.py
    import spam # from the spam.py
    import spam
    money = 111111
    spam.read1() # 'spam模块:1000'
    spam.change()
    print(spam.money) # 0
    print(money) # 111111
    导入重命名:smt变量指向span模块的名称空间
    # run.py
    import spam as sm
    money = 111111
    sm.money
    sm.read1() # 'spam模块:1000'
    sm.read2
    sm.change()
    print(money) # 1000
    导入多个模块
    import spam, time, os
    # 推荐使用下述方式
    import spam
    import time
    import os

    2、from 模块名 import 具体的函数

    语法如下:

    from modname import name1[, name2[, ... nameN]]

    这个声明不会把整个模块导入到当前的命名空间中,它只会将模块里的一个或多个函数引入进来。

    from...import...导入的模块,访问不需要加前缀。

    from...import...首次导入模块发生了3件事:

    • 以模块为准创造一个模块的名称空间

    • 执行模块对应的文件,将执行过程中产生的名字都丢到模块的名称空间

    • 在当前执行文件的名称空间中拿到一个名字,该名字直接指向模块中的某一个名字,意味着可以不用加任何前缀而直接使用

    • 优点:不用加前缀,代码更加精简

    • 缺点:容易与当前执行文件中名称空间中的名字冲突

    # run.py
    from spam import money
    from spam import money,read1
    money = 10
    print(money) # 10
    rom … import * 语句:导入文件内所有的功能:
    # spam.py
    __all__ = ['money', 'read1'] # 只允许导入'money'和'read1'
    
    # run.py
    from spam import * # 导入spam.py内的所有功能,但会受限制于__all__
    money = 111111
    read1() # 'spam模块:1000'
    change()
    read1() # 'spam模块:0'
    print(money) # 111111

    3、循环导入

    以下情况会出现循环导入:

    # m1.py
    print('from m1.py')
    from m2 import x
    y = 'm1'
    # m2.py
    print('from m2.py')
    from m1 import y
    x = 'm2'

    可以使用函数定义阶段只识别语法的特性解决循环导入的问题,或从本质上解决循环导入的问题,但是最好的解决方法是不要出现循环导入。

    方案一:

    # m1.py
    print('from m1.py')
    def func1():
    from m2 import x
    print(x)
    y = 'm1'
    
    
    
    # m2.py
    print('from m2.py')
    def func1():
    from m1 import y
    print(y)
    x = 'm2'

    方案二:

    5、# m1.py
    print('from m1.py')
    y = 'm1'
    from m2 import x
    
    
    
    # m2.py
    print('from m2.py')
    x = 'm2'
    from m1 import y

    4、dir() 函数

    内置的函数 dir() 可以找到模块内定义的所有名称。以一个字符串列表的形式返回:

    dir(sys)
    ['__displayhook__', '__doc__', '__excepthook__', '__loader__', '__name__',
    '__package__', '__stderr__', '__stdin__', '__stdout__',
    '_clear_type_cache', '_current_frames', '_debugmallocstats', '_getframe',
    '_home', '_mercurial', '_xoptions', 'abiflags', 'api_version', 'argv',
    'base_exec_prefix', 'base_prefix', 'builtin_module_names', 'byteorder',
    'call_tracing', 'callstats', 'copyright', 'displayhook',
    'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix',
    'executable', 'exit', 'flags', 'float_info', 'float_repr_style',
    'getcheckinterval', 'getdefaultencoding', 'getdlopenflags',
    'getfilesystemencoding', 'getobjects', 'getprofile', 'getrecursionlimit',
    'getrefcount', 'getsizeof', 'getswitchinterval', 'gettotalrefcount',
    'gettrace', 'hash_info', 'hexversion', 'implementation', 'int_info',
    'intern', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path',
    'path_hooks', 'path_importer_cache', 'platfORM', 'prefix', 'ps1',
    'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit',
    'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout',
    'thread_info', 'version', 'version_info', 'warnoptions']

    如果没有给定参数,那么 dir() 函数会罗列出当前定义的所有名称:

    a = [1, 2, 3, 4, 5]
    import fibo
    fib = fibo.fib
    print(dir()) # 得到一个当前模块中定义的属性列表
    # ['__builtins__', '__name__', 'a', 'fib', 'fibo', 'sys']
    
    b = 5 # 建立一个新的变量 'a'
    print(dir())
    # ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'a', 'b']
    del b # 删除变量名a
    print(dir())
    # ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'a']

    三、模块搜索路径

    1、导入模块时查找模块的顺序

    1、先从内存中已经导入的模块中寻找

    如果我们在运行run.py文件的时候,快速删除mmm.py文件,我们会发现文件会继续运行,而不会报错,因为mmm已经被导入内存当中。如果我们再一次运行run.py时会报错,因为mmm.py已经被删除了。

    # test.py
    import m1 # 从m1.py文件中导入的,然后会生成m1模块的名称空间
    import time
    # 删除m1.py文件,m1模块的名称空间仍然存在
    
    time.sleep(10)
    import m1 # 不报错,一定不是从文件中获取了m1模块,而是从内存中获取的
    2、内置的模块

    验证先从内置中找,不会先找自定义的time.py文件。

    # time.py
    print('from time.py')
    # run.py
    import time
    print(time) #
    3、环境变量sys.path中找(强调:sys.path的第一个值是当前执行文件的所在的文件夹)
    import sys
    for n in sys.path:
    print(n)
    # C:\PyCharmProjects\untitled\venv\Scripts\python.exe C:/PycharmProjects/untitled/hello.py
    # C:\PycharmProjects\untitled
    # C:\PycharmProjects\untitled
    # C:\Python\python38\python38.zip
    # C:\Python\Python38\DLLs
    # C:\Python\Python38\lib
    # C:\Python\Python38
    # C:\PycharmProjects\untitled\venv
    # C:\PycharmProjects\untitled\venv\lib\site-packages

    如果mmm.py在C:\PycharmProjects\untitled\day16路径下,而执行文件路径为C:\PycharmProjects\untitled,如果普通导入一定会报错,我们可以把C:\PycharmProjects\untitled\day16添加到环境变量sys.path中,防止报错。

    # run.py
    import sys
    sys.path.append(r'C:\PycharmProjects\untitled\day16')
    print(sys.path)
    import mmm
    mmm.f1()

    2、搜索路径以执行文件为准

    假设我们有如下目录结构的文件,文件内代码分别是:

    Python基础之模块如何使用

    而hello和spam.py不是同目录下的,因此run.py的环境变量无法直接找到m2,需要从文件夹导入

    from aa import spam
    print(spam.money)

    四、Python文件的两种用途

    一个模块被另一个程序第一次引入时,其主程序将运行。如果我们想在模块被引入时,模块中的某一程序块不执行,我们可以用__name__属性来使该程序块仅在该模块自身运行时执行。

    python文件总共有两种用途,一种是执行文件;另一种是被当做模块导入。

    每个模块都有一个__name__属性,当其值是'__main__'时,表明该模块自身在运行,否则是被引入。

    1、当run.py运行的时候,aaa.py被当做引用模块,它的__name__ == 'aaa'(模块名),会执行aaa.py中的f1()。

    # aaa.py
    x = 1
    def f1():
    print('from f1')
    f1()
    # run.py
    import aaa

    2、aaa.py被当做可执行文件时,加上__name__ == '__main__',单独运行aaa.py才会执行aaa.py中的f1()。 run.py运行时可以防止执行f1()。

    # aaa.py
    x = 1
    def f1():
    print('from f1')
    
    if __name__ == '__main__':
    f1()

    五、包

    包是一种管理 Python 模块命名空间的形式,包的本质就是一个含有.py的文件的文件夹。

    包采用"点模块名称"。比如一个模块的名称是 A.B, 那么他表示一个包 A中的子模块 B 。

    目录只有包含一个叫做 __init__.py 的文件才会被认作是一个包。

    在导入一个包的时候,Python 会根据 sys.path 中的目录来寻找这个包中包含的子目录。

    导入包发生的三件事:

    • 创建一个包的名称空间

    • 由于包是一个文件夹,无法执行包,因此执行包下的.py文件,将执行过程中产生的名字存放于包名称空间中(即包名称空间中存放的名字都是来自于.py)

    • 在当前执行文件中拿到一个名字aaa,aaa是指向包的名称空间的

    导入包就是在导入包下的.py,导入m1就是导入m1中的__init__。

    1、两种方式导入:

    • import ... :
      import item.subitem.subsubitem 这种导入形式,除了最后一项,都必须是包,而最后一项则可以是模块或者是包,但是不可以是类,函数或者变量的名字。

    • from ... import...:
      当使用 from package import item 这种形式的时候,对应的 item 既可以是包里面的子模块(子包),或者包里面定义的其他名称,比如函数,类或者变量。

    Python基础之模块如何使用

    2、import 导入包内的模块

    import 可以每次只导入一个包里面的特定模块,他必须使用全名去访问。

    import aaa.bbb.m3
    print(aaa.bbb.m3.func3())

    import方式不能导入函数、变量:import aaa.bbb.m3.f3错误

    3、from import方式:

    导入模块内具体的模块

    这种方式不需要那些冗长的前缀进行访问

    from aaa.bbb import m3
    print(m3.func3())
    导入模块内具体的功能

    这种方式不需要那些冗长的前缀进行访问

    from aaa.bbb.m3 import func3
    print(func3())

    4、 绝对导入和相对导入

    绝对导入:
    # aaa/.py
    from aaa.m1 import func1
    from aaa.m2 import func2
    相对导入:
    • .代表当前被导入文件所在的文件夹

    • ..代表当前被导入文件所在的文件夹的上一级

    • ...代表当前被导入文件所在的文件夹的上一级的上一级

    from .m1 import func1
    from .m2 import func2

    5、from...import *

    导入语句遵循如下规则:如果包定义文件 __init__.py 存在一个叫做 __all__ 的列表变量,那么在使用 from package import * 的时候就把这个列表中的所有名字作为包内容导入。

    这里有一个例子,在:file:sounds/effects/__init__.py中包含如下代码:

    __all__ = ["echo", "surround", "reverse"]

    这表示当你使用from sound.effects import *这种用法时,你只会导入包里面这三个子模块。

    六、软件开发的目录规范

    为了提高程序的可读性与可维护性,我们应该为软件设计良好的目录结构,这与规范的编码风格同等重要,简而言之就是把软件代码分文件目录。假设你要写一个ATM软件,你可以按照下面的目录结构管理你的软件代码:

    ATM/
    |-- core/
    | |-- src.py # 业务核心逻辑代码
    |
    |-- api/
    | |-- api.py # 接口文件
    |
    |-- db/
    | |-- db_handle.py # 操作数据文件
    | |-- db.txt # 存储数据文件
    |
    |-- lib/
    | |-- common.py # 共享功能
    |
    |-- conf/
    | |-- settings.py # 配置相关
    |
    |-- bin/
    | |-- run.py # 程序的启动文件,一般放在项目的根目录下,因为在运行时会默认将运行文件所在的文件夹作为sys.path的第一个路径,这样就省去了处理环境变量的步骤
    |
    |-- log/
    | |-- log.log # 日志文件
    |
    |-- requirements.txt # 存放软件依赖的外部Python包列表,详见https://pip.readthedocs.io/en/1.1/requirements.html
    |-- README # 项目说明文件

    settings.py

    # settings.py
    import os
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    DB_PATH = os.path.join(BASE_DIR, 'db', 'db.txt')
    LOG_PATH = os.path.join(BASE_DIR, 'log', 'user.log')
    # print(DB_PATH)
    # print(LOG_PATH)

    common.py

    # common.py
    import time
    from conf import settings
    def logger(msg):
    current_time = time.strftime('%Y-%m-%d %X')
    with open(settings.LOG_PATH, mode='a', encoding='utf-8') as f:
    f.write('%s %s' % (current_time, msg))

    src.py

    # src.py
    from conf import settings
    from lib import common
    def login():
    print('登陆')
    def reGISter():
    print('注册')
    name = input('username>>: ')
    pwd = input('passWord>>: ')
    with open(settings.DB_PATH, mode='a', encoding='utf-8') as f:
    f.write('%s:%s\n' % (name, pwd))
    # 记录日志。。。。。。
    common.logger('%s注册成功' % name)
    print('注册成功')
    def shopping():
    print('购物')
    def pay():
    print('支付')
    def transfer():
    print('转账')
    func_dic = {
    '1': login,
    '2': register,
    '3': shopping,
    '4': pay,
    '5': transfer,
    }
    def run():
    while True:
    print("""
    1 登陆
    2 注册
    3 购物
    4 支付
    5 转账
    6 退出
    """)
    choice = input('>>>: ').strip()
    if choice == '6': break
    if choice not in func_dic:
    print('输入错误命令,傻叉')
    continue
    func_dic[choice]()

    run.py

    # run.py
    import sys
    import os
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    sys.path.append(BASE_DIR)
    from core import src
    if __name__ == '__main__':
    src.run()

    以上就是Python基础之模块如何使用的详细内容,更多请关注编程网其它相关文章!

    --结束END--

    本文标题: Python基础之模块如何使用

    本文链接: https://lsjlt.com/news/209511.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • Python基础之模块如何使用
      一、模块模块可以看成是一堆函数的集合体。一个py文件内部就可以放一堆函数,因此一个py文件就可以看成一个模块。如果这个py文件的文件名为module.py,模块名则是module。1、模块的四种形式在Python中,总共有以下四种形式的模块...
      99+
      2023-05-15
      Python
    • Python基础之如何使用multiprocessing模块
      一、multiprocessing模块 multiprocessing包是Python中的多进程管理包。与threading.Thread类似,它可以使用multiprocessing.Proces 对象来创建一个进...
      99+
      2022-06-02
      multiprocessing模块的使用 python multiprocessing
    • Python基础之模块怎么使用
      这篇文章主要介绍“Python基础之模块怎么使用”,在日常操作中,相信很多人在Python基础之模块怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python基础之模块怎么使用”的疑惑有所帮助!接下来...
      99+
      2023-07-06
    • Python基础之hashlib模块subprocess模块logging模块
      目录一、hashlib模块基本操作与用法二、subprocess模块简介基本操作与用法三、logging模块简介基本操作与用法一、hashlib模块 什么是哈希模块: hashlib...
      99+
      2024-04-02
    • Python基础之模块详解
      目录一、模块1、模块的四种形式2、为什么要用模块?二、如何用模块1、import 模块名导入重命名:smt变量指向span模块的名称空间导入多个模块2、from 模块名 import...
      99+
      2024-04-02
    • Python基础之hashlib模块详解
      一、hashlib简介 什么叫hash: hash是一种算法(不同的hash算法只是复杂度不一样)(3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA5...
      99+
      2022-06-02
      Python hashlib模块 python模块
    • Python爬虫基础之requestes模块
      一、爬虫的流程 开始学习爬虫,我们必须了解爬虫的流程框架。在我看来爬虫的流程大概就是三步,即不论我们爬取的是什么数据,总是可以把爬虫的流程归纳总结为这三步: 指定 url,可以简单的理解为指定要爬取的网址 发送请求。...
      99+
      2022-06-02
      Python requestes模块 python爬虫
    • Python基础之函数和模块
      函数的基本使用 函数的定义:把具有独立功能的代码块组织成一个小模块,在需要的时候调用。或者说,函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。 函数的使用:1.定义函数;2.调用函数。 函数的作用:能提高应用的模...
      99+
      2023-01-31
      函数 模块 基础
    • python基础之模块的导入
      import导入模块 import time #导入的时模块中的所有内容 print(time.ctime()) #调用模块中的函数 # import 到首次导入模块的时候...
      99+
      2024-04-02
    • Python基础之内置模块详解
      目录一、os二、shutil三、sys四、random五、hashlib六、configparser七、xml八、json九、time十、datetime一、os import ...
      99+
      2024-04-02
    • python之基础篇(八)——模块与包
      防伪码:忘情公子著python中的模块  将代码量较大的程序分割成多个有组织的、彼此独立但又能互相交互的代码片段,这些自我包含的有组织的代码段就是模块。  模块在物理形式上表现为以.py结尾的代码文件:    一个文件被看作一个独立的模块,...
      99+
      2023-01-31
      模块 基础 python
    • Python 常用基础模块(二):os模块
      目录 一、os模块介绍二、路径介绍三、常用方法详解3.1 getcwd()方法——获取当前工作目录(字符串)3.2 listdir()方法——返回指定路径下的目录名和文件名3.3 makedi...
      99+
      2023-09-09
      python 开发语言
    • Node.js基础入门之path模块,url模块,http模块使用详解
      目录path模块1. path模块示例2. path模块其他方法url模块1. 旧的解析方法2. 新的解析方法http模块1. 什么是HTTP协议?2. HTTP协议约束的细节3. ...
      99+
      2024-04-02
    • Python基础——5模块
      使用模块 ‘the first line is zhushi’ _author_ = ‘syz’ import sys def test(): args = sys.argv if len(args)==1: ...
      99+
      2023-01-30
      模块 基础 Python
    • Python基础之Spyder如何使用
      本篇内容主要讲解“Python基础之Spyder如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python基础之Spyder如何使用”吧!Spyder是什么Spyder是一个用于科学计算...
      99+
      2023-07-06
    • Python基础之logging模块知识总结
      目录前言一、日志级别二、basicConfig三、日志写文件四、traceback记录前言 logging模块是Python内置的标准模块,主要用于输出脚本运行日志,可以设置输出日志的等级、日志保存路径等。 ...
      99+
      2022-06-02
      Python logging模块 python常用模块
    • Python基础之模块的示例分析
      这篇文章给大家分享的是有关Python基础之模块的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、什么是模块容器 -> 数据的封装函数 -> 语句的封装类 -> 方法和属性的封装模块 ...
      99+
      2023-06-15
    • Python基础知识之函数,类,模块
      目录1、Function 函数1)定义函数2)参数设置3)全局和局部变量2、Class类1)定义class2)class的功能3)继承4)私有属性和功能5)特殊方法3、Module模...
      99+
      2024-04-02
    • Python编程基础之函数和模块
      目录二、函数(一)定义函数1、语法格式2、函数类型3、案例演示(二)调用函数1、简要说明2、案例演示(三)函数参数1、参数的多态性2、参数赋值传递三、利用函数实现模块化1、创建多级菜...
      99+
      2024-04-02
    • python基础-1:python模块概
         小生博客:http://xsboke.blog.51cto.com                                -------谢谢您的参考,如有疑问,欢迎交流一、 模块简介  1. 概念n个.py文件组成的代码集合就...
      99+
      2023-01-31
      模块 基础 python
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作