python的艰难学习之路-函数补充

1.匿名函数 lambda()

# 匿名函数
def func(n):
    return n+1


# 匿名函数 lambda 参数: 返回值
a = lambda n: n+1

# 两个函数的执行效果是一样的
print(a(5))
print(func(5))

  • lamba注意事项

    • 1.必须要一行写完,不然会报错
    • 2.如果返回多个结果,必须手动用()括起来表示一个元组,不能用逗号分隔,不然会报错

2.sorted()排序函数

sorted(iterable, key,reverse=False)
  • iterable:可迭代对象
  • key:排序方案,sorted函数会把可迭代对象中每个元素拿出来交给后面的key,后面的key计算出一个数字,按照这个数字进行排序,这个数字一般是一个函数的返回值
  • reverse:是否倒序。默认False,不倒序
发现的有趣现象:
  • 再默认排序方式下,也就是不设计排序方案的时候
  • 1.如果是对纯汉字进行排序,是按照所有汉字的笔画的和的多少来排的
lst = ["黄永仙", "黄永三一", "张三", "王二麻子", "一一一一一一一"]
print(sorted(lst))

运行结果:
在这里插入图片描述

  • 2.如果是汉字和字母在一起,则字母在前,汉字在后,汉字按照上面的规律,字母按照字母多少,也就是字符串长度
sorted函数和lambda函数的结合应用
# 按照年龄排序
person = [{"name": "HYG", "age": 27},
          {"name": "WQ", "age": 26},
          {"name": "HYGWQ", "age": 25}]

x = sorted(person, key=lambda el: el["age"])
print(x)

3、filter()筛选函数

  • filter(function, iterable)
和上面的sorted函数差不多,都是把可迭代的对象送进去,然后把每一项交给函数,最后按照函数的规则,过滤掉我们不想要的,
函数必须要返回True或者False,返回True的会被留下,反之被抛弃
# 不要姓黄的

lst = ["黄永刚", "黄飞鸿", "吴倩", "周超"]


def func(el):
    if el[0] == "黄":
        return False
    else:
        return True


x = filter(lambda el: el[0] != "黄", lst)

for i in x:
    print(i)
执行结果

在这里插入图片描述

4、映射函数map()

  • map(func, iter1)
这几个东西差不多,都是把可迭代的东西送进去,不一样的是,map是来处理这些数据,按照func中的算法

5、递归

  • 函数自己调用自己

  • 递归深度:可以自己调用自己的次数‘

    官方文档中的递归深度是1000,但是在这之前就会报错退出

1)、递归应用-遍历文件夹

# 文件夹遍历
import os


def func(filepath, n):

    files = os.listdir(filepath)  # 列出文件&文件夹列表

    for file in files:  # 取出每个文件
        file_path = os.path.join(filepath, file)  # 拼接成绝对路径

        if os.path.isdir(file_path):
            print("\t"*n, file, ":")
            func(file_path, n+1)  # 如果是文件夹,再调用func

        else:
            print("\t"*n, file)


func("E:\\一些工具", 0)

2)二分法查找:
  • 二分法可以提高查找效率,特别是数据量也别巨大的时候,这个优势会非常明显,假设有n个数,2的x次方等于n,那我们只需要x次就能找到,如果用普通的算法去找,最多需要n次才能找到,优势可见一斑

  • 条件:只能对有序的数列操作

  • 大致思路:掐头去尾取中间,一次排除一半的数据

原始的二分法查找代码
lst = [11, 22, 33, 44, 55, 88, 92, 97, 125, 186, 258, 369, 456, 789, 987]

# 判断一个数在不在上述的列表中

n = 33

left = 0
right = len(lst) - 1

while left <= right:
    mid = (left+right)//2
    
    if lst[mid] == n:
        print("找到啦!")
        break
    if lst[mid] > n:
        right = mid - 1
    if lst[mid] < n:
        left = mid + 1

else:
    print("没这个数")


用递归的思想完成二分法查找
lst = [11, 22, 33, 44, 55, 88, 92, 97, 125, 186, 258, 369, 456, 789, 987]

def func(n, left, right):
    mid = (left+right)//2
    if left <= right:
        if lst[mid] > n:
            right = mid - 1
            return func(n, left, right)  # 这里不加return的话,我们收到的return值是None

        elif lst[mid] < n:
            left = mid+1
            return func(n, left, right)  # 这里不加return的话,我们收到的return值是None
        else:
            print("find it!!")
            return mid

    else:
        print("no such number")
        return -1


print(func(187, 0, len(lst)))

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值