day16

发布时间 2023-12-19 17:35:27作者: 王苗鲁

1.三元表达式

# 针对以下需求
def func(x, y):
    if x > y:
        return x
    else:
        return y


res = func(1, 2)
print(res)

# 三元表达式,可以用一行代码搞定上述代码
# 语法格式:条件成立时要返回的值 if 条件 else 条件不成立时要返回的值
x = 1
y = 2
res = x if x > y else y
print(res)

2.列表生成式

# 列表生成式
l = ['alex_dsb', 'egon_dsb', 'wxx_dsb', 'wangmiaolu']
new_l = []
for name in l:
    if name.endswith('dsb'):
        new_l.append(name)

new_l = [name for name in l if name.endswith('dsb')]
# new_l=[name for name in l ]
print(new_l)

3.列表生成式案例

# 案例1:
# 把所有的小写字母全变成大写
new_l = [name.upper() for name in l]
print(new_l)

# 把所有的名字去掉后缀 dsb
new_l = [name.replace('_dsb', '') for name in l]
print(new_l)


# 案例2:
l=[]
for i in range(100):
    l.append('egg%s' %i)
print(l)

l=['egg%s' %i for i in range(100)]
l=['egg%s' %i for i in range(1000) if i > 10]
print(l)

4.其他生成式

# 2.字典生成式
keys = ['name', 'age', 'gender']
dic = {key: None for key in keys}
print(dic)

items = [('name', 'egon'), ('age', 18), ('gender', 'male')]
res = {k: v for k, v in items if k != 'gender'}
print(res)

# 3.集合生成式
keys = ['name', 'age', 'gender']
set1 = {key for key in keys}
print(set1, type(set1))

# 4.生成器表达式
g = (i for i in range(10) if i > 3)
# !!!!!!!强调!!!!!!!
# 此刻g内部一个值也没有

print(g, type(g))
print(next(g))

with open('笔记.txt', mode='rt', encoding='utf-8') as f:
    # # 方式一:
    # res = 0
    # for line in f:
    #     res += len(line)
    # print(res)

    # # 方式二:
    # size_of_line = [len(line) for line in f]
    # res = sum(size_of_line)
    # print(res)

    # 方式三:效率更高
    # res = sum((len(line) for line in f))
    # 上述可以简写为如下形式
    res = sum(len(line) for line in f)
    print(res)

5.函数递归介绍

import sys

# 默认递归最大为1000层
res1 = sys.getrecursionlimit()
print(res1)
# 默认可以改为2000层
res2 = sys.setrecursionlimit(2000)

# 一:递归的定义
# 函数的递归调用:是函数嵌套调用的一种特殊形式
# 具体是指:
#         在调用一个函数的过程中又直接或者间接地调用到本身
#
# 直接调用本身
def f1():
    print('是我是我还是我')
    f1()

f1()


# 间接调用本身
def f1():
    print('=======>f1')
    f2()

def f2():
    print('=======>f2')
    f1()

f1()

# 一段代码的循环运行的方案有两种
# 方式一:while、for循环
while True:
    print(1111)
    print(2222)
    print(3333)

# 方式二:递归的本质就是循环
def f1():
    print(11111)
    print(22222)
    print(33333)
f1()

# 二:需要强调的一点是:
# 递归调用buyiu不应该无限地调用下去,必须在某种条件下结束递归调用
n = 0
while n < 10:
    print(n)
    n += 1

def f1(n):
    if n == 0:
        return
    print(n)
    n += 1
    f1(n)

f1(0)

6.递归调用的两个阶段

# 三:递归的两个阶段
# 回溯:一层一层调用下去
# 递推:满足某种结束条件,结束递归调用,然后一层一层返回

# age(5)=age(4)+2
# age(4)=age(3)+2
# age(3)=age(2)+2
# age(2)=age(1)+2
# age(1)=18

def age(n):
    if n == 1:
        return 18
    return age(n - 1) + 2


res = age(1)
print(res)

7.函数递归调用案例

# 四:递归的应用
l = [1, 2, [3, [4, [5, [6, [7, [8, [9, 10, 11, [12, [13]]]]]]]]]]


def f1(list1):
    for x in list1:
        if type(x) is list:
            # 如果是列表,应该再循环、再判断,即重新运行本身代码
            f1(x)
        else:
            print(x)


f1(l)

8.算法简介及二分法

算法简介

1.什么是算法
	算法就是解决问题的有效方法 不是所有的算法都很高效也有不合格的算法
2.算法应用场景
	推荐算法(抖音视频推送 淘宝商品推送)
	成像算法(AI相关)......
 	几乎涵盖了我们日常生活中的方方面面
3.算法工程师要求
	待遇非常好 但是要求也非常高
4.算法部门
	不是所有的互联网公司都养得起算法部分 只有大型互联网公司才有
	算法部门类似于药品研发部分
5.二分法
	是算法中最简单的算法 甚至都称不上是算法

二分法

"""
二分法使用要求
    待查找的数据集必须有序
二分法的缺陷
    针对开头结尾的数据 查找效率很低
常见算法的原理以及伪代码
    二分法、冒泡、快拍、插入、堆排、桶排、数据结构(链表 约瑟夫问题 如何链表是否成环)
"""
# 算法:是高效解决问题的办法
# 算法之二分法

# 需求:有一个按照从小到大顺序排列的数字列表
#      需要从该数字列表中找到我们想要的那个数字
#      如何做更高效???

nums = [-3, 4, 7, 10, 13, 21, 43, 55, 66, 77]
find_num = 10

# 方案一:整体遍历效率太低
for num in nums:
    if num == find_num:
        print('find it')
        break

# 方案二:二分法伪代码
"""
def binary_search():
    mid_val=找列表中间的值
    if find_num>mid_val:
        # 接下来的查找应该是在列表的右半部分
        列表=列表切片右半部分
        binary_search(find_num,列表)
    elif find_num<mid_val:
        # 接下来的查找应该是在列表的左半部分
        列表=列表切片再左半部分
        binary_search(find_num,列表)
    else:
        print('find it')
"""

二分法的具体实现

nums = [3, 5, 7, 11, 13, 23, 24, 76, 103, 111, 201, 202, 250, 303, 341]

def binary_search(list1, find_num):
    print(list1)
    if len(list1) == 0:
        print('not exist')
        return
    mid_index = len(list1) // 2
    if find_num > list1[mid_index]:
        print('in the right')
        binary_search(list1[mid_index + 1:], find_num)
    elif find_num < list1[mid_index]:
        print('in the left')
        binary_search(list1[:mid_index], find_num)
    else:
        print('find it')

binary_search(nums, 111)