目录
6.3使用 from package import * 时会发生什么?
1.模块:
退出 Python 解释器后,再次进入时,之前在 Python 解释器中定义的函数和变量就丢失了。
因此,编写较长程序时,建议用文本编辑器代替解释器,执行文件中的输入内容,这就是编写 脚本 。
随着程序越来越长,为了方便维护,最好把脚本拆分成多个文件。编写脚本还一个好处,不同程序调用同一个函数时,
不用每次把函数复制到各个程序。
为实现这些需求,Python 把各种定义存入一个文件,在脚本或解释器的交互式实例中使用。
这个文件就是 模块 ;模块中的定义可以 导入 到其他模块或 主 模块
(在顶层和计算器模式下,执行脚本中可访问的变量集)。
主模块:当你运行一个py文件时,这个py文件对应的模块就是一个主模块,
模块是包含 Python 定义和语句的文件。其文件名是模块名加后缀名 .py ,
例文件名为python.py则模块名为python, 后缀名为.py。
在模块内部,通过全局变量 __name__ 可以获取模块名(即字符串)。
2.导入
2.1导入全部
2.1.1.导入全部模块语法格式一:
import module_name(模块名)
2.1.2导入全部模块语法格式二:
from module_name import*
这种方式会导入所有不以下划线(_)开头的名称。大多数情况下, 不要用这个功能,这种方式向解释器导入了一批未知的名称,可能会覆盖已经定义的名称。 区别: 当使用第一种方法调用模块内部函数时方法为 module_name.part_name() 当使用第二种方法调用模块内部函数时方法为 part_name() 导入模块实质: 执行导入模块
2.2局部导入
导入模块中的部分,语法格式:
2.2.1
from module_name import part_name(变量, 函数, 类)
此时我们还可以重命名函数
from module_name import part_name(变量, 函数, 类) as pa
调用时:
pa()
2.2.2
全部导入之后进行调用(import module_name(模块名))
module_name.part_name() # (函数)
3.模块搜索路径
当一个名为 spam 的模块被导入时,解释器首先搜索具有该名称的内置模块。 这些模块的名字被列在 sys.builtin_module_names 中。如果没有找到, 它就在变量 sys.path 给出的目录列表中搜索一个名为 spam.py 的文件, sys.path 从这些位置初始化:
import sys
print(sys.builtin_module_names)
print(sys.path)
'''
builtin_module_names
('_abc', '_ast', '_bisect', '_blake2', '_codecs', '_codecs_cn', '_codecs_hk', '_codecs_iso2022',
'_codecs_jp', '_codecs_kr', '_codecs_tw', '_collections', '_contextvars', '_csv', '_datetime',
'_functools', '_heapq', '_imp', '_io', '_json', '_locale', '_lsprof', '_md5', '_multibytecodec',
'_opcode', '_operator', '_pickle', '_random', '_sha1', '_sha256', '_sha3', '_sha512', '_signal',
'_sre', '_stat', '_statistics', '_string', '_struct', '_symtable', '_thread', '_tracemalloc',
'_warnings', '_weakref', '_winapi', '_xxsubinterpreters', 'array', 'atexit', 'audioop', 'binascii',
'builtins', 'cmath', 'errno', 'faulthandler', 'gc', 'itertools', 'marshal', 'math', 'mmap', 'msvcrt',
'nt', 'sys', 'time', 'winreg', 'xxsubtype', 'zlib')
sys.path
['D:\\python_code\\modle_learning', # 运行.py文件的目录
'D:\\python_code',
'D:\\AXXZX\\Python\\pycharm\\PyCharm .professional\\PyCharm 2022.3.3\\plugins\\python\\helpers\\pycharm_display',
'D:\\AXXZX\\Python\\python\\python310.zip',
'D:\\AXXZX\\Python\\python\\DLLs',
'D:\\AXXZX\\Python\\python\\lib',
'D:\\AXXZX\\Python\\python',
'D:\\AXXZX\\Python\\python\\lib\\site-packages',
'D:\\AXXZX\\Python\\pycharm\\PyCharm .professional\\PyCharm 2022.3.3\\plugins\\python\\helpers\\pycharm_matplotlib_backend'
] # pycharm路径
'''
4. dir() 函数
内置函数 dir() 用于查找模块定义的名称。返回结果是经过排序的字符串列表:
例:
print(dir(str))
'''
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__',
'__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__',
'__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__',
'__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs',
'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal',
'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle',
'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'removeprefix',
'removesuffix', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip',
'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper',
'zfill']
'''
5.常见的模块
copy: 拷贝模块 sys: 和python解释器交互的 os: 和操作系统交互的 random: 随机数 math: 数学模块 re: regular expression :正则表达式 导入模块一般在文件的顶部
6.包
6.1包
包是模块的集合,为它底下的模块提供命名空间
6.2如何去导入包下的模块:
import package.module_name
from package import module_name
from package.module_name import part_name(局部)(变量, 函数, 类)
包是模块的集合,因此包中还可以包含子包
6.3使用 from package import * 时会发生什么?
包和目录的区别: 最大的区别是包中含有__init__.py文件 若给一个目录加入__init__.py文件,则该目录就会成为包 如果包的 __init__.py 代码定义了列表 __all__,运行 from package import * 时, 它就是用于导入的模块名列表。
from mypack import *
print(modle_A.dataA)
print(modle_B.dataB)
print("mypack")
'''
A
B
1
2
mypack
'''