python(5)生成式、生成器、内置高阶函数、报错

文章目录

    • 1.生成式
    • 2.生成器
    • 3.时间戳和闭包
    • 4.装饰器
        • 1)装饰器的万能模板:
        • 2)含参数的装饰器
        • 3)多装饰器
    • 5.内置高阶函数
    • 6.报错
        • 1)常见的报错类型
        • 2)异常处理机制
        • 3)抛出异常
        • 4)自定义异常


1.生成式

# 需求: 生成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)

2.生成器

# 生成器实现的第一种方法: 将生成式改写成生成器
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))

python(5)生成式、生成器、内置高阶函数、报错_第1张图片

3.时间戳和闭包

#时间戳从1970年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)

# 闭包:
#   1. 函数里面嵌套函数
#   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()#timeit

4.装饰器

# 1. 装饰器: 用来装饰函数的工具。
# 2. 功能: 在不改变源代码的情况下, 添加额外功能(eg: 计算运行时间, 记录日志,权限判断)的工具.
# 3. 如何实现装饰器? 基于闭包的


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)

1)装饰器的万能模板:

"""
装饰器的万能模板:
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("下载图片成功")

# print(help(login))
crawl()

2)含参数的装饰器

# 需求: 计算函数的运行时间
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='seconds')  # timeit()  @desc===> login=desc(login)
def login():
    """login desc"""
    print('login....')

@timeit(args='minutes')
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("下载图片成功")

# print(help(login))
login()
# crawl()

3)多装饰器

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()
1). wrapper1()
2). wrapper2()
3). show_hosts()
"""
show_hosts()

5.内置高阶函数

# 1. map函数
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))

# 2. reduce函数
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, range(1, 101))
print(result)
# 3. filter:
# 筛选所有的偶数
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))

# 4. sorted:
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)

6.报错

1)常见的报错类型

# print(a)   # NameError

# print(10/0)   # ZeroDivsionError

# d = {'name':'westos'}
# print(d['age'])   # KeyError

# with open('hello.txt') as f:   # FileNotFoundError
#     pass


# age = 18
# if age == 18:
#     print('成年')
# else:
#     print('未成年')


# IndentationError:缩进错误
# a=b=18
# if a>b:
#     print('错误')
#  else:
#     print('正确')

2)异常处理机制

异常处理机制:

  • else:没有异常时,执行的内容
  • finally: 总会执行的内容
try:
    a = 1
    print(b)
except NameError as e:
    print('0-name error')
except KeyError:
    print('4-key error')
except Exception as e:
    print('1-exception')
else:
    print('2-no error')
finally:
    print('3-run code')

3)抛出异常

age = int(input('age:'))
if 0<age<150:
    print(age)
else:
    # 抛出异常
    raise ValueError("年龄必须在0~150之间")

4)自定义异常

# 自定义的异常
class AgeError(ValueError):
    pass

age = int(input('age:'))
if 0<age<150:
    print(age)
else:
    # 抛出异常
    raise AgeError("年龄必须在0~150之间")

你可能感兴趣的:(python(5)生成式、生成器、内置高阶函数、报错)