Python高级特性之生成式、生成器、闭包

1、生成式

列表生成式就是一个用来生成列表的特定语法形式的表达式。是Python提供的一种生成列表的简洁形式, 可快速生成一个新的list。

# 需求: 生成100个验证码(4个字母组成的验证码)
import  string
import  random
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-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)

在这里插入图片描述

字典生成器

# 字典生成式
result = {
    
    i:i**2 for i in range(10)}
print(result)

在这里插入图片描述

集合生成器

# 集合生成式
result = {
    
    i**2 for i in range(10)}
print(result)

在这里插入图片描述

2、生成器

- 什么叫生成器?
在Python中,一边循环一边计算的机制,称为生成器:Generator。

- 什么时候需要使用生成器?
性能限制需要用到,比如读取一个10G的文件,如果一次性将10G的文件加载到内存处理的话(read方法),内存肯定会溢出;但使用生成器把读写交叉处理进行,比如使用(readline和readlines)就可以再循环读取的同时不断处理,这样就可以节省大量的内存空间.

将生成式改写成生成器

# 生成器实现的第一种方法: 将生成式改写成生成器
nums = (i**2 for i in range(10))
for num in nums:
    print(num)

在这里插入图片描述

yield关键字

# 生成器实现的第2种方法:yield关键字
#   return: 函数遇到return就返回,return后面的代码并不会执行。
#   yield:遇到yield则停止执行代码, 当再次调用next方法时,会从上次停止的地方继续执行,遇到yield停止。。。。
def login():
    print('step 1')   # 'step 1'
    yield 1           # output 1
    print('step 2')
    yield  2
    print('step 3')
    yield 3
# 如果函数里面有yield关键字,函数的返回值就是一个生成器
g = login()
print(next(g))
print(next(g))

在这里插入图片描述

3、闭包

  • 什么是闭包?如何实现闭包?
    闭包就是指有权访问另一个函数作用域中的变量的函数。
    创建闭包最常见方式,就是在一个函数内部创建另一个函数。
    常见形式: 内部函数使用了外部函数的临时变量,且外部函数的返回值是内部函数的引用。
    闭包的一个常用场景就是装饰器。
# import  time
# start_time = time.time()  # 时间戳:从1970年1.1到现在经历的秒数
# time.sleep(2)
# end_time = time.time()    # 时间戳:从1970年1.1到现在经历的秒数
# print(end_time-start_time)


# 闭包:
#   1. 函数里面嵌套函数
#   2. 外部函数的返回值是内部函数的引用
#   3. 内部函数可以使用外部函数的变量
def timeit(name):
    def wrapper():
        print('wrapper ' + name)
    print('timeit')
    return wrapper
# in_fun = timeit()
# in_fun()
in_fun = timeit(name='westos')  # wrapper函数, in_fun实质上就是wrapper函数
in_fun()

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45777669/article/details/114045033