算法及二分法/常用内置函数/匿名函数/生成式/表达式

今日内容概要

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

1.算法简介及二分法:

1.什么是算法
	算法就是解决问题的有效方法 不是所有的算法都很高效 也有不合格的算法
2.算法的应用场景
	推荐算法(抖音视频推送,购物网站商品推送)
    Ai算法
# 我们今天介绍一下算法:
二分法:
	'''
	二分法的使用要求:
		待查找的数据集必须有序
	二分法的缺陷:
		针对开头结尾的数据,查找效率很低
	常见算法一般有:
		二分法、冒泡、快拍、插入、堆排、铜排、数据结构(链表 约瑟夫问题 如何链表是否成环等等)
	'''
    二分法主要是用于查找数据的
	l1 = [1,2,3,4,5,6,7,8,23,554,776,88999,6766666]
    # 我们先建立一个列表,我们如果想查找这个列表中的某个数据值
    # 方式1:for 循环
    # 方式2:二分法
    二分法就是把这个列表从中间分开并进行判断,中间位置的数据值与需要查找的数据值进行比较
    如果比需要查找的数据值大那么就往左边继续分开
    如果比需要查找的数据值小那么就往右边继续分开
    一直重复,这样最后就可以得到我们想要的数据值了
    
    代码实现:
    # 我们先定义一个数据值 data = 88999
    l1 = [1, 2, 3, 4, 5, 6, 7, 8, 23, 554, 776, 88999, 6766666]
data = 88999
# 1.for循环找
for i in l1:  # 遍历l1 中的数据
    if i == 88999:  # 如果 i == 数据值 
        print(l1.index(i)) # 获取它的索引
print(l1[11])  # 打印

# 2.二分法找

def get_num(l1,data):  # 定义函数()内形参传 列表以及需要查找的数据值
    if len(l1) == 0:  # 递归函数需要有结束条件!!!
        print('sorry没找到')
    middle_index = len(l1) // 2  # 获取列表中间数据值的索引
    if data > l1[middle_index]:  # 判断需要找的数据值是否大于容器中间的数据值
        right_list = l1[middle_index + 1:] # 条件成立则取右边部分的列表
        print(right_list)  
        return get_num(right_list,data)  # 返回此函数并且形参()填写新获取的列表
    elif data < l1[middle_index]:
        left_list = l1[:middle_index]
        print(left_list)
        return get_num(left_list, data)
    else:
        print('找到了!')

get_num(l1,data)  # 调用函数,参传存储数据值的容器以及需要查找的数据值 

2.三元表达式

三元表达式主要是为了简化代码
当我们代码很简单,并且只有一行,那么我们可以通过三元表达式做优化
我们看一个例子
我们先正常的编写代码:
age = 18
if age <= 18:
    print('真年轻')
else:
    print('额,这')
# 我们在通过三元表达式写一下这个代码
age = 18  # 定义年龄
con = '真年轻' if age <= 18 else '额,这'  # 条件成立执行con 条件不成立执行else后面的数据值
print(con)  # 打印con获取结果  真年轻

通过这个例子,我们知道了三元表达式的基本语法结构
它就是由
# 数据值1 + if 条件 + else + 数据值2
如果条件成立使用数据值1
如果不成立使用数据值2
# 我们在编写代码时,三元表达式主要用在2选1的情况下。
# 不推荐三元表达式嵌套使用

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

列表生成式:
[表达式 for 变量 in 列表] 
tec_staff = ['小明','小白','小王','小李','小花']
这是某公司科技部门的员工名单,我们现在有一个需求
把这个名单内所有人的名字后缀加上_tec
1.我们可以使用for 循环
l2 = []
for i in tec_staff:
    l2.append(i+'_tec')
print(l2)
2.我们可以使用列表生成式
l2 = [i + '_tec' for i in tec_staff]
print(l2)
这样我们就可以用两行代码完成这个需求了,对比for循环的代码更加的精简
# 列表生成式内先看for循环 每次for循环之后再看for关键字前面的操作
# 一定要注意它们的顺序
我们在来看看它的复杂变化:
[表达式 for 变量 in 列表 if 条件]
l2 = [i + '_tec' for i in tec_staff if i == '小王']
# 当循环到i时 如果 i == '小王' 执行for关键字之前的内容,如果不成立就什么都不做
l2 = ['大佬' if i == '小白' else '菜鸟' for i in tec_staff if i != '小王']
# 我们这次首先应该看左边,先做完这个判断,然后看最右侧的条件,最后遍历,根据两个条件得出结果


字典生成式:
我们首先先了解一个内置函数
它主要的作用是
遍历可迭代的对象
enumerate()  # 括号内需要填写可迭代对象,还有数字,数字代表从几开始,默认是从零开始
例:
s = [1, 2, 3, 4, 5]
e = enumerate(s)
for index, value in e:
    print('%s, %s' % (index, value))
输出结果:
0, 1
1, 2
2, 3
3, 4
4, 5

例2:
s1 = 'woshidalao'
for k in enumerate(s1):
    print(k)  # enumerate会产生一个元组,用从零开始的数字与遍历的数据值进行拼接
