带参数的装饰器、模块和包、常见系统模块

一、带参数的装饰器

  1. 普通函数和匿名函数使用无参装饰器的两种方式

    # 一个无参装饰器,使返回的数据都是字符串格式
    def out_str(fn):
        def new_f(*args, **kwargs):
            result = fn(*args, **kwargs)
            result = str(result)
            print('已转变为字符串')
            return result
        print('装饰器被调用')
        return new_f
    
    
    @out_str  			#只要有这个语法糖,那么装饰器中就会执行,即会输出'装饰器被调用'
    def func1(i: int):
        if i % 2:
            print('odd odd')
            return i * 2
        else:
            print('even even')
            return i
    
    
    func2 = lambda x: {x: x * 3}
    
    # 加入装饰器后,调用输出为:'装饰器被调用',奇偶数, print('已转变为字符串'),print(kkk)
    kkk = func1(3)
    print(kkk, type(kkk))
    fff = out_str(func2)(3) #匿名函数使用装饰器的方法
    print(fff, type(fff))
    
    ==============================================================
    # 带有参数的装饰器在匿名函数和普通函数中的应用
    def add_out_str(s: str):
        def out_str(fn):
            def new_f(*args, **kwargs):
                result = fn(*args, **kwargs)
                result = str(result) + s
                print('已转变为字符串')
                return result
            print('装饰器2被调用')
            return new_f
        print('装饰器1被调用')
        return out_str
    
    
    @add_out_str('ssss')
    def func1(i: int):
        if i % 2:
            print('odd odd')
            return i * 2
        else:
            print('even even')
            return i
    
    
    func2 = lambda x: {x: x * 3}
    
    
    kkk = func1(3)
    print(kkk, type(kkk))
    fff = add_out_str('ssss')(func2)(3)
    print(fff, type(fff))
    

二、模块和包

(一)模块

  1. 模块的概念?

    1. 一个.py文件就是一个模块
    2. 可以将同类的,功能相似的变量或方法(函数)集合到一个文件,便于管理
    3. 可以将模块中的全局变量导出
    4. 模块名的命名方式遵循变量命名
  2. 常见模块导入方式

    1. import 模块名

    2. import 模块名 as 新模块名

      ----这么做的原因通常有两个:1)原模块名太长,起个短的别名方便使用。2)导入该模块的文件中,有相同的名称。

    3. from 模块名 import 变量1,变量2…

    4. from 模块名 import 变量1 as 别名,变量2 as 别名…--------导入模块中的某些变量,并为其取新名

    5. from 模块名 import * ---------------------导入模块中的所有全局变量

  3. 注意事项:

    1. 不管以哪种方式导入模块或模块中的变量,都会执行一遍模块中的代码,然后在根据导入的方法复制相应的全局变量到该文件中。
    2. 导入的全局变量的值也是执行后的值
    3. 如果在导入模块时,不想执行被导入模块中的代码,可以将其放入到if __name__ == '__main__'中。所以,这个条件语句中的全局变量也是不能导入的。__name__的名字就是模块的名字。
    4. 一个文件中,导入两次同一个模块的话,只会执行一次。

(二)包

  1. 包的概念?
    1. 包就是一个包括__init__.py模块的文件夹。
    2. 文件夹的命名遵循标识符的命名。
    3. 包和模块相比,就是一个更大的工具箱
  2. 包的导入方式
    1. import 包名
    2. import 包名 as 新的包名
    3. import 包名.模块名1,包名.模块名2… -----导入一个包中的多个模块
    4. import 包名.模块名 as 新名字
    5. from 包名 import 模块名1, 模块名2…
    6. from 包名 import 模块名1 as 新名字, 模块名2 as 新名字…
  3. 包中__init__.py文件的使用
    1. 只要导入包,不管以何种方式都会先执行__init__.py中的内容
    2. 可以在__init__.py文件中,事先导入该包中的一些常用模块或某些模块中的变量
    3. 即便是在本包中的__init__.py文件中导入本包中的模块或变量,也一定是import 包名…X的形式,即包名是不可以省略的。

三、常用系统模块

  1. OS 模块

    1. 模块的主要功能是对文件的一些操作
    2. import os
    3. os.getcwd() -------获取当前的工作目录
    4. os.getcwdb() ------以字节的方式来输出工作 目录,如果获得Unicode的形式,需要进行decode()
    5. os.listdir(path) ---------- 列出某个路径下的文件,注意输入路径的时候可以使用r语法。
  2. random模块

    1. import random,通常是一些与随机数有关的函数
    2. random.randint(m,n) —取从m到n的随机整数,m,n都是可以取到的
    3. random.random() ----取0到1之间的随机数,随机数不包括0,1
    4. random.shuffle([]) ----对列表里的元素进行重新打乱,支持列表,字典(使键对应的值打乱),且改变原序列
    5. random.choice(序列) — 选择序列中的一个元素,支持列表、元组、字典、字符串,不支持集合
    6. random.choices(序列, k= N) —从序列中选取N次元素,组成列表进行返回。同上
  3. time 和 datetime模块

    1. time.time()–获取时间戳,灭有参数。时间戳的概念是与1970年1月1日0时0分(格林威治时间)的时间差,返回的是一个浮点数,好处在于:1)节省内存,与用字符串比较起来。2)便于加密。
    print(time.time()) #1615995450.5487132
    
    1. time.localtime() – 获取本地时间,返回的是一个时间结构体,可以用.year,.month, .day, .hour, .second等操作获取相应字段.如果没有参数,则是现在时间。也可以传入一个时间戳。

      time.struct_time(tm_year=2021, tm_mon=3, tm_mday=17, tm_hour=23, tm_min=39, tm_sec=43, tm_wday=2, tm_yday=76, tm_isdst=0)
      
    2. time.sleep() – 让程序休息一段时间,单位时秒

    3. from datetime import date, time, datetime, timedelta,导入相关类

    4. datetime.now()—获取当前时间

       2021-03-18 00:05:01.093233 1 93233, <class 'datetime.datetime'>
      
    5. date.today() – 2021-03-18

    6. datetime.deltatime()

      t4 = tt - timedelta(days=10)
      
  4. hashlib模块

    1. 哈希算法的特点:

      • 不可逆
      • 同一数据同一算法,得出的结果是不变的
      • 不管数据大小,经过哈希加密(摘要)后,得到的长度是一样的
    2. 哈希摘要的步骤:

      • 根据算法,创建哈希对象:hashlib.算法名()

        import hashlib
        ha = hashlib.md5()
        ha = hashlib.sha1()
        
      • 添加原文

      t.update('abcd'.encode())
      # 对字符串进行字节编码
      
      • 获取加密后的密文
      print(t.hexdigest())
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值