python13_高级特性 生成式 生成器 闭包装饰器

1. 生成式

1.1 列表生成式

在这里插入图片描述

  • 列表生成式: 用来生成列表的生成式
  • 用 [ ] 表示
# 列表生成式: 用来生成列表的生成式
# 用 [] 表示
#  需求:生成100个验证码(4个字母组成的验证码)
# 方案一:
import random
import string
codes = []
for count in range(100):
    code = "".join(random.sample(string.ascii_letters, 4))
    codes.append(code)      # 被省略了
print(codes)

# 方案二: 列表生成式
codes = [ "".join(random.sample(string.ascii_letters, 4)) for i in range(100) ]
print(codes)

1.2 练习:找出1~100之间可被整除的数

# 练习:
# 需求: 找出1~100之间可以被3整除的数
# 方案一:
nums = []
for num in range(1, 101):
    if num%3 == 0:
        nums.append(num)    # 被省略了
print(nums)

# 方案二: 列表生成式
nums = [ num for num in range(1, 101) if num % 3 == 0 ]
print(nums)

1.3 集合生成式

  • 快速生成集合
  • 用 { } 表示
# 2. 集合生成式
# 快速生成集合
# 用 {} 表示
result = { i**2 for i in range(10) }
print(result)
# {0, 1, 64, 4, 36, 9, 16, 49, 81, 25}

1.4 字典生成式

  • 快速生成字典
  • 用 { } 表示
# 3. 字典生成式
# 快速生成字典
# 用 {} 表示
result = { i:i**2 for i in range(10) }
        # key:value
print(result)
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

2. 生成器

2.1 生成器的定义

  • 生成器:对生成式的优化方案
  • 生成式的缺陷:生成式生成数据时,会有时间的等待
  • 用 ( ) 表示
    在这里插入图片描述在这里插入图片描述

2.2 实现生成器的第一种方法:将生成式改写为生成器

  • 用 ( ) 表示
# 生成器实现的第一种方法:将生成式改写为生成器
#   generator: 一边循环,一边计算
nums = ( i**2 for i in range(5) )
# 一步一步生成结果
print(nums)         # <generator object <genexpr> at 0x0000020CE2A2EAC0>
print(next(nums))   # 0
print(next(nums))   # 1
print(next(nums))   # 4
print(next(nums))   # 9
print(next(nums))   # 16

2.3 实现生成器的第2种方法:yield关键字

  • return: 函数遇到 return,就会返回;而return后的代码并不会被执行
  • yield: 遇到yield,则停止执行代码;当再次调用next方法时,会从上次停止的地方继续执行,直到遇到yield停止
    在这里插入图片描述
# 生成器实现的第2种方法:yield关键字
#   return: 函数遇到 return,就会返回;而return后的代码并不会被执行
#   yield:

def login():
    a = 1
    return 'login'

result = login()
print(result)       # 打印的结果是 login
# 生成器实现的第2种方法:yield关键字 (暂时停靠)
#   return: 函数遇到 return,就会返回;而return后的代码并不会被执行
#   yield:  遇到yield,则停止执行代码;
#           当再次调用next方法时,会从上次停止的地方继续执行,直到遇到yield停止

def login_up():
    print('step 1')
    yield 1
    print('step 2')
    yield 2
    print('step 3')
    yield 3
# 如果函数里面有yield关键字,函数的返回值是一个生成器
result = login_up()
print(result)       # <generator object login_up at 0x0000020E30CAE820>
print(next(result))
print(next(result))
  • 生成器执行的过程如下:采用 debug 调式查看
    在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
    在这里插入图片描述

2.4 生成器的特点

在这里插入图片描述

3. 闭包

3.1 扩展知识:时间戳

# 1. 扩展: 时间戳
import time
start_time = time.time()
# 时间戳: 从1970年1月1日到现在,经历的秒数
time.sleep(2)
end_time = time.time()
# 时间戳: 从1970年1月1日到现在,经历的秒数
print( end_time - start_time )  # 2.011657238006592

3.2 闭包的特性

在这里插入图片描述

# 2. 闭包的特性
# 2-1). 函数里面嵌套函数
# 2-2). 外部函数的返回值是内部函数的引用
# 2-3). 内部函数可以使用外部函数的变量
def timeit(name):
    def wrapper():
        print( 'wrapper ' + name )
    print('timeit')
    return wrapper

in_fun = timeit(name='westos')   # wrapper函数,in_fun实质上就是wrapper函数
in_fun()            # 执行wrapper函数
# timeit
# wrapper westos

4. 装饰器

在这里插入图片描述在这里插入图片描述在这里插入图片描述

  • 装饰器: 用来装饰函数的工具
  • 在不改变源代码的情况下,添加额外功能(eg: 计算运行时间…)
  • 如何实现装饰器? 基于闭包
  • 使用装饰器的方式: 语法糖 @timeit
# 装饰器
# 1. 装饰器: 用来装饰函数的工具
# 2. 在不改变源代码的情况下,添加额外功能(eg: 计算运行时间......)
# 3. 如何实现装饰器? 基于闭包
# 4. 使用装饰器的方式: 语法糖 @timeit
import time
def timeit(f):
    def wrapper(x, y):
        start = time.time()
        result = f(x, y)
        end = time.time()
        print('函数运行的时间为: %.4f' %(end-start))
        return result
    return wrapper

@timeit     # 语法糖,add=timeit(add)
def add(x, y):
    return x + y

result = add(1, 3)
print(result)

在这里插入图片描述

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值