zoukankan      html  css  js  c++  java
  • Python学习之路_day_15(模块)

    模块

    1. 什么是模块?

    (模块就是程序)

    大家之前在编写ATM作业时,思路是先将程序中都需要有哪些功能定义出来,然后在需要用的地方调用即可。

    比起之前通篇垒代码的方式,将重复要用的功能定义成函数会让程序更加简洁,这不能不算做是一种进步,

    但问题是,随着程序功能越来越多,再将所有的代码都放到一起,程序的组织结构仍然会不清晰,不方便管理,

    以后我们写程序,都是分文件的,如果多个文件中都需要用到同一段功能,难道我们要重复编写该功能吗?很明显不能

    这就需要我们找到一种解决方案,能够将程序中经常要用的功能集合到一起,然后在想用的地方随时导入使用,

    这几乎就是模块的全部含义了

    最后总结:

    模块就是一组功能的集合体,我们的程序可以导入模块来复用模块里的功能。

     

    常见的场景:一个模块就是一个包含了一组功能的python文件,比如spam.py,模块名为spam,可以通过import spam使用。

    1、在python中,模块的使用方式都是一样的,但其实细说的话,模块可以分为四个通用类别: 

     

     

     

     

     

     

     

     

    2、 模块有三种来源:

     

     

     

    1. 为何要用模块?

    1、从文件级别组织程序,更方便管理

    随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用

    2、拿来主义,提升开发效率

    同样的原理,我们也可以下载别人写好的模块然后导入到自己的项目中使用,这种拿来主义,可以极大地提升我们的开发效率

    3、ps:

    如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通过python test.py方式去执行,此时test.py被称为脚本script。

     

    1. 如何用模块?

    1、大前提: 一定要区分开谁是执行文件,谁是被导入模块。

    被导入的模块

     

     

     

     

     

     

     

     

     

     

     

    模块可以包含可执行的语句和函数的定义,这些语句的目的是初始化模块,它们只在模块名第一次遇到导入import语句时才执行(import语句是可以在程序中的任意位置使用的,且针对同一个模块很import多次,为了防止你重复导入,python的优化手段是:第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载到内存中的模块对象增加了一次引用,不会重新执行模块内的语句),如下

     

    test.py

    import spam #只在第一次导入时才执行spam.py内代码,此处的显式效果是只打印一次'from the spam.py',当然其他的顶级代码也都被执行了,只不过没有显示效果.

    import spam

    import spam

    import spam

     

    执行结果:

    from the spam.py

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

    1.为源文件(spam模块)创建新的名称空间,在spam中定义的函数和方法若是使用到了global时访问的就是这个名称空间。

     

    2.在新创建的命名空间中执行模块中包含的代码,见初始导入import spam

        提示:导入模块时到底执行了什么?

        In fact function definitions are also ‘statements’ that are

        ‘executed’; the execution of a module-level function definition

        enters the function name in the module’s global symbol table.

        事实上函数定义也是“被执行”的语句,模块级别函数定义的执行将函数名放

        入模块全局名称空间表,用globals()可以查看

     

    3.创建名字spam来引用该命名空间

        这个名字和变量名没什么区别,都是‘第一类的’,且使用spam.名字的方式

        可以访问spam.py文件中定义的名字,spam.名字与test.py中的名字来自

        两个完全不同的地方。

    3、被导入模块有独立的名称空间

    每个模块都是一个独立的名称空间,定义在这个模块中的函数,把这个模块的名称空间当做全局名称空间,这样我们在编写自己的模块时,就不用担心我们定义在自己模块中全局变量会在被导入时,与使用者的全局

     

    总结

    import导入模块:在使用时必须加上前缀:模块名.

    优点: 指名道姓地向某一个名称空间要名字,肯定不会与当前名称空间中的名字冲突

    缺点: 但凡应用模块中的名字都需要加前缀,不够简洁

    一行导入多个模块(不推荐)

    import spam,os,time

    可以为模块起别名(注意:模块名应该全为小写)

    import spam as sm

    print(sm.money)

    print(sm.read1)

  • 相关阅读:
    httpcontext in asp.net unit test
    initialize or clean up your unittest within .net unit test
    Load a script file in sencha, supports both asynchronous and synchronous approaches
    classes system in sencha touch
    ASP.NET MVC got 405 error on HTTP DELETE request
    how to run demo city bars using sencha architect
    sencha touch mvc
    sencha touch json store
    sencha touch jsonp
    51Nod 1344:走格子(贪心)
  • 原文地址:https://www.cnblogs.com/zjh009/p/9469593.html
Copyright © 2011-2022 走看看