三元表达式、递归函数、匿名函数、列表生成式、生成器表达式

三元表达式

  其目的是为了简化书写,既然是简化就必然有局现性

   三元表达式只能简化仅有两个分支的if判断,

a=1
b=2
m=a if a>b else b
print(m)

函数的递归调用
   在调用一个函数的过程又直接或间接地调用函数本身,称之为函数的递归调用

  递归必须满足两个条件:
      1,每进入下一次递归,问题的规模都应该有所减少
      2,必须有一个明确的结束条件

  递归时出现以下错误

RecursionError: maximum recursion depth exceeded while calling a Python object
在调用函数是超出了最大递归深度

#系统默认次数是1000

import sys
print(sys.getrecursionlimit())

>>>1000
-------------------------------------------
#可修改
import sys
sys.getrecursionlimit(2000)

>>>2000
View Code

 

小练习

用while循环和递归的方法把列表中的值取出来
    l=[1,[2,[3,[4,[5,[6]]]]]]

用while循环把列表中的值取出来
l=[1,[2,[3,[4,[5,[6]]]]]]
while True:
    tag=False
    for i in l:
        if type(i) == list:
            l = i
            tag=True
        else:
            print(i)
    if tag==False:
        break

用递归的方法取出来
l = [1, [2, [3, [4, [5, [6]]]]]]
def func(li):
    for x in li:
        if type(x)is not list:
            print(x)
        else:
            func(x)
func(l)
View Code  

递归的使用案例:二分查找法

  想从一个按照(从小到大)或(从大到小)排列的数字列表中找到指定的数字,遍历的效率太低,用二分法(算法的一种,算法是解决问题的方法)可以极大低缩小问题规模

 

 

匿名函数

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

2、为何要用:用于仅仅临时使用一次的场景,不需要重复利用

3、特点:
  仅定义时使用一次,
  参数没有括号,直接用冒号隔开,
  函数体只能写在一行,不能换行
  通常与内置函数联用(max、min、sorted、)

4、使用方法:一般都是与其他内置函数配合使用  

    单独使用格式:

        lambda 参数1,参数2...: 函数体


   与内置函数结合使用
       
          

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

salaries={
    'egon':300000,
    'alex':100000000,
    'wupeiqi':10000,
    'yuanhao':2000
}
 res=max(salaries)
 print(res)
此时比的是key的值,
---------------------------------------------------------------------
可以通过max函数的key参数来改变max函数的比较依据,(此key并非key,value的key)
运行原理:
max函数会“for循环”出一个值,然后将该值传给key指定的函数
调用key指定的函数,将拿到的返回值当作比较依据
max(salaries,key=     )
--------------------------------------------------------------------
max与有名函数
def func(name):
     return salaries[name]
res=max(salaries,key=func)  #'egon'
print(res)
-------------------------------------------------------------------------
max与匿名函数
res=max(salaries,key=lambda name:salaries[name])  #'egon'
print(res)
求薪资最高的那个人名

 

 sorted排序,与匿名函数连用

salaries={
    'egon':300000,
    'alex':100000000,
    'wupeiqi':10000,
    'yuanhao':2000
}
res=sorted(salaries,key=lambda name:salaries[name])
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))
>>>>['alexdSB', 'lxxdSB', 'wxxdSB', 'yxxdSB']

 

 

zip:映射

l1 = [1,2,3,4,5]
l2 = ["a","b","c","d"]
print(list(zip(l1,l2)))      #对应存为元组,当一方的值比另一方多时,也不会报错
>>[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')]


l1 = [1,2,3,4,5]
l2 = ["a","b","c","d"]
l3 = [11,22,33]
print(list(zip(l1,l2,l3)))

>>[(1, 'a', 11), (2, 'b', 22), (3, 'c', 33)]
View Code

 

     

 

 filter: 从一个列表中过滤出符合我们过滤规则的值

     运行原理:相当于for循环取出每一个人名,然后传给匿名函数,将调用匿名函数返回值为True的那个人名给留下来

names=['alex_sb','lxx_sb','wxx_sb','egon','yxx']
res=filter(lambda name:name.endswith('sb'),names)
print(res)
print(list(res))

 >>>>   <filter object at 0x0000028CBDB23128>
 >>>>   ['alex_sb', 'lxx_sb', 'wxx_sb']
-----------------------------------------------------------------
普通方法实现此功能 # print([name for name in names if name.endswith('sb')])

    

reduce: 把多个值合并成一个结果

#from functools import reduce         py3中,必须用它调用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)

>>>>Aabcd

---------------------------------------------------
from functools import reduce
l=[1,2,3,4,5,6]
res = reduce(lambda x,y:x+y,l)
print(res)

>>21
View Code

 

 

列表生成式

  一个快速产生列表的表达式
优点:方便,改变了编程习惯,可称之为声明式编程
----------------------------------------------------------------
res=[i+1 for i in range(1,100)]
print(res)

----------------------------------------------------------------
res=[i+1 for i in range(1,100)if i>50]
print(res)
View Code

生成器表达式

把列表推导式的[]换成()就是生成器表达式
优点:省内存,一次只产生一个值在内存中
res=(i+1 for i in range(1,100)if i>50)
print(res)
>>>>    <generator object <genexpr> at 0x0000020348A45468>
View Code

列表生成式与生成器表达式实际区分

#注意看print缩进

列表生成式
with open(r'E:\python代码\16\aaa.py',encoding='utf-8')as f:
    li=[len(i) for i in f]
    print(max(li))

>>>>58
---------------------------
with open(r'E:\python代码\16\aaa.py',encoding='utf-8')as f:
    li=[len(i) for i in f]
print(max(li))
>>>>58
还有输出的原因,即使文件关闭了,文件中的内容存入列表,已经读入内存
-------------------------------------------------------------------------------
生成器表达式
with open(r'E:\python代码\16\aaa.py',encoding='utf-8')as f:
    li=(len(i) for i in f)
    print(max(li))
>>>>58


with open(r'E:\python代码\16\aaa.py',encoding='utf-8')as f:
    li=(len(i) for i in f)
print(max(li))
>>>>ValueError: I/O operation on closed file.

只有在调用__next__的时候才会去取值,此时I/O已经关闭
View Code

 

  

转载于:https://www.cnblogs.com/pdun/p/10283438.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值