今日内容概要
- 算法简介以及二分法
- 三元表达式
- 各种生成式
- 匿名函数
- 常见内置函数
- 练习题及答案
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('暂无此功能,请重新输入已有功能编号!!')