zoukankan      html  css  js  c++  java
  • python 3 基础之模块的制作、导入

    模块

    一个项目里的各个单位由小到大:

    变量(全局变量、局部变量、实例属性、类属性)——>函数方法(实例方法、类方法、静态方法)——>类——>模块——>包——>工程(项目)

    1、模块是什么?

    在Python中,每个Python文件都可以作为一个模块,模块的名字就是文件的名字

    说的通俗点:模块就好比是工具包,要想使用这个工具包中的工具(就好比函数),就需要导入这个模块

    要使用非本.py文件里的类、函数或者变量等,必须先用import关键字引入模块名称,然后才能调用(模块名.函数名)

    2、模块的制作

    在Python中,每个Python文件都可以作为一个模块,模块的名字就是文件的名字

      2.1、定义一个模块test.py

    def test_sum(a,b):
        return a + b

      调用自己定义的模块

    import test
    print(test.test_sum(3,4))

      2.2、制作一个模块(正常代码、测试代码),if __name__ == '__main__'

      test.py

    name = '制作模块'
    def add2num(a,b):
        return a + b
    class Person(object):
        def eat(self):
            print('人会吃饭')
    
    # 用来测试代码的函数(自测函数),一般命名main()
    def main():
        print(name)
    
        ret = add2num(12,32)
        print(ret)
    
        p = Person()
        p.eat()
    
    # 调用测试函数
    if __name__ == '__main__':
        main()

      创建一个测试模块ceshi.py调用test.py

    import test
    # 需要测试test模块,定义 一个本模块的测试函数
    def main():
        print(test.name)
        
      ret = test.add2num(222,22)
    print(ret) p = test.Person() p.eat() # 调用测试函数 if __name__ == '__main__': main()

      

      解释:调用自测函数为什么不用main(),用if __name__ == '__main__'

        一个模块的自测函数调用方式使用了:if __name__ == '__main__'

        就会出现这样的情况:在本模块中可以正常调用自测函数,而在另外一个模块调用本模块时,自测函数不会运行(因为另外的模块不需要此自测函数,所以用这种方式)

        在同一个.py文件中,打印__name__结果均为__main__;把一个test.py文件的打印__name__的代码封装成函数,导入另外一个模块cesh.py使用,打印出来的结果是test.py的模块名字test

        

    3、导入模块(关键字import)

    如果一个模块被另一个模块导入后 就把这个模块里面可以执行的代码都执行一遍

      3.1、python中使用import  关键字导入模块

      导入模块格式:

    import 模块名1,模块名2..........
    # 实例:导入随机模块
    import random

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

      3.2、调用非本模块的函数

        格式:模块名.函数名 

        调用非本模块的函数为何要加上模块名:

        会有一种情况:在多个模块中含有相同名称的函数,若只是通过函数名来调用,解释器不知道到底要调用哪个函数,会报错。所以如果像上述这样引入模块的时候,调用函数必须加上模块名

      3.3、单独调用非本模块的某个函数

        此时只需要引入该函数即可:from.......import......

    from 模块名 import 函数名1,函数名2....

        不仅可以引入函数,还可以引入一些全局变量、类等

        通过这种方式引入的时候,调用函数时只能给出函数名,不能给出模块名,但是当两个模块中含有相同名称函数的时候,后面一次引入会覆盖前一次引入。也就是说假如模块A中有函数function( ),在模块B中也有函数function( ),如果引入A中的function在先、B中的function在后,那么当调用function函数的时候,是去执行模块B中的function函数

      3.4、导入一个模块的所有东西(函数、变量、类)   

        from 模块名 import * 

        如果想一次性引入math中所有的东西,还可以通过from math import *来实现

    from math import *

      这提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不该被过多地使用。

      3.5、给导入的模块起别名  as

        格式:import 模块名 as 别名(在此模块只使用别名即可)

      3.6、模块中的__all__变量使用(只有配合from 模块名 import*使用才有效)

        __all__也属于模块中的变量,如果一个模块用了__all__ = ['变量1','变量2'.....]

        若在某个模块中使用了__all__,那么只有在__all__的列表中的字符串(变量)才可以被其他模块调用

        要符合条件:其他模块必须是通过from 模块名 import* 方法导入的

      如下test.py模块

      test.py

    # 条件 其他模块必须是通过from 模块名 import * 方式导入的模块
    __all__ = ["name",'add2num']
    
    name = "加法运算"
    
    def add2num(a, b):
        return a + b
    
    def delnum(a,b):
        return a - b

      ceshi.py

    from test import *
    # 可以正常调用
    print(name)
    print(add2num(33,8))
    
    # 调用delnum函数失败
    f = delnum(33,2)
    print(f)

      3.7、定位模块

        当你导入一个模块,Python解析器对模块位置的搜索顺序是:

          当前目录

          如果不在当前目录,Python则搜索在shell变量PYTHONPATH下的每个目录。

          如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/

          模块搜索路径存储在system模块的sys.path变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。

  • 相关阅读:
    [CSP-S模拟测试]:party?(霍尔定理+最小割+树链剖分)
    [CSP-S模拟测试]:marshland(最大费用可行流)
    [CSP-S模拟测试]:Revive(点分治)
    [CSP-S模拟测试]:Lighthouse(哈密顿回路+容斥)
    [CSP-S模拟测试]:Lost My Music(凸包)
    [CSP-S模拟测试]:God Knows(线段树维护单调栈)
    [CSP-S模拟测试]:Star Way To Heaven(最小生成树Prim)
    [CSP-S模拟测试]:gcd(莫比乌斯反演)
    [CSP-S模拟测试]:water(BFS)
    BZOJ3462 DZY Loves Math II 【多重背包 + 组合数】
  • 原文地址:https://www.cnblogs.com/will-wu/p/13269944.html
Copyright © 2011-2022 走看看