文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python基础之模块怎么使用

2023-07-06 12:25

关注

这篇文章主要介绍“Python基础之模块怎么使用”,在日常操作中,相信很多人在Python基础之模块怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python基础之模块怎么使用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一、模块

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

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

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

1、模块的四种形式

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

2、为什么要用模块?

二、如何用模块

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

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

# spam.pyprint('from the spam.py')money = 1000def read1():print('spam模块:', money)def read2():print('spam模块')read1()def change():global moneymoney = 0
1、import 模块名

语法如下:

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

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

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

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

# run.pyimport spam # from the spam.pyimport spammoney = 111111spam.read1() # 'spam模块:1000'spam.change()print(spam.money) # 0print(money) # 111111
导入重命名:smt变量指向span模块的名称空间
# run.pyimport spam as smmoney = 111111sm.moneysm.read1() # 'spam模块:1000'sm.read2sm.change()print(money) # 1000
导入多个模块
import spam, time, os# 推荐使用下述方式import spamimport timeimport os
2、from 模块名 import 具体的函数

语法如下:

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

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

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

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

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

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

# m1.pyprint('from m1.py')from m2 import xy = 'm1'# m2.pyprint('from m2.py')from m1 import yx = 'm2'

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

方案一:

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

方案二:

5、# m1.pyprint('from m1.py')y = 'm1'from m2 import x# m2.pyprint('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 fibofib = fibo.fibprint(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 # 删除变量名aprint(dir())# ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'a']

三、模块搜索路径

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

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

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

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

# time.pyprint('from time.py')# run.pyimport timeprint(time) #
3、环境变量sys.path中找(强调:sys.path的第一个值是当前执行文件的所在的文件夹)
import sysfor 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.pyimport syssys.path.append(r'C:\PycharmProjects\untitled\day16')print(sys.path)import mmmmmm.f1()
2、搜索路径以执行文件为准

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

Python基础之模块怎么使用

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

from aa import spamprint(spam.money)

四、Python文件的两种用途

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

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

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

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

# aaa.pyx = 1def f1():print('from f1')f1()# run.pyimport aaa

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

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

五、包

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

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

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

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

导入包发生的三件事:

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

1、两种方式导入:

Python基础之模块怎么使用

2、import 导入包内的模块

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

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

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

3、from import方式:
导入模块内具体的模块

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

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

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

from aaa.bbb.m3 import func3print(func3())
4、 绝对导入和相对导入
绝对导入:
# aaa/.pyfrom aaa.m1 import func1from aaa.m2 import func2
相对导入:
from .m1 import func1from .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.pyimport osBASE_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.pyimport timefrom conf import settingsdef 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.pyfrom conf import settingsfrom lib import commondef 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': breakif choice not in func_dic:print('输入错误命令,傻叉')continuefunc_dic[choice]()
run.py
# run.pyimport sysimport osBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))sys.path.append(BASE_DIR)from core import srcif __name__ == '__main__':src.run()

到此,关于“Python基础之模块怎么使用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