zoukankan      html  css  js  c++  java
  • 模块

    模块

    模块能定义函数,类和变量,模块里也能包含可执行的代码。

    类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块。模块名同样也是一个标识符,需要符合标识符的命名规则,模块就好比是工具包,要想使用这个工具包中的工具,就需要先导入这个模块

    模块分为三种:

    自定义模块

    内置标准模块(又称标准库)

    开源模块

    模块导入

    1)import 语句模块的引入

    import 模块名1, 模块名2 
    提示:在导入模块时,每个导入应该独占一行
    import 模块名1
    import 模块名2 

    通过 模块名. 使用 模块提供的工具 —— 全局变量函数

    使用 as 指定模块的别名:如果模块的名字太长,可以使用 as 指定模块的名称,以方便在代码中的使用

    import 模块名1 as 模块别名

    注意:模块别名 应该符合 大驼峰命名法

    例子:

    hm01.py

    title = "模块1"
    
    def say_hello():
        print("我是%s" % title)
    
    #
    class Dog():
        pass

    hm02.py

    title = "模块2"
    
    def say_hello():
        print("我是%s" % title)
    
    #
    class Cat():
        pass

    hm03.py

    import hm01
    import hm02
    hm01.say_hello()
    hm02.say_hello()
    dog = hm01.Dog()
    print(dog)
    
    cat = hm02.Cat()
    print(cat)

    hm04.py  起别名

    import hm01 as a
    import hm02 as b
    a.say_hello()
    b.say_hello()

     坑:如果发现导入不了想要的模块,使用以下方法:

    2)From…import 语句

    Python 的 from 语句让你从模块中导入一个指定的部分到当前命名空间中

    例如,要导入模块 fib 的 fibonacci 函数

    from fib import fibonacci

    注意:

    如果 两个模块,存在同名的函数,那么后导入模块的函数,会覆盖掉先导入的函数

    • 开发时 import 代码应该统一写在 代码的顶部,更容易及时发现冲突
    • 一旦发现冲突,可以使用 as 关键字给其中一个工具起一个别名
    from hm01 import say_hello as a_say_hello
    from hm02 import say_hello
    a_say_hello()
    say_hello()

    3)From…import* 语句

    把一个模块的所有内容全都导入到当前的命名空间也是可行的

    from modname import *

    注意:这种方式不推荐使用,因为函数重名并没有任何的提示,出现问题不好排查

    from hm01 import *
    from hm02 import *
    
    print(title)
    say_hello()

    4)模块的搜索顺序

    Python 的解释器在 导入模块 时,会:

     1、搜索 当前目录 指定模块名的文件,如果有就直接导入

     2、如果没有,再搜索 系统目录

    注意:在开发时,给文件起名,不要和系统的模块文件 重名

    Python 中每一个模块都有一个内置属性 __file__ 可以 查看模块的完整路径

    import random
    
    print(random.__file__)    #查看模块路径
    rand = random.randint(0,10)
    print(rand)

    注意:如果当前目录下,存在一个 random.py 的文件,程序就无法正常执行了!,这个时候,Python 的解释器会 加载当前目录 下的 random.py 而不会加载 系统的 random 模块,

    5)__name__ 属性

    原则 —— 每一个文件都应该是可以被导入的,一个 独立的 Python 文件 就是一个 模块,在导入文件时,文件中所有没有任何缩进的代码都会被执行一遍!

    实际开发场景

    • 在实际开发中,每一个模块都是独立开发的,大多都有专人负责
    • 开发人员 通常会在 模块下方增加一些测试代码
    • 在模块内使用,而被导入到其他文件中不需要执行
    • __name__ 属性可以做到,测试模块的代码 只在测试情况下被运行,而在 被导入时不会被执行!
    • __name__ 是 Python 的一个内置属性,记录着一个 字符串
    • 如果 是被其他文件导入的,__name__ 就是 模块名
    • 如果 是当前执行的程序 __name__ 是 __main__
    # 导入模块
    # 定义全局变量
    # 定义类
    # 定义函数
    
    # 在代码的最下方
    def say_hello():
        print("你好你好,")
    
    
    #1、没有任何缩进的代码都会被执行,该代码会被另外一个导入本模块的文件执行!
    print("小明开发的模块")
    say_hello()
    
    
    #2、name属性讲解:如果直接执行当前模块,输出main,如果该模块被导入其他模块,在其他文件下输出模块文件名
    print(__name__)
    
    
    # 根据 __name__ 判断是否执行下方代码
    if __name__=="__main__":
        print("小明开发的模块")
        say_hello()
    
    
    
    import hm08
    
    print("="*50)

    time模块

    时间表现形式

    表示时间:时间戳、元组(struct_time)、格式化的时间字符串。

    1)时间戳(timestamp) :通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型。

    #时间戳,时间戳是计算机能够识别的时间。

    import time
    
    print(time.time())  #返回当前时间的时间戳,其中time.time(),第一个time为模块第二time为方法

    2)格式化的时间字符串(Format String): ‘2017-04-26’

    Import time
    
    print(time.strftime("%Y-%m-%d %x")) #Y代表year,m为mouth,d为day,x为时间
    print(time.strftime("%Y:%m")) #年月日时间分割可以更改,此处用“:”分割

    输出:2018-06-07 06/07/18

    2018:06

    3)元组(struct_time) :struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天等)

    # 时间元组,结构化时间,是用来操作时间的。

    import time
    
    c = time.localtime()
    
    print(c)
    
    #通过操作结构化时间查看具体信息
    
    y=c.tm_year
    
    print(y)
    
    m=c.tm_mon
    
    print(m)
    
    d=c.tm_mday
    
    print(d)
    
     

    时间转换形式

     

    时间戳转化为结构化时间:localtime/gmtime

    #时间戳转化为结构化时间localtime/gmtime
    
    #gmtime为世界标准时间,一般不使用。
    
    #localtime为东八区时间,为我们所在的时间,常使用localtime
    
    import time
    
    c1=time.localtime(3600*24)
    
    print(c1)
    
    print(c1.tm_year,c1.tm_mon,c1.tm_mday,c1.tm_hour,c1.tm_min)
    
    c2=time.gmtime(3600*24) #gmtime
    
    print(c2)
    
    print(c1.tm_year,c1.tm_mon,c1.tm_mday,c1.tm_hour,c1.tm_min)
    
     
    
    #结构化时间转化为时间戳mktime
    
    print(time.mktime(time.localtime()))
    
     
    
    #字符串时间转化为结构化时间:strptime
    
    print(time.strptime("2018-06-07","%Y-%m-%d"))
    
     
    
    #结构化时间转化为字符串时间:strftime
    
    print(time.strftime("%Y-%m-%d %X", time.localtime()))
    
     
    
    #结构化时间转化为时间字符串:asctime
    
    print(time.asctime(time.localtime(312343423)))  # 转化成距离1970-1-1 00:00:00 时间312343423秒的时间字符串格式
    
    print(time.asctime(time.localtime()))  # 转化成当前时间字符串格式
    
     
    
    #时间戳转化为时间字符串:ctime
    
    print(time.ctime(312343423))  # 转化成距离1970-1-1 00:00:00 时间312343423秒的时间字符串格式
    
    print(time.ctime())  # 转化成当前时间字符串格式
    
     
    
    #其他方法 sleep(secs)  #线程推迟指定的时间运行,单位为秒

     

     

     

    时间加减

    import datetime,time
    
    print(datetime.datetime.now()) #返回 2016-08-19 12:47:03.941925
    
    print(datetime.date.fromtimestamp(time.time()) )  # 时间戳直接转成日期格式 2016-08-19
    
    print(datetime.datetime.now() )
    
    print(datetime.datetime.now() + datetime.timedelta(3)) #当前时间+3天
    
    print(datetime.datetime.now() + datetime.timedelta(-3)) #当前时间-3天
    
    print(datetime.datetime.now() + datetime.timedelta(hours=3)) #当前时间+3小时
    
    print(datetime.datetime.now() + datetime.timedelta(minutes=30)) #当前时间+30分
    
     
    
    c_time  = datetime.datetime.now()
    
    print(c_time.replace(minute=3,hour=2)) #时间替换

     

     

     

    1.random模块

    import random
    
    print(random.random())  #输出大于0且小于1之间的小数
    
    print(random.randint(1,5)) # 随机输出大于等于1且小于等于5之间的整数,[1,5]
    
    print(random.randrange(1,3))   # 随机输出大于等于1且小于3之间的整数,[1,3)
    
    print(random.choice([1,'2',[3,4]]))  #随机取列表中的一个元素,结果为1或者2或者[3,4]
    
    print(random.sample([1,'2',[3,4]],2))  #随机取列表中任意2个元素
    
    print(random.uniform(1,3))  #随机取大于1小于3的小数
    
    iter=[1,2,3,4,5]
    
    print(random.shuffle(iter))  #直接输出,为Nome
    
    random.shuffle(iter)   
    
    print(iter)
    
     
    
    #练习:随机生成验证码,字母和数字
    import random
    def v_code():
        code = ''
        for i in range(10):
            num = random.randint(0, 9)  # 随机选择0~9一个数字
            alf1 = chr(random.randint(65, 90))  # 随机选择A~Z一个字母
            alf2 = chr(random.randint(97, 122))  # 随机选择a~z一个字母
            add = random.choice([num, alf1, alf2])  # 随机选择num、alf1、alf2中一个
            code = "".join([code, str(add)])  # 拼接依次选到的元素
    
        return code  # 返回验证码
    
    print(v_code())

    4.os模块

    os模块是与操作系统交互的一个接口

    import os
    
    os.getcwd()  #获取当前工作目录,即当前python脚本工作的目录路径
    
    os.chdir("dirname")  #改变当前脚本工作目录;相当于shell下cd
    
    os.curdir # 返回当前目录: ('.')
    
    os.pardir  #获取当前目录的父目录字符串名:('..')
    
    os.makedirs('dirname1/dirname2')   # 可生成多层递归目录
    
    os.removedirs('dirname1')    #若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
    
    os.mkdir('dirname')    #生成单级目录;相当于shell中mkdir dirname
    
    os.rmdir('dirname')  #  删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
    
    os.listdir('dirname')   # 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
    
    os.remove()  #删除一个文件
    
    os.rename("oldname","newname")  #重命名文件/目录
    
    os.stat('path/filename')  #获取文件/目录信息
    
    os.sep    #输出操作系统特定的路径分隔符,win下为"\",Linux下为"/"
    
    os.linesep    #输出当前平台使用的行终止符,win下为"	
    ",Linux下为"
    "
    
    os.pathsep    #输出用于分割文件路径的字符串
    
    os.name    #输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
    
    os.system("bash command")  #运行shell命令,直接显示
    
    os.environ # 获取系统环境变量
    
    os.path.abspath(path)  #返回path规范化的绝对路径
    
    os.path.split(path)  #将path分割成目录和文件名二元组返回
    
    os.path.dirname(path)  #返回path的目录。其实就是os.path.split(path)的第一个元素
    
    os.path.basename(path)  #返回path最后的文件名。如何path以/或结尾,那么就会返回空值。即os.path.split(path)的第二个元素
    
    os.path.exists(path)  #如果path存在,返回True;如果path不存在,返回False
    
    os.path.isabs(path)  #如果path是绝对路径,返回True
    
    os.path.isfile(path)  #如果path是一个存在的文件,返回True。否则返回False
    
    os.path.isdir(path)  #如果path是一个存在的目录,则返回True。否则返回False
    
    os.path.join(path1[, path2[, ...]])  #将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
    
    os.path.getatime(path)  #返回path所指向的文件或者目录的最后存取时间
    
    os.path.getmtime(path)  #返回path所指向的文件或者目录的最后修改时间 

    5.sys模块

    sys.argv           命令行参数List,第一个元素是程序本身路径

    sys.exit(n)        退出程序,正常退出时exit(0)

    sys.version        获取Python解释程序的版本信息

    sys.maxint         最大的Int值

    sys.path           返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值

    sys.platform       返回操作系统平台名称

     

    6.Hashlib算法

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

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

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

    摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。

    而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。

    import hashlib
    
    md5 = hashlib.md5()  # md5只是hashlib摘要算法的一种,可以使用其他摘要算法。md5使用较多。
    
    md5.update('how to use md5 in python hashlib?'.encode("utf8"))  # 使用.encode("utf8")或者加b强制转换成二进制方式都不会报错,在python2中不需要
    
    print(md5.hexdigest())
    
    #分块多次调用update(),最后计算的结果是一样
    
    md5 = hashlib.md5()
    
    md5.update(b'how to use md5 in ')
    
    md5.update(b'python hashlib?')
    
    print(md5.hexdigest())
    
    
    
    md5.update("hello".encode("utf8"))  #计算hello的hash值
    
    print(md5.hexdigest())        #以16进制的方式打印经过md5摘要算法计算的hello的hash值

     

    MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。

    另一种常见的摘要算法是SHA1,调用SHA1和调用MD5完全类似:

    import hashlib
    
    sha1 = hashlib.sha1()
    
    sha1.update('how to use sha1 in '.encode("utf8"))
    
    sha1.update(b'python hashlib?')
    
    print(sha1.hexdigest())

    练习:

    '''
    小程序:根据用户输入选择可以完成以下功能:
    
    创意文件,如果路径不存在,创建文件夹后再创建文件
    
    能够查看当前路径
    
    在当前目录及其所有子目录下查找文件名包含指定字符串的文件
    '''
    import os
    
    choice = {
        "1": "创建文件",
        "2": "查看当前路径",
        "3": "查找文件名",
        "4": "退出程序"
    }
    
    
    def mkdir():
        file_path = input("please input your file_path:").strip()
        try:
            os.chdir(file_path)
            print("%s存在,不需要重新创建" % file_path)
        except:
            print("%s不存在,开始创建文件" % file_path)
            os.makedirs("%s创建完成" % file_path)
    
    
    def check():
        file_name = input("please input your file_path:").strip()
        try:
            print("%s绝对路径为:%s" % (file_name, os.path.abspath(file_name)))
        except:
            print("%s不存在,开始创建文件" % file_name)
    
    
    def search():
        file_dir = input("please input your file_dir:").strip()
        print("当前目录为:%s,子目录和所有文件为:%s" % (os.getcwd(), os.listdir(os.getcwd())))
    
    while True:
        for key in choice:
            print(key, choice[key])
        num = int(input("please input your choice:").strip())
    
        if num == 1:
            mkdir()
    
        elif num == 2:
            check()
    
        elif num == 3:
            search()
    
        elif num == 4:
            break

  • 相关阅读:
    rsyslog日志服务器搭建
    使用原生js实现对table中的某个单元格进行编辑并提交后台修改数据
    使用vuex管理的状态数据在刷新页面后数据丢失的问题
    brew install mongodb
    brew安装与启动redis
    zsh设置代理
    DNS Rebinding漏洞原理
    防数据泄露_MySQL库和数据安全
    PHP代码审计_用==与===的区别
    MySQL提权 通过UDF
  • 原文地址:https://www.cnblogs.com/huaerye/p/9151356.html
Copyright © 2011-2022 走看看