一个用来生成列表的特定语法形式的表达式。是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**2 for i in range(10)}
print(result)
用来快速生成字典
result = {i:i**2 for i in range(10)}
print(result)
在python中,一边循环一边计算的机制,称为生成器:Generator
什么时候使用生成器:
性能限制需要用到,比如读取一个10G的文件,如果一次性将10G的文件加载到内存到处理的话,内存肯定会溢出;但使用生成器读写交叉处理进行,比如使用(readline和readlines)就可以在循环读取的同时不断处理,这样就可以节省大量的内存空间。
第一种方法: 将生成式改写成生成器
nums = (i**2 for i in range(10000))
第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))
闭包是指有权访问另一个函数作用域中的变量的函数。
创建闭包最为常见,就是在一个函数内部创建另一个函数
常见形式:内部函数使用了外部函数的临时变量,且外部函数的返回值是内部函数的作用。闭包的一个常用场景就是装饰器。
闭包:
def timeit(name):
def wrapper():
print('wrapper ' + name)
print('timeit')
return wrapper
in_fun = timeit(name='westos') # wrapper函数, in_fun实质上就是wrapper函数
in_fun()
小拓展:时间戳
计算程序运行的时长
import time
start_time = time.time() # 时间戳:从1970年1.1到现在经历的秒数
time.sleep(2)
end_time = time.time() # 时间戳:从1970年1.1到现在经历的秒数
print(end_time-start_time)
import time
def timeit(f): # f=add
def wrapper(x, y):
start = time.time()
result = f(x, y) # f实质上是add函数
end = time.time()
print("函数运行的时间为: %.4f" %(end-start))
return result
return wrapper
@timeit # 1. 语法糖, add=timeit(add)
def add(x, y):
return x + y
result = add(1, 3)
print(result)
装饰器的万能模板:
def 装饰器名称(f):
@wraps(f) # 保留被装饰函数的属性信息和帮助文档
def wrapper(*args, **kwargs):
# 执行函数之前做的事情
result = f(*args, **kwargs)
# 执行函数之后做的事情
return result
return wrapper
需求: 计算函数的运行时间
import time
from functools import wraps
def timeit(f):
"""计时器的装饰器"""
@wraps(f) # 保留被装饰函数的属性信息和帮助文档
def wrapper(*args, **kwargs):
"""wrapper内部函数"""
start = time.time()
result = f(*args, **kwargs)
end = time.time()
print(f"函数{f.__name__}运行时间为{end-start}秒")
return result
return wrapper
@timeit
def login():
"""login desc"""
print('login....')
login()
@timeit
def crawl():
import requests
url = 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/0a/Python.svg/1200px-Python.svg.png'
content = requests.get(url).content
with open('doc/python.png', 'wb') as f:
f.write(content)
print("下载图片成功")
crawl()
import time
from functools import wraps
def timeit(args='seconds'):
def desc(f):
"""计时器的装饰器"""
@wraps(f) # 保留被装饰函数的属性信息和帮助文档
def wrapper(*args, **kwargs):
"""wrapper内部函数"""
start = time.time()
result = f(*args, **kwargs)
end = time.time()
if args == 'seconds':
print(f"函数{f.__name__}运行时间为{end-start}秒")
elif args == 'minutes':
print(f"函数{f.__name__}运行时间为{(end-start)/60}秒")
return result
return wrapper
return desc
@timeit(args='minutes') # timeit() @desc===> login=desc(login)
def login():
"""login desc"""
print('login....')
login()
from functools import wraps
def is_login(f):
# @wraps(f)
def wrapper1(*args, **kwargs):
print('is_login, 用户是否登录')
result = f(*args, **kwargs)
return result
return wrapper1
def is_permission(f):
# @wraps(f)
def wrapper2(*args, **kwargs):
print('is_permission, 用户是否有权限')
result = f(*args, **kwargs)
return result
return wrapper2
# 规则: 执行装饰器内容是从上到下。 被装饰的顺序是从下到上。
@is_login # show_hosts=is_login(wrapper2) show_hosts=wrapper1
@is_permission # show_hosts = is_permission(show_hosts) show_hosts=wrapper2
def show_hosts():
print("显示所有的云主机")
show_hosts()
result = map(lambda x: x ** 2, [1, 2, 4, 5])
print(list(result))
result = map(lambda x, y: x + y, [1, 2, 3], [4, 5, 6])
print(list(result))
from functools import reduce
# (((1+2)+3)+4)+5=reduce result
result = reduce(lambda x, y: x + y, [1, 2, 3, 4, 5])
print(result)

求1 * 2 * …100的结果, 用reduce和匿名函数实现
result = reduce(lambda x, y: x * y, [1, 2, 3, 4, 5])
print(result)

筛选所有的偶数
result = filter(lambda x: x % 2 == 0, [1, 2, 4, 5, 8])
print(list(result))

筛选所有的奇数
result = filter(lambda x: x % 2 != 0, [1, 2, 4, 5, 8])
print(list(result))

排序
result = sorted([1, 29, 2, 3])
print(result)
result = sorted([0, 29, 2, 0], reverse=True)
print(result)
result = sorted([0, 8, 9, 0, 16], key=lambda x:0 if x==0 else 1)
print(result)
result = sorted([0, 8, 9, 0, 16], key=lambda x:0 if x==0 else 1)
print(result)