zoukankan      html  css  js  c++  java
  • python模块和包

    一.模块

    模块就是一组功能的集合体,我们的程序可以导入模块来复用模块里的功能。
    #在python中,模块的使用方式都是一样的,但其实细说的话,模块可以分为四个通用类别: 
    
      1 使用python编写的.py文件
    
      2 已被编译为共享库或DLL的C或C++扩展
    
      3 把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包)
    
      4 使用C编写并链接到python解释器的内置模块

    通常意义的模块就是一个py文件

    为什么使用模块
    
    #1、从文件级别组织程序,更方便管理
    随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当做脚本去执行,
    还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用 #
    2、拿来主义,提升开发效率 同样的原理,我们也可以下载别人写好的模块然后导入到自己的项目中使用,这种拿来主义,可以极大地提升我们的开发效率 #ps: 如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,
    需要时就通过python test.py方式去执行,此时test.py被称为脚本script。

    二.import

    1.import只会执行一次

      使用import相当于将整个模块代码执行了一遍

      我们可以从sys.module中找到当前已经加载的模块,sys.module是一个字典,内部包含模块名与模块对象的映射,

      该字典决定了导入模块时是否需要重新导入。

    2.被导入的模块有独立的命名空间

      2个模块都有同一变量名,test1.hello和test2.hello,不会有冲突

    3.import test as t

      给模块起别名

    4.一行导入多个模块

      

    import sys,os,re
    

      

    三.from...import...的使用

    1 from spam import read1,read2
    2 
    3 #唯一的区别就是:使用from...import...则是将spam中的名字直接导入到当前的名称空间中,所以在当前名称空间中,直接使用名字就可以了、无需加前缀:spam.
    4 
    5 #from...import...的方式有好处也有坏处
    6     好处:使用起来方便了
    7     坏处:容易与当前执行文件中的名字冲突
    1 # 起别名
    2 from spam import read1 as read
    3 # 多个导入
    4 from spam import read1,read2,money

      from xx import *

    1 #from spam import * 把spam中所有的不是以下划线(_)开头的名字都导入到当前位置
    2 
    3 #大部分情况下我们的python程序不应该使用这种导入方式,因为*你不知道你导入什么名字,很有可能会覆盖掉你之前已经定义的名字。
    4 #而且可读性极其的差,在交互式环境中导入时没有问题。
    5 6 # 在模块文件最上声明 7 __all__=['money','read1'] #这样在另外一个文件中用from spam import *就这能导入列表中规定的两个名字

    四. __name__="__main__"

    #编写好的一个python文件可以有两种用途:
        一:脚本,一个文件就是整个程序,用来被执行
        二:模块,文件中存放着一堆功能,用来被导入使用
    
    
    #python为我们内置了全局变量__name__,
        当文件被当做脚本执行时:__name__ 等于'__main__'
        当文件被当做模块导入时:__name__等于模块名
    
    #作用:用来控制.py文件在不同的应用场景下执行不同的逻辑
        if __name__ == '__main__':
    1 # hello.py
    2 def hello():
    3     print("hello world")
    4     
    5 if __name__ == '__main__':
    6     hello()
    7 
    8 # 只有执行hello.py文件时才会执行hello
    9 # 被导入时不会执行hello

    五.包

    1.什么是包

    #官网解释
    Packages are a way of structuring Python’s module namespace by using “dotted module names”
    包是一种通过使用‘.模块名’来组织python模块名称空间的方式。
    
    #具体的:包就是一个包含有__init__.py文件的文件夹,所以其实我们创建包的目的就是为了用文件夹将文件/模块组织起来
    
    #需要强调的是:
      1. 在python3中,即使包下没有__init__.py文件,import 包仍然不会报错,而在python2中,包下一定要有该文件,否则import 包报错
    
      2. 创建包的目的不是为了运行,而是被导入使用,记住,包只是模块的一种形式而已,包的本质就是一种模块

    2.包的作用

    包的本质就是一个文件夹,那么文件夹唯一的功能就是将文件组织起来
    随着功能越写越多,我们无法将所以功能都放到一个文件中,于是我们使用模块去组织功能,而随着模块越来越多,
    我们就需要用文件夹将模块文件组织起来,以此来提高程序的结构性和可维护性

    3.注意事项

    #1.关于包相关的导入语句也分为import和from ... import ...两种,但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:凡是在导入时带点的,点的左边都必须是一个包,否则非法。可以带有一连串的点,如item.subitem.subsubitem,但都必须遵循这个原则。但对于导入后,在使用时就没有这种限制了,点的左边可以是包,模块,函数,类(它们都可以用点的方式调用自己的属性)。
    
    #2、import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件
    
    #3、包A和包B下有同名模块也不会冲突,如A.a与B.a来自俩个命名空间
  • 相关阅读:
    java之collection总结
    JAVA集合详解(Collection和Map接口)
    Java集合框架(Collection Framework)学习之 Collection与Map概貌
    (二)用less+gulp+requireJs 搭建项目(gulp)
    (一)用less+gulp+requireJs 搭建项目(了解less)
    数组API汇总
    我的vim配置
    Educational Codeforces Round 47 D
    [AHOI2008]上学路线
    [SDOI2016]硬币游戏
  • 原文地址:https://www.cnblogs.com/pantong/p/10499868.html
Copyright © 2011-2022 走看看