zoukankan      html  css  js  c++  java
  • Python之模块和包导入

    Python之模块和包导入

       模块导入:

          1.创建名称空间,用来存放模块XX.py中定义的名字

          2.基于创建的名称空间来执行XX.py。

          3.创建名字XX.py指向该名称空间,XX.名字的操作,都是以XX.py为准。

      什么是模块?

    1 大家之前在编写ATM作业时,思路是先将程序中都需要有哪些功能定义出来,然后在需要用的地方调用即可。
    2 比起之前通篇垒代码的方式,将重复要用的功能定义成函数会让程序更加简洁,这不能不算做是一种进步,
    3 但问题是,随着程序功能越来越多,再将所有的代码都放到一起,程序的组织结构仍然会不清晰,不方便管理,
    4 以后我们写程序,都是分文件的,如果多个文件中都需要用到同一段功能,难道我们要重复编写该功能吗?很明显不能
    5 这就需要我们找到一种解决方案,能够将程序中经常要用的功能集合到一起,然后在想用的地方随时导入使用,
    6 这几乎就是模块的全部含义了
    7 
    8 最后总结:
    9 模块就是一组功能的集合体,我们的程序可以导入模块来复用模块里的功能。
    View Code
    #常见的场景:一个模块就是一个包含了一组功能的python文件,比如spam.py,模块名为spam,可以通过import spam使用。
    
    #在python中,模块的使用方式都是一样的,但其实细说的话,模块可以分为四个通用类别: 
    使用python编写的.py文件
    已被编译为共享库或DLL的C或C++扩展
    把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包)
    使用C编写并链接到python解释器的内置模块

      为何要使用模块?

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

      以spam.py为例来介绍模块的使用:文件名spam.py,模块名spam

     1 #spam.py
     2 print('from the spam.py')
     3 
     4 money=1000
     5 
     6 def read1():
     7     print('spam模块:',money)
     8 
     9 def read2():
    10     print('spam模块')
    11     read1()
    12 
    13 def change():
    14     global money
    15     money=0
    View Code

    使用模块之import

    1、import的使用

     1 #模块可以包含可执行的语句和函数的定义,这些语句的目的是初始化模块,它们只在模块名第一次遇到导入import语句时才执行(import语句是可以在程序中的任意位置使用的,且针对同一个模块很import多次,为了防止你重复导入,python的优化手段是:第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载到内存中的模块对象增加了一次引用,不会重新执行模块内的语句),如下 
     2 
     3 #test.py
     4 import spam #只在第一次导入时才执行spam.py内代码,此处的显式效果是只打印一次'from the spam.py',当然其他的顶级代码也都被执行了,只不过没有显示效果.
     5 import spam
     6 import spam
     7 import spam
     8 
     9 '''
    10 执行结果:
    11 from the spam.py
    12 '''
    View Code

    ps:我们可以从sys.module中找到当前已经加载的模块,sys.module是一个字典,内部包含模块名与模块对象的映射,该字典决定了导入模块时是否需要重新导入。

    2、在第一次导入模块时会做三件事,重复导入会直接引用内存中已经加载好的结果

     1 #1.为源文件(spam模块)创建新的名称空间,在spam中定义的函数和方法若是使用到了global时访问的就是这个名称空间。
     2 
     3 #2.在新创建的命名空间中执行模块中包含的代码,见初始导入import spam
     4     提示:导入模块时到底执行了什么?
     5     In fact function definitions are also ‘statements’ that are 
     6     ‘executed’; the execution of a module-level function definition 
     7     enters the function name in the module’s global symbol table.
     8     事实上函数定义也是“被执行”的语句,模块级别函数定义的执行将函数名放
     9     入模块全局名称空间表,用globals()可以查看
    10 
    11 #3.创建名字spam来引用该命名空间
    12     这个名字和变量名没什么区别,都是‘第一类的’,且使用spam.名字的方式
    13     可以访问spam.py文件中定义的名字,spam.名字与test.py中的名字来自
    14     两个完全不同的地方。
    View Code

    学习链接

  • 相关阅读:
    Linux编程 22 shell编程(输出和输入重定向,管道,数学运算命令,退出脚本状态码)
    mysql 开发进阶篇系列 46 物理备份与恢复( xtrabackup的 选项说明,增加备份用户,完全备份案例)
    mysql 开发进阶篇系列 45 物理备份与恢复(xtrabackup 安装,用户权限,配置)
    mysql 开发进阶篇系列 44 物理备份与恢复( 热备份xtrabackup 工具介绍)
    Linux编程 21 shell编程(环境变量,用户变量,命令替换)
    Linux编程 20 shell编程(shell脚本创建,echo显示信息)
    mysql 开发进阶篇系列 43 逻辑备份与恢复(mysqldump 的基于时间和位置的不完全恢复)
    Linux编程 19 编辑器(vim 用法)
    (网页)angularjs中的interval定时执行功能(转)
    (网页)在SQL Server中为什么不建议使用Not In子查询(转)
  • 原文地址:https://www.cnblogs.com/george92/p/9262244.html
Copyright © 2011-2022 走看看