Python基础14

今日内容概要

  • 算法简介及二分法
  • 三元表达式
  • 各种生成式
  • 匿名函数
  • 常见内置函数

今日内容概要

算法简介及二分法

算法简介

1.什么是算法
	算法就是解决问题的有效方法 不是所有的算法都很高效 也有不合格的算法
2.算法应用场景
	推荐算法   如 抖音短视频 淘宝商品推送等等
	成像算法(AI相关)...
	几乎涵盖了我们日常生活中的方方面面
'''算法工程师的待遇非常好,但是他的要求也非常高,并且不是所有的互联网公司都养得起算法部门,通常情况下之后大型互联网公司才有,十年磨一剑'''

二分法

是算法中最简单的算法 甚至都称不上是算法
就是不断的对数据集做二分切割
'''
二分法使用要求
	待查找的数据集必须有序
缺陷
	针对在开头以及结尾的数据查找效率很低
'''
'''常见算法
二分法、冒泡、快拍、插入、堆排、桶排、数据结构(链表 约瑟夫问题 如何链表是否成环)
'''
代码实现二分法
# 二分法 不断的对数据集做二分切割
l1 = [12, 21, 32, 43, 56, 76, 87, 98, 123, 321, 453, 565, 678, 754, 812, 987, 1001, 1232]
# 查找列表中某个数据值
def get_num(a, num):
    # 添加一个结束条件
    if len(a) == 0:
        print('没找到')
    # 获取列表中间索引值
    middle = len(a) // 2
    # 比较目标数据值与中间索引值的大小
    if num < a[middle]:
        # 切片保留列表右边一半
        left_list = a[:middle]
        # 针对右边一半的列表继续二分并判断
        return get_num(new_list, num)
    elif num > a[middle]:
        # 切片保留列表左边一半
        right_list = a[middle + 1:]
        # 针对左边一半的列表继续二分并判断
        return get_num(new_list, num)
    else:
        print('找到了')
      

三元表达式

"""
数据值1 if 条件 else 数据值2
条件成立则使用数据值1 条件不成立则使用数据值2

当结果是二选一的情况下 使用三元表达式较为简便
并且不推荐多个三元表达式嵌套
"""
name = 'jason'
# 普通写法
if name == 'jason':
	print('老师')
else:
	print('学生')
    
# 三元表达式写法
res = '老师' if name == 'jason' else '学生'
print(res)

各种生成式/表达式/推导式

列表推导式

name_list = ['jason', 'kevin', 'oscar', 'tony', 'jerry']
# 给列表中所有人名的后面加上nb后缀
new_list = [name + 'nb' for name in name_list]
'''先看for循环 每次for循环之后再看for关键字前面的操作'''

# 复杂情况
new_list = [name + 'nb' for name in name_list if name == 'jason']
# 先看for循环 再看判断条件是否成立 成立再看最前面的操作
new_list = [name + 'nb' if name == 'jason' else name + 'sb' for name in name_list if name != 'jack']
# 先看for循环 再看判断条件是否成立 然后看前面的三元表达式 做判断 在执行条件成立的操作

字典生成式

d1 = {i: j for i,j in enumerate('hello')}
print(d1)  # {0: 'h', 1: 'e', 2: 'l', 3: 'l', 4: 'o'}
# enumerate函数会自动为被遍历后的数据依次添加从0开始的数字

集合生成式

s1 = {i for i in 'hello'}
print(s1)  # {'o', 'h', 'l', 'e'}  集合是无序的 

匿名函数

没有名字的函数 并且执行的代码比较简单 需要使用关键字lambda 一般不单独使用 需要配合其他函数一起使用
语法结构
	lambda 形参:返回值
如
	lambda a,b:a+b

常见内置函数

1.map() 映射
	map(func,iterable),其中func为函数名,可为lambda匿名函数,iterable为可迭代对象。此函数会将可迭代对象中的每一位元素作为参数传递到func中,并将func的计算结果加入到新列表内,map()返回的是一个包含所有结果的新列表。
    # 让字典中的每个数据值加1
    l1 = [1, 2, 3, 4, 5]
    # def func(a):
    #     return a + 1
	res = map(lambda x:x+1, l1)
	print(list(res)) # [2, 3, 4, 5, 6]
2.max()\min()  求最大值\求最小值
	min(iterable, *[, key, default])
参数:iterable是可迭代的对象,key指定寻找最小值的关键字,若key不指定则采用默认位置
返回值:返回值是iterable中寻找到的最小值
	l1 = [11, 22, 33, 44]
 	res = max(l1)
	print(res)  # 44
   
# 如果比较字典数据
	d1 = {
    'zj': 100,
    'jason': 8888,
    'berk': 99999999,
    'oscar': 1
	}
    def func(a):  # 定义一个函数,取对应的value值
        return d1.get(a)
    # res = max(d1, key=lambda k: d1.get(k)) 用匿名函数
    # 如果后面不指定参数 那么比较的是key值 而不是后面的value值
    res = max(d1, key=func)  # 用定义好的函数
    print(res) # 
    
3.reduce
	 # reduce  传多个值 返回一个值
    from functools import reduce  # reduce函数原本在python2中也是个内置函数,不过在python3中被移到functools模块中
    l1 = [11, 22, 33, 44, 55, 66, 77, 88]
    res = reduce(lambda a, b: a * b, l1)
    print(res)

作业

'''有下列用户数据
    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:装饰器知识         附赠:实现上述主体功能即可 其他扩展优化功能可暂且不写'''


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']}
    }


is_login = False  # 用户登录状态


def outter(a):
    def outer(func_name):
        def innter(*args, **kwargs):
            global is_login, user_id
            if is_login:  # 判断用户是否已经登陆
                if a in user_data.get(user_id).get('access'):  # 判断用户是否有执行对应函数的权限
                    res = func_name(*args, **kwargs)
                    return res
                else:
                    print(f'该用户没有权限执行func{a}')
                    return
            user_id = input('请输入用户编号').strip() # 获取用户编号
            if user_id.isdigit():
                username = input('username:').strip()
                password = input('password:').strip()
                if username == user_data.get(user_id).get('name') and password == user_data.get(user_id).get('pwd'):   # 从用户字典里面取用户名和密码并判断
                    is_login = True
                    if a in user_data.get(user_id).get('access'):  # 判断用户是否有执行对应函数的权限
                        res = func_name(*args, **kwargs)
                        return res
                    else:
                        print(f'该用户没有权限执行func{a}')
                        return
                else:
                    print('账号或密码错误')
                    return
            else:
                print('请输入数字')
        return innter
    return outer


@outter('1')
def func1():
    print('from func1')


@outter('2')
def func2():
    print('from func2')


@outter('3')
def func3():
    print('from func3')


def start():
    while True:
        print('''
        1.执行func1
        2.执行func2
        3.执行func3
        4.退出
        ''')
        func_id = input('请输入要执行对应func的编号:').strip()
        if func_id == '1':
            func1()
        elif func_id == '2':
            func2()
        elif func_id == '3':
            func3()
        elif func_id == '4':
            break
        else:
            print('没有哦')


if __name__ == '__main__':
    start()

posted @ 2022-10-13 20:19  LZJJJ  阅读(33)  评论(0)    收藏  举报