• 22.Python函数(七)【Python模块】


    每篇前言:


    在这里插入图片描述

    Python函数(七)

    1.1 Python模块

    • 模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块中的函数等功能。
    • 下面是一个使用 python 标准库中模块的例子。
    # -*- coding: utf-8 -*-
    """
    __author__ = 小小明-代码实体
    """
    import sys
    print('\n'.join(sys.path))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 输出:
    (base) D:\PycharmProjects\demo1>python pythonlearn/test.py
    D:\PycharmProjects\demo1\pythonlearn
    D:\Anaconda3\python37.zip
    D:\Anaconda3\DLLs
    D:\Anaconda3\lib
    D:\Anaconda3
    D:\Anaconda3\lib\site-packages
    D:\Anaconda3\lib\site-packages\win32
    D:\Anaconda3\lib\site-packages\win32\lib
    D:\Anaconda3\lib\site-packages\Pythonwin
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 可修改PYTHONPATH环境变量,增加模块搜索路径:
    (base) D:\PycharmProjects\demo1>set PYTHONPATH=.
    (base) D:\PycharmProjects\demo1>python pythonlearn/test.py
    D:\PycharmProjects\demo1\pythonlearn
    D:\PycharmProjects\demo1
    D:\Anaconda3\python37.zip
    D:\Anaconda3\DLLs
    D:\Anaconda3\lib
    D:\Anaconda3
    D:\Anaconda3\lib\site-packages
    D:\Anaconda3\lib\site-packages\win32
    D:\Anaconda3\lib\site-packages\win32\lib
    D:\Anaconda3\lib\site-packages\Pythonwin
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    1.1.1 import 语句

    语法如下:

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

    一个模块只会被导入一次,不管你执行了多少次import。这样可以防止导入模块被一遍又一遍地执行。
    当我们使用import语句的时候,Python解释器会到搜索路径中查找,搜索路径是由一系列目录名组成的,Python解释器就依次从这些目录中去寻找所引入的模块。

    实战讲解:

    # -*- coding: utf-8 -*-
    """
    __author__ = 孤寒者
    """
    # 导入模块
    from pprint import pprint
    
    nested = [list("abcs"), list("sdff"), [1, 45, 4, 6, 7, 8], list(range(12))]
    
    # 现在可以调用模块里包含的函数了
    pprint(nested)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    1.1.2 from…import 语句

    Python 的 from 语句让你从模块中导入一个指定的部分到当前命名空间中。
    from…import相当于java的静态导入,只导入一个模块的指定部分
    语法如下:

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

    例如,要导入模块 datetime 的 datetime函数,使用如下语句:

    # -*- coding: utf-8 -*-
    """
    __author__ = 孤寒者
    """
    from datetime import datetime 
    
    d = datetime.now()
    print(d)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    和import的区别:

    # -*- coding: utf-8 -*-
    """
    __author__ = 孤寒者
    """
    import datetime
    
    d = datetime.datetime.now()
    print(d)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 从上面的示例可以看出,from…import导入的方法可以直接调用,import导入的方法必须加上类名。

    • 把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下声明:
      from modname import *

    例如我们想一次性引入 math 模块中所有的东西,语句如下:

    from math import *
    
    • 1

    1.1.3 模块的搜索路径

    默认情况下,Python解释器会搜索当前目录、所有已安装的内置模块和第三方模块,搜索路径存放在sys模块的path变量中:

    >>> import sys
    >>> sys.path
    ['', '/Library/Python/2.7/site-packages/pycrypto-2.6.1-py2.7-macosx-10.9-intel.egg', '/Library/Python/2.7/site-packages/PIL-1.1.7-py2.7-macosx-10.9-intel.egg', ...]
    
    • 1
    • 2
    • 3

    如果我们要添加自己的搜索目录,有两种方法:
    一是直接修改sys.path,添加要搜索的目录:

    >>> import sys
    >>> sys.path.append('E:/demo')
    
    • 1
    • 2

    这种方法是在运行时修改,运行结束后失效。
    第二种方法是设置环境变量PYTHONPATH,该环境变量的内容会被自动添加到模块搜索路径中。设置方式与设置Path环境变量类似。注意只需要添加你自己的搜索路径,Python自己本身的搜索路径不受影响。
    例如:

    set PYTHONPATH=.
    
    • 1

    1.1.4 dir()找到模块内定义的所有名称

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

    # coding=utf-8
    
    import math
    print(dir(math))
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述在这里,特殊字符串变量__name__指向模块的名字,__file__指向该模块的导入文件名。

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

    ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'math']
    
    • 1

    1.1.5 globals() 和 locals() 函数

    • 根据调用地方的不同,globals() 和 locals() 函数可被用来返回全局和局部命名空间里的名字。
    • 如果在函数内部调用 locals(),返回的是所有能在该函数里访问的命名。
    • 如果在函数内部调用 globals(),返回的是所有在该函数里能访问的全局名字。
    • 两个函数的返回类型都是字典。所以名字们能用 keys() 函数摘取。

    1.1.6 __all__&从一个包中导入*

    from sound.effects import *
    
    • 1

    会执行effects 包下面的__init__.py并导入里面定义的内容,如果存在 __all__ 列表变量,那么就可以导入该列表指定的模块。
    在:file:sounds/effects/__init__.py中包含如下代码:

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

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

    1.1.7 __main__

    Python解释器会将运行入口模块文件的__name__置为__main__

    if __name__=='__main__':
        test()
    
    • 1
    • 2

    当我们在命令行运行hello模块文件时,Python解释器把一个特殊变量__name__置为__main__,而如果在其他地方导入该hello模块时,if判断将失败,因此,这种if测试可以让一个模块通过命令行运行时执行一些额外的代码,最常见的就是运行测试。

    Python模块总结:

    ①总共有这几种导入的方式:

    from car import Car               #从一个只包含一个类的模块中导入这个类
    
    from car import ElectricCar       #从一个包含多个类的模块中导入一个类
    
    from car import Car, ElectricCar   #从一个有多个类的模块中导入多个类
    
    import car                         #导入整个模块         我们使用语法 module_name.class_name 访问需要的类
    
    from  module_name import *         #导入模块中的所有类       (不建议使用,如果要用,推荐使用导入整个模块)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    ②代码实战使用:

    第一种:

    import datetime 					     # 导入整个datetime模块
    a = datetime.datetime.now()    			 # 获取当前时间
    #第一个datetime是模块,第二个datetime是模块里面的类,,now()是类里面的方法
    
    • 1
    • 2
    • 3

    第二种:
    (1)

    from datetime import datetime   		 #导入模块里面的一个类
    a = datetime.now()        				 #直接就一个datetime就是模块里的类
    
    • 1
    • 2

    (2)

    from datetime import *         			 #导入这个模块里的所有类
    a = datetime.now()						 #直接就一个datetime就是模块里的类
    
    • 1
    • 2

    第三种:

    from datetime import datetime as y   	 #取别名
    a = y.now()
    
    • 1
    • 2

    知识点补给站:

    sys.path  		用于存放导入路径的列表,类似于环境变量中的 PATH
    sys.argv        查看当前文件路径
    __pycache__:	缓存文件
    
    • 1
    • 2
    • 3

    例子:

    import sys
    print(sys.path)		#在这个路径下面,就可以通过import直接导入。一个列表,在前面的路径优先级高。
    					#只有在这个列表里面的路径的才能被导入。
    
    • 1
    • 2
    • 3
    • 下面有两个问题,大家可以先自行思考,再看答案:

    第一个问题:
    如果自己写的一个文件和python自带的一个模块重名,而且自己写的这个文件在本目录下,那么如果直接导入这个模块,本目录下的优先级最高,就导入不了自带的那个模块,该怎么办呢?

    解决方法: sys.path.insert(0,路径名),把想要导入的那个模块的路径改到列表的前面。

    第二个问题:
    如果需要导入的模块在别的盘,即不在这个路径列表里,该怎么导入?

    sys.path.append(r'路径名')  
    
    • 1
  • 相关阅读:
    局限性贪心考虑分析贪心状态数:1012T2
    SpringBoot3 整合SpringSecurity
    epiiAdmin框架注意事项
    带权有向图最短路径之Dijkstra和Floyd
    MPDIoU: A Loss for Efficient and Accurate Bounding BoxRegression
    视频号视频怎么下载:完全教程和实用技巧
    Java中的transient关键字是什么意思?
    kingdee漏洞金蝶云星空存在弱口令漏洞
    全日制和非全日制之争,看完六年前的这个文件心里就有数了
    [SWPUCTF 2021 新生赛]sql - 联合注入
  • 原文地址:https://blog.csdn.net/qq_44907926/article/details/125382037