• 12-递归、三元表达式、列表生成式、字典生成式、匿名函数


    递归

    1 什么是函数递归
    函数的递归调用是函数嵌套调用的一种特殊形式,在调用一个函数的过程中又直接或者间接地调用该函数
    本身,称之为函数的递归调用

    递归调用必须有两个明确的阶段:
    1. 回溯: 一次次递归调用下去,说白了就一个重复的过程,但需要注意的是每一次重复问题的规模都应该有所减少,直到逼近一个最终的结果,即回溯阶段一定要有一个明确的结束条件
    2. 递推: 往回一层一层推算出结果

    递归的应用
    import sys
    # print(sys.getrecursionlimit())
    # sys.setrecursionlimit(2000)

    # def foo(n):
    # print('from foo',n)
    # foo(n+1)
    #
    # foo(0)


    # def bar():
    # print('from bar')
    # foo()
    #
    # def foo():
    # print('from foo')
    # bar()
    #
    # foo()

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

    # 递归调用就是一个重复的过程,但是每一次重复问题的规模都应该有所减少,并且应该在满足某种条件的情况下结束重复,开始进入递推阶段

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


    l=[1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,]]]]]]]]]]]

    for item in l:
    if type(item) is not list:
    print(item)
    else:
    for i in item:
    print(i)

    三元表达式

    def max2(x, y):
    # if x > y:
    # return x
    # else:
    # return y
    return x if x > y else y
    # 三元表达式实现的效果就是:条件成立的情况下返回一个值,不成立的情况下返回另外一种值

    # res=条件成立情况下返回的值 if 条件 else 条件不成立情况下返回的值
    name=input('your name: ').strip()
    res="SB" if name == 'lqz' else "NB"
    print(res)

    列表生成式与字典生成式
    # names=['alex','lqz','yyh','fm']
    # l=[]
    # for name in names:
    # res=name + '_DSB'
    # l.append(res)
    # print(l)

    # l=[name + '_DSB' for name in names]
    # print(l)

    names=['alex_sb','lqz_sb','yyh_sb','fm_sb','egon']
    # l=[]
    # for name in names:
    # if name.endswith('sb'):
    # l.append(name)
    # print(l)

    # l=[name for name in names if name.endswith('sb')]
    # print(l)

    # items=[
    # ('name','egon'),
    # ('age',18),
    # ('sex','male'),
    # ]
    # dic=dict(items)
    # print(dic)


    # 补充
    # l=['a','b','c','d']
    # for i,v in enumerate(l):
    # print(i,v)

    keys=['name','age','sex']
    vals=['egon',18,'male']
    dic={}
    for i,k in enumerate(keys):
    # print(i,k)
    dic[k]=vals[i]
    print(dic)

    dic={k:vals[i] for i,k in enumerate(keys)}
    print(dic)

    dic={k:vals[i] for i,k in enumerate(keys) if i > 0}
    print(dic)


    # print({i:i for i in range(10)})
    # print({i for i in range(10)})
    print({i for i in 'hello'})
     
    匿名函数

    1 匿名函数:就是没有名字的函数

    2 为何要用:
    用于仅仅临时使用一次的场景,没有重复使用的需求



    def sum2(x,y):
    return x+y

    # print(lambda x,y:x+y)
    # print((lambda x,y:x+y)(1,2))

    # 匿名函数的精髓就是没有名字,为其绑定名字是没有意义的
    # f=lambda x,y:x+y
    # print(f)
    # print(f(1,2))

    # 匿名函数与内置函数结合使用
    # max,min,sorted,map,filter,reduce


    salaries={
    'egon':300000,
    'alex':100000000,
    'wupeiqi':10000,
    'yuanhao':2000
    }
    # 求薪资最高的那个人名:即比较的是value,但取结果是key
    # res=max(salaries)
    # print(res)

    # 可以通过max函数的key参数来改变max函数的比较依据,运行原理:
    # max函数会“for循环”出一个值,然后将该值传给key指定的函数
    # 调用key指定的函数,将拿到的返回值当作比较依据

    # def func(name):
    # # 返回一个人的薪资
    # return salaries[name]
    #
    # res=max(salaries,key=func) #'egon'
    # print(res)

    # 求最大值
    # res=max(salaries,key=lambda name:salaries[name]) #'egon'
    # print(res)

    # 求最小值
    # res=min(salaries,key=lambda name:salaries[name]) #'egon'
    # print(res)


    # sorted排序
    # nums=[11,33,22,9,31]
    # res=sorted(nums,reverse=True)
    # print(nums)
    # print(res)
    # salaries={
    # 'egon':300000,
    # 'alex':100000000,
    # 'wupeiqi':10000,
    # 'yuanhao':2000
    # }
    # for v in salaries.values():
    # print(v)
    # res=sorted(salaries.values())
    # print(res)

    # res=sorted(salaries,key=lambda name:salaries[name],reverse=True)
    # print(res)


    # map:把一个列表按照我们自定义的映射规则映射成一个新的列表
    # names=['alex','lxx','wxx','yxx']
    # res=map(lambda name: name + "dSB", names)
    # print(list(res))

    # filter: 从一个列表中过滤出符合我们过滤规则的值
    # 运行原理:相当于for循环取出每一个人名,然后传给匿名函数,将调用匿名函数返回值为True的那个人名给留下来
    # names=['alex_sb','lxx_sb','wxx_sb','egon','yxx']

    # res=filter(lambda name:name.endswith('sb'),names)
    # print(list(res))

    # print([name for name in names if name.endswith('sb')])

    # reduce: 把多个值合并成一个结果
    from functools import reduce
    l=['a','b','c','d']

    # res=reduce(lambda x,y:x+y,l,'A')
    #'A','a' => 'Aa'
    #'Aa','b'=>'Aab'
    #'Aab','c'=>'Aabc'
    #'Aabc','d'=>'Aabcd'
    # print(res)


    # res=reduce(lambda x,y:x+y,l)
    #'a','b'=>'ab'
    # print(res)

    # res=reduce(lambda x,y:x+y,range(1,101))
    #1,2=>3
    #3,3=>6
    # print(res)
  • 相关阅读:
    条件语句的用法
    PHP取得当前文档所在的目录
    郁闷,一个语句调试很久
    PHP图片上传加水印(转)
    PHP多行多列分页
    ASP得到当前文件所在目录
    “树人杯”暨第三届辽宁科技大学校园程序设计竞赛正赛D IP检测(绿)
    “树人杯”暨第三届辽宁科技大学校园程序设计竞赛正赛E 成绩统计图(红)
    [面试备] 暴搜 or 二分图的经典升级 : hdu 1045 Fire Net 示例 [ 讲解之用 ]
    《C++ Primer》 第04章 [ 数组和指针 ]
  • 原文地址:https://www.cnblogs.com/yuanxiaohui/p/10280358.html
Copyright © 2020-2023  润新知