(0, 'w')
(1, 'o')
(2, 's')
(3, 'h')
(4, 'i')
(5, 'd')
(6, 'a')
(7, 'l')
(8, 'a')
(9, 'o')
字典生成式的格式为:
{key:value for key in 字典}   # {key:value for key in 字典 if 条件}
s1 = 'woshidalao'
new_s1 = {k:len(k) for k in s1}
print(new_s1)  # {'w': 1, 'o': 1, 's': 1, 'h': 1, 'i': 1, 'd': 1, 'a': 1, 'l': 1}


集合生成式:
{表达式 for i in 容器}
s1 = 'woshidalao'
new_set1 = {i for i in s1}
print(new_set1)  # {'l', 'a', 'i', 'o', 'd', 's', 'h', 'w'}  因为列表是无序的,并且去重

同样集合表达式也可以再后面加if判断条件


元组生成式:
# 元组生成式>>>:没有元组生成式 下列的结果是生成器
res = (i+'66' for i in 'hello')
print(res) # 得到的是一个生成器 我们需要取它的结果就需要对它进行for循环取值
for i in res:  
    print(i)  
得到结果为:
h66
e66
l66
l66
o66

4.匿名函数

匿名函数 lambda
lambda 形参 :返回值
它的使用一般都是配合其他函数使用:
lambda a,b:a+b

其实lambda 就是一个很简单的函数
def lam(x):
    return x + x
用匿名函数有个好处,因为函数没有名字,不必担心函数名冲突。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数:
def lam(x):  #  定义一个函数lam 需要传参数
    return x + x  # 返回传来的参数再加上参数
f = lam # 函数名赋值给变量名
print(f(55)) # 打印调用此函数的返回值  110

5.常见内置函数/内置函数

1.map()  # 映射
map 函数它的形参会接收两个参数,一个是函数,一个是可迭代对象
首先 map 方法会将函数依次作用再可迭代对象的每一个元素,并得到新的可迭代对象返回
我们举个例子:
res = map(lambda x:x + x,[1,2,3,4,5,6,7])  # 执行顺序就是再列表中的每一个元素都进入匿名函数lambda里面进行处理,最后汇总成一个新的列表作为返回值返回出来
print(res)  # 我们打印接收它的变量名res <map object at 0x0000017F17B56B20>
print(list(res))  # [2, 4, 6, 8, 10, 12, 14]

这就是我们匿名函数搭配使用的一种方法
2. reduce()  #
	# reduce 方法是需要接收两个参数 一个是函数一个是序列,跟map方法相似,但是它是将每次的处理结果做累积处理,最后返回一个处理后的结果
from functools import reduce
l1 = [11, 22, 33, 44, 55, 66, 77, 88, 99]
res = reduce(lambda a, b: a + b, l1)
print(res)  # 495
3.max()/min()
	# max函数和min函数一样 它们都可以接收多个参数,并从中返回数值最大的或最小的
l1 = [1,2,3,4,5,6,7]
print(max(l1))  # 7
print(min(l1))  # 1 

a = 'woshidalao'  # 字符串它判断它的大小就是判断它的字符编码,我们知道A-Z为65-90 a-z为97-122
print(max(a))
print(min(a))

6.练习题及答案

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.再完善各种需求
'''
solution:1
    
    
    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']}
}


# for i in user_data:
#     print(user_data[i]['access'][2])
#     break
#
# tag_dict = {"user": None, "list": None}
# def outer_plus(function_data):
#     def outer(func):
#             def inner(*args, **kwargs):
#                 if not tag_dict["user"]:
#                     username = input('请输入用户名>>>>>:')
#                     password = input('请输入密码>>>>>:')
#                     for index in user_data:
#                         if user_data[index]['name'] == username and user_data[index]['pwd'] == password:
#                             tag_dict["user"] = username
#                             tag_dict["list"] = user_data[index]['access']
#                             if function_data in user_data[index]['access']:
#                                 res = func(*args, **kwargs)
#                                 return res
#                             # for num in range(0,3):
#                             #     if function_data == user_data[index]['access'][num-1]:
#                             # elif function_data == user_data[index]['access'][index]:
#                             #     res = func(*args, **kwargs)
#                             #     return res
#                             # elif function_data == user_data[index]['access'][index]:
#                             #     res = func(*args, **kwargs)
#                             #     return res
#                             else:
#                                 print('您没有此权限,请重新选择功能')
#                                 # count = 0
#                                 break
#                     else:
#                         print('用户名或密码输入错误,请重新输入!!!')
#
#
#                 else:
#                     if function_data in tag_dict["list"]:
#                         res = func(*args, **kwargs)
#                         return res
#                     else:
#                         print('您没有此层的权限')
#             return inner
#     return outer
#
# @outer_plus('1')
# def func1():
#     print('功能1')
#
# @outer_plus('2')
# def func2():
#     print('功能2')
#
# @outer_plus('3')
# def func3():
#     print('功能3')
#
# function_dict = {'1': func1,
#                  '2': func2,
#                  '3': func3
# }
#
# target = True
#
#
# while target:
#     print('1.功能1\n'
#           '2.功能2\n'
#           '3.功能3\n')
#     choice = input('请输入功能编号>>>>>:')
#     if choice in function_dict:
#         function_dict[choice]()
#     else:
#         print('暂无此功能,请重新输入已有功能编号!!')
posted @ 2022-10-13 19:05  dd随风  阅读(66)  评论(0编辑  收藏  举报