python基础day-12:python三神器(装饰器,迭代器,生成器)、模块

三神器

一、装饰器

1.1 无参装饰器

1.2 有参装饰器

  • 应用场景
    • 实现装饰器功能的时候,需要额外的数据
def 函数名(参):
    无参装饰器 - 里面会用到额外参数
    return 无参装饰器函数名

函数名 - 创建装饰器的函数名
参数列表 - 有多个参数看实现装饰器功能额外需要多少数据
# 写个装饰器将原函数返回值加上指定的数
def add_number(num):
    def add_number_(fn):
        def new_fn(*args, **kwargs):
            result = fn(*args, **kwargs)
            if type(result) in (int, float, complex):
                return result + num
            return result
        return new_fn
    return add_number_


@add_number(5)
def func1(num1, num2):
    return num1 * num2


print(func1(2, 4))

二、迭代器(iter)

2.1 什么是迭代器

  • 容器型数据类型
  • 不可直接获取所有元素,只能一个一个取走
  • 不可直接统计元素个数
  • 创建:
    1. 将其它序列转换成迭代器
    2. 生成器创建
list1 = [1, 34, 5, 2, 456, 35]
iter1 = iter(list1)

print(iter1, type(iter1))  # <list_iterator object at 0x0000022A37920BC8> <class 'list_iterator'>

2.2 获取迭代器元素

  • 获取到迭代器中的元素,该元素在迭代器中就不存在了
2.2.1 单个
  • next(迭代器)
  • 没有了就会报错
print(next(iter1))  # 1
print(next(iter1))  # 34
2.2.2 遍历
  • for 变量 in 迭代器:
  • 遍历后,迭代器也会空
iter2 = iter(range(5))
for x in iter2:
    print(x)  # 0 1 2 3 4
print(list(iter2))  # []

iter3 = iter(range(0, 10, 2))
list(iter3)
# print(next(iter3))  # StopIteration

三、生成器(generator)

3.1 什么是生成器

  • 特殊的迭代器
  • 存储的是产生数据的算法而不是数据本身
  • 是个下蛋的母鸡
  • 内存消耗少

3.2 创建生成器

  • 调用带有yield关键字的函数就可以得到
  • 不管yield在函数的哪里,哪怕是放在return后面,调用时都不会执行函数体
  • 函数调用的值是一个生成器对象
def func1():
    yield

3.3 生成器产生数据的能力怎么确定

  • 创建多少数据?
    1. 执行完生成器对应的函数体会遇到几次yield,就创造多少个数据
    2. 每次遇到yield,yield后面的值是什么,对应创造的数据就是什么
def func2():
    for i in range(5):
        yield 10**i


print(next(func2()), next(func2()))  # 1 1

gen1 = func2()
print(next(gen1), next(gen1))  # 1 10

3.4 生成器产生数据的原理

  • 生成器对应的函数在调用函数的时候不会执行函数体
  • 获取生成器中的数据时才会执行函数体
  • 每次获取数据时,从上一次结束的位置开始执行函数体
  • 每次遇到yield就停下来,将yield后面的数据作为结果返回,并记录结束位置
  • 如果next去取,到函数结束都没有遇到yield,就会报错
# 练习:产生指定前缀和长度的学号
# 前缀:py,长度:4  py0001~py9999
def prefix_number(prefix, width):
    for i in range(1, 10**width):
        yield prefix + str(i).zfill(width)


pn_gen = prefix_number('py', 4)
for i in range(10):
    print(next(pn_gen))

模块

一、模块

1.1 什么是模块

  • 一个py文件就是一个模块

1.2 在一个模块中使用另一个模块的内容

  • 模块名符合标识符要求
1.2.1 导入模块
  • import 模块名
  • 使用模块中的所有全局变量
  • 通过‘模块名.’的方式来用
1.2.2 导入变量
  • from 模块名 import 变量名1,变量名2…
  • 能够使用模块中指定的变量
  • 变量直接使用
1.2.3 重命名
  • import 模块名 as 新模块名
  • from 模块名 import 变量名 as 新变量名
1.2.4 通配符 *
  • from 模块名 import *
  • 可以直接使用模块中的变量

二、原理

  1. 当代码执行到导入模块
  2. 系统会自动将被导入的模块中的代码全部执行一遍
  3. 避免执行模块中的不必要代码
    if __ name__ == ‘__ main__’:
    语句下的代码不会在别的模块中执行
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值