python 基础 day16模块

模块就是 Python 程序。换句话说,任何 Python 程序都可以作为模块,包括在前面章节中写的所有 Python 程序,都可以作为模块。

代码的可重用性体现在,当编写好一个模块后,只要编程过程中需要用到该模块中的某个功能(由变量、函数、类实现),无需做重复性的编写工作,直接在程序中导入该模块即可使用该功能。

  • 诸多容器,例如列表、元组、字符串、字典等,它们都是对数据的封装;
  • 函数是对 Python 代码的封装;
  • 类是对方法和属性的封装,也可以说是对函数和数据的封装。
  • 模块,可以理解为是对代码更高级的封装,即把能够实现某一特定功能的代码编写在同一个 .py文件中,并将其作为一个独立的模块,这样既可以方便其它程序或脚本导入并使用,同时还能有效避免函数名和变量名发生冲突。
    在桌面创建一个hello.py的的文件,里面输入
def hello():
   print("hello world")

再在桌面创建另一个say.py文件包含代码

import hello
hello.hello()#hello world

hello.py 就是一个自定义的模块,我们只需要将 hellp.py 模块导入到 say.py 文件中,就可以直接在 say.py 文件中使用模块中的资源。
当调用模块中的 hello() 函数时,使用的语法格式为“模块名.函数”,这是因为,相对于 say.py 文件,hello.py 文件中的代码自成一个命名空间,因此在调用其他模块中的函数时,需要明确指明函数的出处,否则 Python 解释器将会报错。

命名空间

命名空间表示标识符的可见范围,一个标识符可以在多个命名空间之中定义,在不同命名空间的含义互不相干
命名空间因为对象不同可以分为以下几种

  • 内置命名空间(Built-in Namespaces):Python运行起来,它们就存在了。内置函数的命名空间都属于内置命名空间,所以,我们可以在任何程序中直接运行它们,比如id(),不需要做什么操作,拿过来就直接使用了
  • 全局命名空间(Module:Global Namespaces):每个模块创建它自己所拥有的全局命名空间,不同模块的全局命名空间彼此独立,不同模块中相同名称的命名空间,也会因为模块的不同而不相互干扰。
  • 本地命名空间(Function & Class:Local
    Namespaces):模块中有函数或者类,每个函数或者类所定义的命名空间就是本地命名空间。如果函数返回了结果或者抛出异常,则本地命名空间也结束了。
    程序在查询上述三种命名空间的时候,就按照从里到外的顺序,即:Local Namespaces --> Global Namesspaces --> Built-in Namesspaces。在这里插入图片描述
    程序在查询上述三种命名空间的时候,就按照从里到外的顺序,即:Local Namespaces --> Global Namesspaces --> Built-in Namesspaces。

导入模块

import的用法:

  • import 模块名1 [as 别名1], 模块名2 [as 别名2]…

导入指定模块中的所有成员(包括变量、函数、类等)。但是导入模块中的成员时候需要使用模块名(别名)作为前缀

  • from 模块名 import 成员名1 [as 别名1],成员名2 [as 别名2],…

只会导入模块中指定的成员,而不是全部成员。同时,当程序中使用该成员时,无需附加任何前缀,直接使用成员名(或别名)即可。

  • import 模块名 as 别名
import sys
print(sys.argv[0])
#C:/Users/lenovo/PycharmProjects/untitled/123.py

sys 模块下的 argv 变量用于获取运行 Python 程序的命令行参数,其中 argv[0] 用于获取当前 Python 程序的存储路径

为模块指定别名

import sys as s
print(s.argv[0])
#C:/Users/lenovo/PycharmProjects/untitled/123.py

一次导入多个模块,使用“,”逗号分隔开

# 导入sys、os两个模块
import sys,os
# 使用模块名作为前缀来访问模块中的成员
print(sys.argv[0])
# os模块的sep变量代表平台上的路径分隔符
print(os.sep)

运行结果

C:/Users/lenovo/PycharmProjects/untitled/123.py
\

  • from 模块名 import 成员名 as 别名
from sys import argv as s
print(s[0])
#C:/Users/lenovo/PycharmProjects/untitled/123.py

一般不建议一次导入模块里的所以成员

if __name__==’__main__’

模块的另一个重要特性就是代码的重用

