python进阶之路14 之函数内置方法、可迭代对象、异常捕获处理

image

重要内置函数

1.map()  映射
       l1 = [1, 2, 3, 4, 5]
       # def func(a):
       #	return a+1
    
      res = map(lambda x:x+1, l1)
      print(list(res))
2.max()\min()
	l1 = [11, 22, 33, 44]
	res = max(l1)

	d1 = {'zj':100,
        'jason': 99999,
        'bekr':888080,
        'jerry':45455454
        }
	def func(a):
		return  d1.get(a)
	# res = max(d1,key=lambda k:d1.get(k))
	res = max(d1, key=func)
	print(res)
3.reduce	
    传多个值 返回一个值   
    把列表中所有的数值加一起
    from functools import reduce
    l1 = [11, 22, 334, 4555, 666, 777, 8888, 222323]
    res = reduce(lambda a, b: a + b, l1)
    print(res)
4.zip  多个数据集合 组合 一一对应,如果那个集合数据比较多,多出部分 直接丢掉
	l1 = [11, 22, 33, 44, 55]
	l2 = ['jason', 'kevin', 'oscar', 'jerry', 'tony']
	l3 = [1, 2, 3, 4, 5]
	res = zip(l1, l2, l3)
	print(list(res))

	l1 = [11, 22, 33]
	l2 = ['jason', 'kevin', 'oscar', 'jerry', 'tony']
	l3 = [1, 2, 3, 4]
	res = zip(l1, l2, l3)
	print(list(res))

5.filter    过滤     统计列表中比40大的值
	l1 = [11,22,33,44,55,66,778,888]
	res = filter(lambda x: x > 40, l1)
	print(list(res))


6.sorted     排序
	l1 = [21,12,53,64,88,44,333,555]
	res = sorted(l1)
	print(res)  # 默认升序

常见内置函数

# 1.abs() 绝对值
# print(abs(-100))   # 100
# print(abs(100))     # 100

# 2.all()   所有数据值对应的布尔值为True结果才是True否则返回Flase
# print(all([0,1, 2, 3]))   # False
# print(all([1, 2, 3, True]))  # True

# 3.any()  所有数据值对应的布尔值又一个为 True结果就是True 否则返回Flase
# print(any([0, None, '', 1]))    # True
# print(any([0, None, '', ]))    # False

# 4.bin() oct() hex() int()

# 5.bytes()   转换成bytes类型
# s1 = '今天周五 内容也简单'
# print(s1.encode('utf8'))
# print(bytes(s1,'utf8'))

# 6.callable() 判断名字是否可以加括号调用
# name = 'jason'
# def index():
#     print('from index')

# print(callable(name))    # False
# print(callable(index))     # True

# 7.chr() ord() 基于ASCII码做数字与字母的转换
# print(chr(65))       # A
# print(ord('A'))    # 65

# 8.dir() 返回括号内对象能够调用的名字
# print(dir('hello'))   # 内置函数

# 9.divmod() 元组 第一个数据为整除数  第二个是余数
# res = divmod(100, 2)
# print(res)   # (50, 0)
# res = divmod(100, 3)
# print(res)  # (33, 1)

"""
总数据     每页展示的数据     总页码
100         10              10
99          10              10
101         10              11
"""
# page_num, more = divmod(999999, 21)
# print(divmod(99999, 10))  #  (9999, 9)
#
# if more:
#     page_num += 1
# print('总页码为:',page_num)   # 总页面为:  47619

# 10.enumerate()    枚举

# # 11.dval() exec()  能够识别字符串中的python并执行
# s1 = 'print("哈哈哈")'
# eval(s1)
# exec(s1)
# s2 = 'for i in range(100):print(i)'
# eval(s2)  # 报错  # 只能识别简单的python代码  具有逻辑性的都不行
# exec(s2)  # 可以识别具有一定逻辑性的python代码

# 12.hash() 哈希加密
# print(hash('jason'))

# 13.id()数据的地址 input()输入 isinstance()输入两个值 第二个值判断第一个值是不是输入的类型

# 14.open()  打开文件

# 15.pow()  幂指数(次方)   **

# 16.range()  工厂   顾头不顾尾
# 一个值 0-该数值前一个
# 两个值 从第一个开始到后面的值前一个
# 三个值 输出等差数列 第三个值为等差值

# 17.round()  五舍六入  应该是python对数值不敏感导致
# print(round(98.3))  # 98
# print(round(98.5))   # 98
# print(round(98.6))   # 99

# 18.sum()  求和
# print(sum([11, 22, 33, 44, 55, 66, 77]))   # 308

image

可迭代对象

1.可迭代对象
	对象内置有__iter__方法的都称为可迭代对象
