文章目录
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)