递归 三元表达式 列表字典生成式 匿名函数 常用内置函数

递归

递归就是按照一系列相同的步骤做一件事  例如询问年龄,问 a 年龄  a 说 a比b大2岁 这样一说当然会去问b,b也说  b比c大2岁以此类推c,d都说比后面的大2岁,直到问道了e,e说他20,那么按照刚才的推理过程在返回去,自然能退出a是28岁

这个过程就是一个很明显的递归过程,其中,询问年龄的过程就是回溯,得到e结果之后的推算a的过程就是递推

  回溯:一次次的冲福某一个同样的动作,这个重复的动作必须的是一样的,类似刚才的都大2岁

  递推:一次次的反推的过程

def my_age(n):
    if n == 1:         
        return 30
    return my_age(n-1)+2
print(my_age(5))  38 

n等于1 就是相当于 问到e同学是30岁    之后一步步回推   递加2  递加4次则得出 第五次是38

l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,]]]]]]]]]]]]]
#  将列表中的数字依次打印出来(循环的层数是你必须要考虑的点)
for i in l:  推导思路
    if type(i) is int:
        print(i)
    else:
        for item in i:
            if type(item) is int:
                print(item)
            else:
                for j in item:
                    if type(item) is int:
                        print(item)
                    else:
                        ...  # 相当于pass  不报错   顶包  推荐使用pass


这样子做的弊端就是要取出多少数据,就要重复多少次,这样首先造成了代码的冗余,其次就是太low
l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,]]]]]]]]]]]]]
def get_num(l):
    for i in l:
        if type(i) is int:
            print(i)
        else:
            get_num(i)
get_num(l)
l1 = []
for i in l1:
    print(i)
递归

算法:二分法

算法:可以高效的解决问题     注意   二分法容器类型必须是有大小顺序的   如原来列表是无序的那么要先排序

l = [1,3,5,12,57,89,101,123,146,167,179,189,345]
target_num = 666
def get_num(l,target_num):
    if not l:
        print('你给的工资 这个任务怕是没法做')
        return
    # 获取列表中间的索引
    print(l)
    middle_index = len(l) // 2
    # 判断target_num跟middle_index对应的数字的大小
    if target_num > l[middle_index]:
        # 切取列表右半部分
        num_right = l[middle_index + 1:]
        # 再递归调用get_num函数
        get_num(num_right,target_num)
    elif target_num < l[middle_index]:
        # 切取列表左半部分
        num_left = l[0:middle_index]
        # 再递归调用get_num函数
        get_num(num_left, target_num)
    else:
        print('find it',target_num)

get_num(l,target_num)
View Code

三元表达式

if的另外一种形式 (一行实现if代码)

应用场景:只有两种结果的情况  不支持嵌套  就是当值1成立 的时候就执行条件1 否则就是执行值2 
写法              值1 if条件 else 值2 

条件成立走1   不成立走2

lis = ['林xx','苏xx']
print(lis,'可以是其他任何名字')
name = input('输入一个名字>>>:')
res = '长得丑' if name in lis else '长得帅'
print(res)

列表生成式

先for循环以依次取出列表内部的元素
进行if判断 条件成立将结果交给for之前的代码,条件不成立 当前元素 直接不要了

写法    变量名 for 变量名 in 列表名 if 变量名 判断条件    后面不支持加else

如果上述结果需要输出就整体附一个变量名打印一下

l = ['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb','jason_NB']
res = [name for name in l if name.endswith('_NB')]
print(res)  # ['jason_NB']

字典生成式

l1 = ['jason','123','read']
d = {i:j for i,j in enumerate(l1) if j != '123'}    
print(d)

与列表不同的是
  括号的使用是{}
  for之前的是键值对形式 原理都是先for循环取值 在根据条件将值交给for之前的

匿名函数

正如这个函数的名字一样,他是一个没有名字的函数     还有就是他使用了马上就没了    只有用的时候才存在

写法    (lambda 值1,值2:值1 条件 值2)(参数1,参数2)          附一个变量名打印 

两个数相加

res = (lambda x,y:x+y)(1,2) print(res) func = lambda x,y:x+y print(func(1,2))

# 冒号  左边的相当于函数的形参
# 冒号  右边的相当于函数的返回值
# 匿名函数通常不会单独使用,是配合内置函数一起使用

dic = {
'eee':10000,
'jasom':1000,
'nice':100,
'tura':10
}
# 比较 他们的value  取出他们的key值
print(max(dic,key=lambda name:dic.get(name))) # eee

print(min(dic,key=lambda name:dic.get(name))) # tura

常用内置函数

内置函数,就是pycharm已经包装好的函数,当python解释器打开的时候就可以直接调用了

常用的几个内置函数 map  zip  filter sortted  reduce

map  映射    列表内每一个元素都发生变化   基于for循环     先将每一个元素遍历出来

l = [1,2,3,4,5,6]
# print(list('hello'))
print(list(map(lambda x:x+5,l)))  # 将每个元素+6

zip  拉链    列表

l1 = [1,2,]
l2 = ['jason','egon','tank']
l3 = ['a','b','c']
print(list(zip(l1,l2,l3)))  # [(1, 'jason', 'a'), (2, 'egon', 'b')]

将三个列表的值以元组的形式按照所用放在一起    但是发现l1中只有两个元素
所以他会将三个列表中都有对应值的组合在一起   没有的直接不要了

filter

l = [1,2,3,4,5,6]
print(list(filter(lambda x:x != 3,l)))  # [1, 2, 4, 5, 6]

首先是基于for循环的    将等于3 的那个元素剔除

sorted  排序

l = ['jason','egon','nick','tank']
print(sorted(l,reverse=True))  # ['tank', 'nick', 'jason', 'egon']


默认是升序    当reverse=Ture是  改为降序

reduce   

# 当初始值不存在的情况下 按照下面的规律
# 第一次先获取两个元素 相加
# 之后每次获取一个与上一次相加的结果再相加

from functools import reduce
l = [1,2,3,4,5,6]
print(reduce(lambda x,y:x+y,l,19))  # 19初始值  第一个参数
原文地址:https://www.cnblogs.com/xuzhaolong/p/11177420.html