模块初始

模块初始

模块

  • 定义:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。简单点说:一个py文件就是一个模块。
  • 分类:
    • 内置模块:python解释器自带的。
    • 自定义模块:自己写的模块
    • 拓展模块:别人写的,安装后可以使用的
  • 导入条件:
    1. 模块名必须符合变量名规范;
    2. 模块所在的位置必须在sys.path模块搜索路径里。  
  • 导入步骤:
    • 导入一个模块的时候,首先创建一个属于自己的内存空间。
    • 加载模块中的所有代码;
    • 将模块中的所有变量和方法存入命名空间里。
  • 模块导入顺序
    • 先内置模块,其次扩展模块,最后自定义模块。
  • 模块导入的命名空间
      1. 导入的名字属于全局空间,但是依然指向模块的名字所在的内存空间。
      2. 导入的名字如果是函数或者方法,引用了全局变量。
      3. 导入的名字跟全局变量中的名字不冲突。类似于重新赋值
      4. 尽管导入的名字属于全局变量,但是引用变量取值时仍然从模块中取值。  
      5. import* 默认会把所有模块中所有的名字都导入到去全局。可以在模块中用__all__ = [ "a","b"]控制导入项          
  • From......import......
    • 对比import my_module,会将源文件的名称空间'my_module'带到当前名称空间中,使用时必须是my_module.名字的方式.
    • 而from 语句相当于import,也会创建新的名称空间,但是将my_module中的名字直接导入到当前的全局名称空间中,在当前名称空间中,直接使用名字就可以了。
    • import导入的变量或者方法虽然都属于导入文件的全局命名空间,但是函数方法需要变量时还是从原模块调用。

 

#my_module.py
print('from the my_module.py')

money=1000

def read1():
    print('my_module->read1->money',money)

def read2():
    print('my_module->read2 calling read1')
    read1()

def change():
    global money
    money=0
my_module

 

#测试一:导入的函数read1,执行时仍然回到my_module.py中寻找全局变量money
#demo.py
from my_module import read1
money=1000
read1()
'''
执行结果:
from the my_module.py
spam->read1->money 1000
'''

#测试二:导入的函数read2,执行时需要调用read1(),仍然回到my_module.py中找read1()
#demo.py
from my_module import read2
def read1():
    print('==========')
read2()

'''
执行结果:
from the my_module.py
my_module->read2 calling read1
my_module->read1->money 1000
'''
被调用时仍然回到modules调用money值
    • 需要特别强调的一点是:python中的变量赋值不是一种存储操作,而只是一种绑定关系,如下。
from my_module import money,read1
money=100 #将当前位置的名字money绑定到了100
print(money) #打印当前的名字
read1() #读取my_module.py中的名字money,仍然为1000

'''
from the my_module.py
100
my_module->read1->money 1000
'''
View Code
  • 把模块当做脚本运行
    • 模块和脚本的差别:
      • 一个py文件被导入另一个py文件,对其提供功能,就是一个模块。
      • 一个py文件直接被执行,就是一个脚本。    
    • 方式:我们可以通过模块的全局变量__name__来查看模块名:

        当做脚本运行:
        __name__ 等于'__main__'

        当做模块导入:
        __name__= 模块名

    • 作用:用来控制.py文件在不同的应用场景下执行不同的逻辑

        if __name__ == '__main__':

  

 

  

 

    • 序列化模块

      • 什么是序列化:将原本的字典、列表转化为字符串的过程就叫做序列化。

      • 序列化的作用:

        1. 以某种存储形式使自定义对象更持久化。 

        2. 方便对象的传输。能在文件中存储的一定是字符串或者字节,能在网络中传输的一定是字节。

        3. 使程序更具维护性。

      • python中的序列化模块
          • json:json是一种所有的语言都可以识别通用的数据结构。但支持的类型比较有限,数字、列表、字典、字符串。如果序列化的是字典或者列表。首推json。
          • pickle:只能在Python程序中传递数据用,支持Python的所有数据类型
          • shelve:Python3.x之后才有。  

    • hashlib模块

      • Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。

        什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。

        摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。

         

        摘要算法是将字符串转化为长度固定的数字,不同的字符串数字一定不同,相同的字符串无论何时何地都是相同的数字,另外摘要算法是不可逆算法。

         

      • 用法:
        • 密文验证的时候加密
        • 检查文件一致性的  

 

 

          • 密文验证的时候
            • MD5算法:最通用的算法

            • sha算法:安全系数更高的算法,sha算法有很多种,后面的数字越大安全系数越高,得到的数字越长,计算的时间越长。
                • MD5算法使用步骤(一定要将内容字符串转换为字节类型):

                  1. 导入hashlib模块

                  2. 创建一个MD5的对象。

                  3. 对象 = update(“内容”.encode("utf-8")

                  4. 对象.hexdigest() 

 

 

                • MD5加盐

                  • 在创建MD5对象的时候,传入盐值,例如:md5=hashlib.md5(“XXX”.encode(“utf-8”))
                • MD5动态加盐 

                  • 在创建MD5对象的时候,传入动态变量盐值。                                 

 

                • sha1算法使用步骤(跟MD5使用方法相同)

 

          • 备注:一段字符串直接进行摘要和分成几段摘要的结果是相同的。
                    

 

          • 检查文件一致性                            

                  

posted on 2018-04-21 11:48  弃疾  阅读(118)  评论(0)    收藏  举报

导航