#py1.py
def c2f(cel):
    fah=cel*1.8+32
    return fah
def f2c(fah):
    cel=(fah-32)/1.8
    return cel
def test():
    print("测试,0摄氏度=%.2f华氏度" % c2f(0))
    print("测试,0华氏度=%.2f摄氏度" % f2c(0))
test()
#测试,0摄氏度=32.00华氏度
#测试,0华氏度=-17.78摄氏度

在另外一个文件(py2.py)中导入在调用

#py2.py
import py1
print("32摄氏度=%.2f华氏度"%py1.c2f(32))
#测试,0摄氏度=32.00华氏度
#测试,0华氏度=-17.78摄氏度
#32摄氏度=89.60华氏度

py2将py1中的测试和函数也一块执行了避免这样情况,需要使用板块中的__name__属性:
在作为程序运行时__name__属性的值是’__main__’,而作为模块导入时候这个的值就是该模块的名字英雌就容易理解 if _\name__=’__main__'的意思

def c2f(cel):
    fah=cel*1.8+32
    return fah
def f2c(fah):
    cel=(fah-32)/1.8
    return cel
def test():
    print("测试,0摄氏度=%.2f华氏度" % c2f(0))
    print("测试,0华氏度=%.2f摄氏度" % f2c(0))
if _——name__='__main__':
     test()
#测试,0摄氏度=32.00华氏度
#测试,0华氏度=-17.78摄氏度

确保只有单独运行py1.py才能执行test函数

搜索途径

当解释器遇到 import 语句,如果模块在当前的搜索路径就会被导入。

我们使用 import 语句的时候,Python 解释器是怎样找到对应的文件的呢?

这就涉及到 Python 的搜索路径,搜索路径是由一系列目录名组成的,Python 解释器就依次从这些目录中去寻找所引入的模块。

搜索路径是在 Python 编译或安装的时候确定的,安装新的库应该也会修改。搜索路径被存储在 sys 模块中的 path 变量中。

import sys
print(sys.path)
#['C:\\Users\\lenovo\\PycharmProjects\\untitled', 'C:\\Users\\lenovo\\PycharmProjects\\untitled', 'E:\\Python37\\python37.zip', 'E:\\Python37\\DLLs', 'E:\\Python37\\lib', 'E:\\Python37', 'E:\\Python37\\lib\\site-packages']

面对模块名重复问题,python提供了包(package)的概念,包用来管理python模块命名空间的形式,采用“点模块名称”

创建包的步骤:

  • 创建一个文件夹,该文件夹的名字就是该包的包名。
  • 在该文件夹内创建一个名为 init.py 的 Python 文件,在此文件中,可以不编写任何代码注意这个是规定
  • 将相关的模块放入文件夹中
    例如创建一个名为first的文件夹,加入__init__.py 文件,在向其中加入module1.py、module2.py 当然可以加入更多模块,则创建了一个如下文件结构的包

fk_package
┠── init.py
┠── module1.py
┗━━ module2.py

python包的导入

注意,包的本质就是模块,

因此导入包和导入模块的语法类似

import 包名[.模块名 [as 别名]]
from 包名 import 模块名 [as 别名]
from 包名.模块名 import 成员名 [as 别名]

与模块类似,包被导入之后,会在包目录下生成一个 pycache 文件夹,并在该文件夹内为包生成一个 init.cpython-36.pyc 文件。

  • import 包名[.模块名 [as 别名]]

通过此语法格式导入包中的指定模块后,在使用该模块中的成员(变量、函数、类)时,需添加“包名.模块名”为前缀。

当导入指定包时,程序会自动执行该包所对应文件夹下的 init.py 文件中的代码。需要注意的是,当使用此语法格式仅导入包名时:

import first_packagefirst_package.module1.display(20)
#AttributeError: module 'first_package' has no attribute 'module1'

直接导入包名,并不会将包中所有模块全部导入到程序中,它的作用仅仅是导入并执行包下的 init.py 文件,

  • from 包名 import 模块名 [as 别名]
  • from 包名.模块名 import 成员名 [as 别名]
发布了47 篇原创文章 · 获赞 5 · 访问量 1928

猜你喜欢

转载自blog.csdn.net/Pang_ling/article/details/102913562
今日推荐