image

一、递归函数

  • 函数不仅可以嵌套定义,还可以嵌套调用,既在调用一个函数的过程中,函数内部又调用另一个函数,而函数的递归调用指的是在调用一个函数的过程中又直接或间接地调用该函数本身

1、在调用f1的过程中,又调用f1,这就是直接调用函数f1本身

# 函数递归死循环 默认是1000 也有可能是998 ....
def f1():
    print('from f1')
    f1()
f1()

2、在调用f1的过程中,又调用f2,而在调用f2的过程中又调用f1,这就是间接用函数f1本身

def f1():
    print('from f1')
    f2()
 
def f2():
    print('from f2')
    f1()
 
f1()
  • 两种情况下的递归调用都是一个无限循环的过程,但在pytho对函数的递归调用的深度做了限制,因而并不会像大家所想的那样进入无限循环,会抛出异常,要避免出现这种情况,就必须让递归调用在满足某个特定条件下终止

"""
递归:函数在运行过程中 直接或者间接的调用了自身
"""

# 官网表示:python默认的最大递归深度为1000次
# import sys
# print(sys.getrecursionlimit())
# print(sys.setrecursionlimit(2000))
count = 1
def index():
    global count
    count += 1
    print(count)
    print('from index')
    index()
index()

# def func():
#     print('from func')
#     index()
# def index():
#     print('from index')
#     func()
# index()


"""
递归
    1.递推
        一层层往下推导答案(每次递归之后复制度相较于上一次一定要有所下降)
    2.回溯
        依据最后的结论往后推导出最初需要的答案
    递归一定要有结束条件!!!
"""


# 伪代码:可能无法运行 但是可以表述逻辑
# age(5) = age(4) + 2
# age(4) = age(3) + 2
# age(3) = age(2) + 2
# age(2) = age(1) + 2
# age(1) = 18

# def get_age(n):
#     if n == 1:
#         return 18
#     return get_age(n - 1) + 2
# print(get_age(5))


l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,[14,]]]]]]]]]]]]]]
# 打印出列表中每一个元素(列表除外)
# 1.循环该列表 获取列表内每一个元素
# 2.判断该元素是否是数字 如果是数字 则直接打印
# 3.如果是列表 则循环该列表 获取列表内每一个元素
# 4.判断该元素是否是数字 如果是数字 则直接打印
# 5.如果是列表 则循环该列表 获取列表内每一个元素
# 6.判断该元素是否是数字 如果是数字 则直接打印
# 7.如果是列表 则循环该列表 获取列表内每一个元素
def get_num(l):
    for i in l:
        if type(i) is int:
            print(i)
        else:
            # 也是for循环 然后判断
            get_num(i)
get_num(l)

# for i in []:
#     print(i,'懵逼了!')

image

二、算法之二分法

  • 二分法能够使用的场景 数据集必须

# 什么是算法?
	解决问题的高效方法
   
# 二分法(入门级别:还有一定距离)
	l = [11, 23, 43, 57, 68, 76, 81, 99, 123, 321, 432, 567, 666, 712, 899, 999, 1111]
# 第一种方式  直接for循环从左往右依次查找

# 第二种方式  二分法
"""
二分法能够使用的场景  数据集必须有序
"""
def my_partner(target_num, l):  # target_num=321  l=l
    if len(l) == 0:
        print('不好意思 我尽力 没找到')
        return
    # 先获取中间位置索引值
    middle_index = len(l) // 2  # 8
    # 判断中间索引对应的值比目标值大还是小
    if target_num > l[middle_index]:
        # 说明要找的元素只可能出现在列表的右侧
        l_right = l[middle_index + 1:]  # l[9:]
        print(l_right)
        my_partner(target_num, l_right)
    elif target_num < l[middle_index]:
        # 说明要找的元素只可能出现在列表的左侧
        l_left = l[:middle_index]
        print(l_left)
        my_partner(target_num, l_left)
    else:
        print('找到了', target_num)
# my_partner(444, l)  找不到 需要添加结束条件
# my_partner(11, l)  # 要查找的元素在开头  那么还没有依次查找的效率高

三、三元表达式

  • 当功能需求仅仅是二选一的情况下 那么推荐使用三元表达式

# def my_max(a, b):
#     if a > b:
#         return a
#     else:
#         return b
"""
当功能需求仅仅是二选一的情况下 那么推荐使用三元表达式
"""
# def my_max(a, b):
#     return a if a > b else b
"""
条件成立采用if前面的值 if 条件 else 条件不成立采用else后面的值
三元表达式尽量不要嵌套使用
"""
# res = '干饭' if 10 > 2 else '不干饭'
# print(res)
# res = '干饭' if 10 > 2 else ('不管饭' if 2 >5 else '写的啥!')
# print(res)


# is_free = input('电影是否收费(y/n)>>>:').strip()
# if is_free == 'y':
#     print('收费')
# else:
#     print('免费')
# print('收费' if is_free == 'y' else '免费')
username = input('username>>>:')
res = 'NB' if username == 'jason' else 'SB'
print(res)

image

四、匿名函数

  • 匿名函数一般不会单独使用 都是配合其他函数一起使用

# 匿名函数:没有名字的函数
"""
语法格式
    lambda 形参:返回值
"""
# print(lambda x:x**2)
# def index():
#     pass
# print(index)
# print((lambda x: x ** 2)(2))
# res = lambda x: x ** 2
# print(res(2))

'''匿名函数一般不会单独使用 都是配合其他函数一起使用'''
# map()  映射
# l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# def index(n):
#     return n ** 2
# print(list(map(lambda x:x**2, l)))

五、列表生成式(了解)

name_list = ['jason', 'kevin', 'tony', 'jerry']
# 给列表中所有的人名加上_DSB后缀
'''传统做法'''
# 1.定义一个空列表
# new_list = []
# 2.for循环老列表
# for name in name_list:
# 3.生成新的名字
# new_name = '%s_DSB'%name
# 4.添加到新的列表中
# new_list.append(new_name)
# print(new_list)
'''列表生成式'''
# res = ['%s_DSB' % name for name in name_list]
# print(res)


'''传统做法'''
# 1.定义一个空列表
# new_list = []
# # 2.for循环老列表
# for name in name_list:
#     # 3.生成新的名字
#     if name == 'jason':
#         continue
#     else:
#         new_name = '%s_DSB'%name
#         # 4.添加到新的列表中
#         new_list.append(new_name)
# print(new_list)
'''列表生成式'''
# res = ['%s_DSB' % name for name in name_list if name != 'jason']
# print(res)

六、字典生成式(了解)

# l1 = ['name', 'age', 'hobby']
# l2 = ['jason', 18, 'read']
# new_dict = {}
# for i in range(len(l1)):
#     new_dict[l1[i]] = l2[i]
# print(new_dict)

# count = 0
# for i in l1:
#     print(count,i)
#     count += 1

# 枚举
'''
enumerate(l1)
    针对该方法使用for循环取值 每次会产生两个结果
        第一个是从0开始的数字
        第二个是被循环对象里面的元素
    还可以通过start参数控制起始位置
'''
# for i, j in enumerate(l1, start=1):
#     print(i, j)


name_list = ['jason', 'kevin', 'tony', 'jerry']
# res = {i: j for i, j in enumerate(name_list) if j != 'jason'}
# print(res)

# res1 = {i for i,j in enumerate(name_list)}
# print(res1,type(res1))


# 迭代器
res2 = (i for i,j in enumerate(name_list))
print(res2)

image

posted on 2021-11-18 20:07  耿蜀黍  阅读(65)  评论(0编辑  收藏  举报