匿名函数,递归

一,lambda 匿名函数

     lambda 参数: 返回值

#匿名就是没有名字
def func(x,y,z=1):
    return x+y+z

#匿名
lambda x,y,z=1:x+y+z #与函数有相同的作用域,但是匿名意味着引用计数为0,使用一次就释放,除非让其有名字
func=lambda x,y,z=1:x+y+z 
func(1,2,3)
#让其有名字就没有意义

 

# 普通的正常的函数
def func(n):
    return n * n
ret = func(9)
print(ret)

# 匿名函数, 语法: lambda 参数: 返回值
a = lambda n : n * n
ret = a(9)
print(ret)
b = lambda x: x+1
print(a(5)) # 函数的名字可以认为是a

 注意:
 1. 函数的参数可以有多个. 多个参数之间用逗号隔开
 2. 匿匿名函数不管多复杂. 只能写一行, 且逻辑结束后直接返回数据
 3. 返回值和正常的函数一样, 可以是任意数据类型

    匿名函数并不是说一定没有名字. 这里前面的变量就是一个函数名. 说他是匿名的原因是我们通
过__name__查看的时候是没有名字的. 统一都叫lambda. 在调用的时候没有什么特别之处.
像正常的函数调用即可


 

二,sorted() 排序函数

 

 sorted(iterable, key, reverse)

 1,  Iterable: 可迭代对象
 2,  key: 排序规则.
        运行流程: 把可迭代对象中的每一个元素交给后面key函数来执行.
 后面的key计算出一个数字. 作为当前这个元素的权重, 整个函数根据权重进行排序

 3,  reverse: 是否是倒叙. True: 倒叙, False: 正序

lst = [1,5,3,4,6]
lst2 = sorted(lst)
print(lst) # 原列表不会改变
print(lst2) # 返回的新列表是经过排序的
dic = {1:'A', 3:'C', 2:'B'}
print(sorted(dic)) # 如果是字典. 则返回排序过后的key

    和lambda组合使用

# 根据字符串长度进行排序
lst = ["麻花藤", "冈本次郎", "中央情报局", "狐仙"]
# 计算字符串长度
def func(s):
  return len(s)
print(sorted(lst, key=lambda s: len(s)))
lst = [{"id":1, "name":'alex', "age":18},
{"id":2, "name":'wusir', "age":16},
{"id":3, "name":'taibai', "age":17}]
# 按照年龄对学生信息进行排序
print(sorted(lst, key=lambda e: e['age']))

三. filter()   筛选函数

 

     filter(function, iterable)
  把可迭代对象中的每一个元素交给前面的函数进行筛选. 函数返回True或者False

lst = ["张无忌", "张铁林", "赵一宁", "石可心","马大帅"]
# 筛选,不要姓张的
f = filter(lambda el: el[0]!="", lst) # 将lst中的每一项传递给func, 所有返回True的都会保留, 
所有返回False都会被过滤掉
print("__iter__" in dir(f)) # 判断是否可以进行迭代 for e in f: print(e)

 

lst = [{"id":1, "name":'alex', "age":18},
{"id":2, "name":'wusir', "age":16},
{"id":3, "name":'taibai', "age":17}]
fl = filter(lambda e: e['age'] > 16, lst) # 筛选年龄大于16的数据
print(list(fl))

 

四,map() 映射函数

 

      语法: map(function, iterable) 可以对可迭代对象中的每一个元素进行映射.

分别取执行function ,返回值就是map的处理结果

#计算列表中每个元素的平方 ,返回新列表
def func(e):
  return e*e
mp = map(func, [1, 2, 3, 4, 5])
print(mp)
print(list(mp))
#改写成lambda
print(list(map(lambda x: x * x, [1, 2, 3, 4, 5])))

   计算两个列表中相同位置的数据的和

# 计算两个列表相同位置的数据的和
lst1 = [1, 2, 3, 4, 5]
lst2 = [2, 4, 6, 8, 10]
print(list(map(lambda x, y: x+y, lst1, lst2)))

 

五. 递归

  在函数中调用函数本身. 就是递归

def func():
  print("我是谁")
    func()
func()

最大深度: 1000 . 到不了1000就停了

# 递归深度. 你可以自己掉用自己的次数,
# 官方文档中递归最大深度是1000. 在这之前就会给你报错

# 遍历 D:/sylar文件夹, 打印出所有的文件和普通文件的文件名
import os
def func(filepath, n): # d:/sylar/
    # 1,打开这个文件夹
    files = os.listdir(filepath)
    # 2. 拿到每一个文件名
    for file in files:  # 文件名
        # 3. 获取到路径
        f_d = os.path.join(filepath, file) # d:/sylar/文件名/
        # 4. 判断是否是文件夹
        if os.path.isdir(f_d):
            # 5. 如果是文件夹. 继续再来一遍
            print("\t"*n, file,":") # 打印文件名
            func(f_d, n + 1)
        else:   #  不是文件夹. 普通文件
            print("\t"*n, file)

func("d:/sylar",0)

 

 

posted @ 2018-08-15 16:36  清风_Z  阅读(742)  评论(0编辑  收藏  举报