"""
	1.内置方法  通过点的方式能够调用的方法
	2.__iter__  双下iter方法
"""
2.可迭代对象的范围
	不是可迭代对象
    	int  float bool 函数对象
	是可迭代对象
    	str list dict tuple set 文件对象
3.可迭代的含义
"""
	迭代:更新换代(每次更新都必须依赖上一次的结果)
	eg:手机app更新
"""
可迭代对象在python中可以理解为是否支持for循环

迭代器对象

1.迭代器对象
	是有可迭代对象调用__iter__方法产出的
    迭代器对象判断的本质是看是否内置有__iter__和__next__
2.迭代对象的作用
	提供了一种不依赖于索引取值的方式
    正因为有迭代器的存在 我们的字典 集合才能够被for循环
3.迭代器对象实操
	s1 = 'hello'  # 可迭代对象
	res = s1.__iter__()   # 迭代器对象
	print(res.__next__())   # 迭代取值  for 循环的本质
	一旦__next__取不到值  会直接报错
4.注意事项
	可迭代对象调用__iter__会成为迭代器对象  迭代器对象如果还调用__iter__不会有任何变化  还是迭代器对象本身

for循环的本质

for 变量名 in 可迭代对象:
    循环体代码
"""
1.先将in后的数据调用__iter__转变成迭代器对象
2.依次让迭代器对象调用__next__取值
3.一旦__next__取不到值报错 for循环会自动捕获并处理
"""

昨日作业

# 有下列用户数据
# user_data = {
#     '1': {'name': 'jason', 'pwd': '123', 'access': ['1', '2', '3']},
#     '2': {'name': 'kevin', 'pwd': '321', 'access': ['1', '2']},
#     '3': {'name': 'oscar', 'pwd': '222', 'access': ['1']}
# }
# 并有三个函数

# def func1():
#     pass

# def func2():
#     pass

# def func3():
#     pass
#
# 要求: 调用上述三个函数的时候需要从user_data中校验用户身份是否正确
# 并获取当前登录用户拥有的可执行函数功能编号即键access对应的功能编号列表

# func1是1、func2是2、func3是3
# 并且一旦用户登录成功之后后续函数的调用不再校验用户身份
# 请思考如何获取函数功能编号
# 如何校验用户身份
# 如何校验权限
# ps: 装饰器知识
# 附赠: 实现上述主体功能即可
# 其他扩展优化功能可暂且不写
#
# '''
# 1.先编写校验用户身份的装饰器
# 2.然后再考虑如何保存用户登录状态
# 3.再完善各种需求
# '''

答案

user_data = {
    '1': {'name': 'jason', 'pwd': '123', 'access': ['1', '2', '3']},
    # '1': {'name': 'jason', 'pwd': '123', 'access': [func1, func2, fun3]},
    '2': {'name': 'kevin', 'pwd': '321', 'access': ['1', '2']},
    '3': {'name': 'oscar', 'pwd': '222', 'access': ['1']}
}
"""
1.先写模板
2.再写用户校验
3.记录用户登录状态
"""
is_login = {
    'login_status': False,  # 记录用户是否登录
    'user_access': None  # 记录登录用户的权限
}
def loin_auth(func_id):
    def outer(func_name):
        def inner(*args, **kwargs):
            # 6.先校验用户是否登录
            if is_login.get('login_status'):
                # 8.需要校验功能编号是否在当前登录的用户权限中
                if func_id not in is_login.get('user_access'):
                    print(f'您没有功能编号为{func_id}的权限')
                    return
                res = func_name(*args, **kwargs)
                return res
            # 1.先获取用户的编号
            user_id = input('请输入您的编号>>>>:').strip()
            # 2.校验用户编号是否存在
            if user_id not in user_data:
                print('用户编号不存在 无法完成身份校验 请走开!!!')
                return
            # 3.获取用户的用户名和密码
            username = input('please input your username>>>:').strip()
            password = input('please input your password>>>:').strip()
            # 4.获取用户编号对应的真实数据进行比对
            user_dict = user_data.get(user_id)
            if username == user_dict.get('name') and password == user_dict.get('pwd'):
                # 5.登录成功之后修改字典中登录状态
                is_login['login_status'] = True
                # 6.记录当前登录用户的权限编号
                is_login['user_access'] = user_dict.get('access')
                # 7.校验当前函数编号是否在当前用户权限列表内
                if func_id in user_dict.get('access'):
                    res = func_name(*args, **kwargs)
                    return res
                else:
                    print(f'您没有功能编号为{func_id}的权限')
            else:
                print('用户名和密码错误')

        return inner

    return outer


@loin_auth('1')
def func1():
    print('执行函数func1')


@loin_auth('2')
def func2():
    print('执行函数func2')


@loin_auth('3')
def func3():
    print('执行函数func3')


func1()
func2()
func3()
posted @ 2022-10-14 20:41  缀月  阅读(371)  评论(0编辑  收藏  举报