三元表达式,递归,

Posted C3的脚印

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三元表达式,递归,相关的知识,希望对你有一定的参考价值。

三元表达式

三元表达式仅应用于:

1.条件成立返回一个值

2、条件不成立返回一个值。

若一般函数表达如下

比大小:

def max2(x,y):
if x>y: returrn x else: return y res=max2(10,11) print(res)

若我们用三元表达式表达:

def max2(x,y):
    return x if x> y else y
print(max2(10,11)

由此对比 三元表达式

就会比一般函数表达简单 不复杂, 由之前的几行代码 最后3行代码搞定

二、函数的递归:

函数的递归调用,即在函数调用的过程中,又直接或间接的调用了函数的本身

直接调用:
def foo():
    print(from foo)
    foo()
foo()

直接调用
第一层结束foo(). 需要第2层代码块里的foo()结束,而第二层结束又需要冲洗调用foo()。。。。。以此类推 。。  死循环。
这个主要是讲 第一层结束 需要第二层给出结果, 第二层结束需要第三层给出结果, 直至给个结果出来 (结束回溯)才会重新反馈给上一层,然后由上一层的结果在返回给上上一层, 以此类推。直至调用的函数有了结果
间接调用
def bar():
    print(from bar)
    foo()

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

foo()

原理同上,调用foo()  在运行foo()代码块 需要调用bar()由bar ()的 结果来给到foo(),在运行bar()代码块时也会调用foo(), 由foo()的结果来给到bar().  虽然这个也是一个死循环。但是能很清楚的讲述递归 含义

递归:

递归分为两个阶段:

1:回溯:

注意:一定要在满足某种条件结束回溯,否则的会无限递归

2、递推

总结:

1、递归一定要有一个明确的结束条件

2、每进入下一次递归,问题的规模都应该减少

3、在python中没有尾递归优化

完整的递推

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

age(5)

print(age(5))
#打印结果 26

小练习

要求把列表里每个元素都打印出来
items=[1,[2,[3,[4,[5,[6,[7,[8,]]]]]]]]
def tell(l):
    for item in l:
        if type(item) is not list:
            print(item)
        else:
            tell(item)
tell(items)

 

匿名函数:

匿名函数:没有名字,一次性使用, 随时定义

有名函数:循环使用,保存了名字,通过名字就可以重复引用函数功能

强调:

1、匿名的目的就是要没有名字,给匿名函数赋给一个名字是没有意义的

2 、匿名函数的参数规则,作用域关系与有名函数是一样的

3、匿名函数的函数体通常应该是一个表达式,该表达时必须要有一个返回值

 

匿名函数(lambda)应用:lambda x:代码块 ,nums     nums   是给前面的代码块赋值的

salaries={
    egon:3000,
    alex:100000000,
    wupeiqi:10000,
    yuanhao:2000
}
def get(k):
    return salaries[k]
print(max(salaries,key=lambda x:salaries[x]))
#key=lambda x:salaries[x]   这个是出薪资最高的那个人的名字 而不是字典里key 的名字按照字母顺序 比出高低 
lambda x:salaries[x] 这就是一个匿名函数 比完就可以不用再用直接扔掉


print(min(salaries,key=lambda x:salaries[x]))
打印结果 yuanhao

与sorted连用   排序

salaries={
    egon:3000,
    alex:100000000,
    wupeiqi:10000,
    yuanhao:2000
}

salaries=sorted(salaries)
print(salaries)#[alex, egon, wupeiqi, yuanhao]
                #默认按照字典的键的大小排序,不是按照工资高低排序


salaries=sorted(salaries,key=lambda x:salaries[x])
print(salaries)
#[‘yuanhao‘, ‘egon‘, ‘wupeiqi‘, ‘alex‘] 这个是按照升序的方式排列

salaries=sorted(salaries,key=lambda x:salaries[x],reverse=True) #降序
# print(salaries) # 这个是按照降序的方式排列
###打印结果[‘alex‘, ‘wupeiqi‘, ‘egon‘, ‘yuanhao‘]



与map 连用  映射关系

求出下列列表元素的平方并组成个列表
nums=[1,2,3,4,5]
res=map(lambda x:x**2,nums)
print(list(res))
#打印结果  [1, 4, 9, 16, 25]
把下面所有人的名字户后面都加上‘_SB‘
names=[alex,wpeiqi,yuanhao] res=map(lambda x:x+_SB,names) print(list(res)) #打印结果 [alex_SB, wpeiqi_SB, yuanhao_SB]
下面名字中egon 后面加上_NB ,其他加_SB。这里要用到三元表达式与匿名函数的结合使用
names=[alex,wpeiqi,yuanhao,egon]
res=map(lambda x:x+_NB if x==egon else x+_SB,names)
print(list(res))

打印结果[alex_SB, wpeiqi_SB, yuanhao_SB, egon_NB]

 

reduce 合并,与 from   functools import reduce 连用

from functools import reduce
l=[my,name,is,alex,alex,is,sb]
res=reduce(lambda x,y:x+ +y,l)
print(res)

#打印结果 my name is alex alex is sb

 

filter 过滤

将名字中没有sb结尾的名字过滤掉
names = [ales_sb,wxx_sb,yxx_sb,egon] res=filter(lambda x:True if x.endswith(sb) else False,names ) print(list(res)) #打印结果 [ales_sb, wxx_sb, yxx_sb] 将egon 过滤掉
选出年龄超过30岁以上的年龄

ages=[18,19.25,33,50,99]
res=filter(lambda  x:x>30,ages)
print(list(res))

#[33, 50, 99]

 

salaries ={
    egon:3000,
    alex:100000000,
    wupeiqi:10000,
    yuanhao:2000
}

res=filter(lambda k:salaries[k]>10000,salaries)
print(list(res))
#打印结果# [alex]

 

以上是关于三元表达式,递归,的主要内容,如果未能解决你的问题,请参考以下文章

三元表达式,递归,

三元表达式递归匿名与内置函数

4/2 三元表达式/函数递归/匿名函数/内置函数

三元表达式递归二分法匿名函数内置函数

三元表达式列表推导式生成器表达式递归匿名函数内置函数

三元表达式列表推导式生成器表达式递归匿名函数内置函数