三元表达式与各种生成式与二分算法

398 阅读4分钟

三元表达式

需求:获取用户输入用户名,如果是jason就欢迎,其他就滚蛋。
如果用我们以前的知识写:
username = input('请输入用户名')
if username == 'jason':
    print('欢迎')
else:
    print('滚蛋')
非常简单的功能却需要四行代码,那么有没有更简单的方法呢?有,--------三元表达式。
需求:编写一个函数,比较两个数的大小,返回大的那个
def my_max(a,b):
    if a > b: print(a)
    else: print(b)
my_max(11,22)

用三元表达式可以表示为:
def my_max(a,b):
    return a if a > b else b  # 一行代码,灰常耗用
三元表达式的语法结构:
	'值1 if 条件 else 值b''如果if后的条件成立返回值1,不成立则返回值2'
三元表达式可以为我们省去大量的简单代码,属于是一种偷懒的写法。功能非常简单,使用条件也很利落:'仅适用于二选一的情况,且不建议嵌套使用'。
为什么不建议嵌套使用?请看例子:
	res = 123 if 10 > 5 else (222 if 0 else (555 if 1 == 2 else 666))  # 123
虽然多层表达式嵌套可以为我们省去了非常多的代码,但我们一眼望过去根本不知道它要表达的是什么,逻辑十分混乱,可读性极差。所以'python中代码不是精简的越少越好 在精简的过程中还要保证代码的可读性'

各种生成式

1;列表生成式
name_list = ['jason', 'kevin', 'oscar', 'jerry', 'tony']
需求:给上述列表的每个名字后面都添加'_DSB'的后缀
方法1for循环
    new_list = []
    for name in name_list:
        new_name = name + '_DSB'
        new_list.append(new_name)
    print(new_list)  # 虽然能完成任务 但是同样是简单的功能用了四行代码
方法2:列表生成式
	new_list = [name+'_DSB' for name in name_list] # 一行代码,灰常耗用
    语法结构:'[操作 for 变量名 in 可迭代对象 if 判断条件]'
    原理:'先执行for循环,然后将遍历出来的一个个的数据值交给for前面的代码处理'由于是列表生成式,所以记得在两边加[]。
此外,列表生成式还支持if判断。
需求:给除jason外的其他名字加上'_DSB'的后缀
    new_list = [name + '_DSB' for name in name_list if name != 'jason']
    原理:'先执行for循环,然后将遍历出来的一个个的数据值交给if后面的条件代码处理。最后将结果为True的值交给for前的代码'同样不要忘记加[]
    列表生成式中只能出现forif,不能出现 whileelse2.字典生成式
需求:将各个人名和对应的索引对应起来
    new_dict = {name_list.index(name) :name for name in name_list}
    print(new_dict)  # {0: 'jason', 1: 'kevin', 2: 'oscar', 3: 'jerry', 4: 'tony'}
语法结构:'key部分正常写,value部分语法跟列表生成式一样,后面同样可以跟if语句。外面加{}'

3.集合生成式
需求:将列表转成集合
	new_set = {name for name in name_list if name != 'jason'}
   语法结构同列表生成式一样,将[]换为{}即可

二分算法

  每次取中间值与目标值作比对,直接减少一半的比对选手,灰常耗用。
  但如果目标值在两端,效率就不如for循环了。而且要求数据值必须是有序的。限制太多

l1 = []
for i in range(500):
    l1.append(i)
print(l1)

def get_num(l1, target_num):
    # 添加递归函数的结束条件
    if len(l1) == 0:
        print('不好意思 找不到')
        return
    # 1.先获取数据集中间那个数
    middle_index = len(l1) // 2
    middle_value = l1[middle_index]
    # 2.判断中间的数据值与目标数据值孰大孰小
    if target_num > middle_value:
        # 3.说明要查找的数在数据集右半边  如何截取右半边
        right_l1 = l1[middle_index + 1:]
        # 3.1.获取右半边中间那个数
        # 3.2.与目标数据值对比
        # 3.3.根据大小切割数据集
        # 经过分析得知 应该使用递归函数
        print(right_l1)
        get_num(right_l1, target_num)
    elif target_num < middle_value:
        # 4.说明要查找的数在数据集左半边  如何截取左半边
        left_l1 = l1[:middle_index]
        # 4.1.获取左半边中间那个数
        # 4.2.与目标数据值对比
        # 4.3.根据大小切割数据集
        # 经过分析得知 应该使用递归函数
        print(left_l1)
        get_num(left_l1, target_num)
    else:
        print('找到了', target_num)
get_num(l1, 444)