进入python的世界_day14_python基础——算法、三元表达式、生成式、匿名函数

一、算法

1.介绍

​ 算法是通过数学模型运算得到某些数据的过程,在python中通过与代码相结合,可以在特定场景下很方便的解决问题

2.应用场景

​ 很广,大数据推广就是利用算法做的

3.二分法——一个很基础的算法

# 别学我写中文,很Low的,我只是想明了一点,英语太水了
# 比如说我手里一个列表,想找到一个指定的值,就比如说拿888吧
l1 = [1232,564,989,1,53,63,888,6,3,99,153]
目标数据 = 888
# 确实可以用for循环之类的法子,今天我们用二分法试试,就是我先拿一半找,如果没找到,我再拿一半找
————————————————————————————————————
l1.sort()  # 复习一下列表排序内置方法
l2 = l1[1:5] # 复习一下列表切片 切好赋值给一个变量名接收
—————————————————————————————————————
middle_index = len(l1) //2 # 搞到l1表数据位置的一半的那个值的索引值
# 然后就拿这个索引位置的值和目标值比大小呗
# 先加一个结束条件
if len(list_1) == 0:  # l1都被分完了都找不到
        print('不行哦,找不到')
if 目标数据 > l1[middle_index]: # 那前半段列表就可以丢了
    右边_l1 = l1[middle_index + 1 :] # 切片中间下一位置到列表末尾
    return func(右边_l1, 目标数据)    # 然后循环
elif 目标数据 < l1[middle_index]: # 那后半段可以丢了
    左边_l1 = l1[:middle_index + 1]	# 切片开头到中间
    return func(左边_l1, 目标数据)    # 然后循环
else:
    print(f'找到了您要的{}')
————————————————————————————————————
	把上面功能封装成一个函数,以后想完成类似的功能都可以直接用这个函数,传参就行了
def func(l1, 目标数据):
	if len(list_1) == 0:  # l1都被分完了都找不到
        	print('不行哦,找不到')
	if 目标数据 > l1[middle_index]: # 那前半段列表就可以丢了
    	右边_l1 = l1[middle_index + 1 :] # 切片中间下一位置到列表末尾
    	return func(右边_l1, 目标数据)    # 然后循环
	elif 目标数据 < l1[middle_index]: # 那后半段可以丢了
    	左边_l1 = l1[:middle_index + 1]	# 切片开头到中间
    	return func(左边_l1, 目标数据)    # 然后循环
	else:
    	print(f'找到了您要的{}')
func(l1, 888)

二、三元表达式

1.介绍

​ 用于二选一的情况下,简单的判断简单的代码,如果过于复杂不推荐用

尽量别嵌套使用。

2.用法

​ 拿一个变量名接收 条件成立时返回的值 if 条件 else 条件不成立时要返回的值

def func(x, y):
    if x > y:
        return x
    else:
        return y
res = func(666, 999)
print(res) 
>>>
999 
# 这是一个简单的对比函数,一个条件成立输出啥啥啥个条件不成立输出啥啥啥
——————————————————————————————
# 如果用三元

res = x if x > y else y # 这就设定好了,如果要用,在三元上方传参即可
_______________________________
x = 666
y = 999

res = x if x > y else y
print(res)
>>>
999

三、各种生成式

1.列表生成式

​ >>>当你想对列表里面所有数据值操作同样的事可以用, 也可以单独拿一个值,对这个值搞点事情后输出来 ————支持for if range()

​ 新列表 = [想要的功能 for i in 老列表]
新列表 = [想要的功能 for i in 老列表 if 啥啥啥达成]

​ 运行是for循环的代码先执行,然后得到的值和前面功能结合

# 有一个列表,给里面的每个值+1 
name_list = [1,33,44,666,556,245,888]
——————————————————————————————
# 如果用for循环
new_name_list = []
for i in name_list:
    new_name_list.append(i + 1)
print(new_name_list)
——————————————————————————————
# 如果用列表生成式
new_name_list = [i + 1 for i in name_list]
print(new_name_list)
———————————————————————————————
# 如果我想给666+1呢,其他不加
new_name_list = [i + 1 for i in name_list if i == 666]
print(new_name_list)

2.字典生成式

  • 拓展 :enumerate ——一个内置函数

    ​ 将一个可遍历的数据对象(如列表、元组、字典和字符串)组合成一个索引序列,同时列出数据下标和数据(索引 值),一般配合for循环使用。

    ​ 语法:enumerate(对象, 下标起始位置(默认0))

l1 = ['杰克', 28, '泰坦驾驶员']
t = list(enumerate(l1))
print(t)
>>>
[(0, '杰克'), (1, 28), (2, '泰坦驾驶员')]
____________________________________
用字典生成式生成一个字典
dict  = {i:k for i,k in enumerate(l1, 1)}
print(dict)
info = ['name','age','gender']

dic = {key:666 for key in info}
print(dic)

3.集合生成式

info = ['name', 'age', 'city']

set1 = {key for key in info}
print(set1, type(set1))
>>>
{'age', 'city', 'name'} <class 'set'>

4.元组生成式

​ 没有,只有生成器

四、匿名函数

1.介绍

​ 没有名字的函数,关键字lambda

​ 用来顶替掉一些简单的函数(简化代码)

2.用法:

​ lambda 形参:返回值

等价于

def 函数名(参数):
	函数体
    return 返回值

​ 针对能比较简单,又不得不用函数的场景

​ 匿名函数一般不单独使用,需要配合其他函数一起用

五、一些内置函数

1.map()映射

​ 语法:map(想干嘛的函数名, 可迭代对象)

l1 = [11, 22, 33, 44, 55, 66]

res = map(lambda x: x + 100, l1)
print(list(res))
>>>
[111, 122, 133, 144, 155, 166]

2.max min

​ max min可以传入一个函数,并将可迭代对象的每一个元素作为参数传给函数,并对其的函数返回值进行比较

# 	有一个列表  里面有几个人的姓名,年龄,工资,我们想比较这几个人谁工资最高,谁工资最低
l1 = [('jake',20,8000),('nike',18,5000),('ikun',30,15000)]
def func(x):
  return x[2]

print(max(l1,key=func))
>>>
工资最大 ('ikun', 30, 15000)
_______________________________
print(min(l1,key=func))
>>>
('nike', 18, 5000)

3.reduce(已经被python内置函数移除掉了,要进模块才能用)

不管传多个,根据你后面写的功能后 只返一个

reduce默认有一个数据值0

from functools import reduce

l1 = [1, 2, 3, 4, 5, 6, 7]
res = reduce(lambda a, b: a * b, l1)
print(res)
posted @ 2022-10-13 23:15  yiwufish  阅读(306)  评论(0)    收藏  举报