内置函数, 递归, 二分法

一. lambda()

a = lambda n: n ** 2

a = lambda x, y: (x, y)

a = lambda x, y: x, y            这个需要两个变量名来接收, 把y赋值给第二个变量名

fn = lambda *args: max(args)

lambda有返回值

 

二. sorted()

sorted(iterable, key, reverse)

lst = sorted(lis, key = lambda el: el[:2], reverse = True)

lst = sorted(lis, key = func, reverse = True)            func不加括号

sorted函数会把lis的每一个元素交给key, 然后计算出这个元素的权重, 整个函数按权重进行排序, sorted有返回值

 

三. filter()

filter(function, iteraable)

f = filter(lambda el: int(el[0]) < 5, lst)

print(list(f))

filter函数返回True的都会保留, False都会去除

获取的返回值是一个迭代器

m = map(func1, map(func2, map(func3, lst)))           # 分而治之

m = map(lambda x, y, z: x + y + z, [1,2,3,4,5,6], [1,2,3,4,5], [1,2,3,4])     # 返回的迭代器的元素个数取最短的那个列表的个数

 

四. map()

map(function, iterable)

把可迭代对象中的每一个元素交给前面的函数进行执行, 返回值就是map的处理结果

m = map(lambda el: el ** 2, lst)

print(list(m))

返回的也是迭代器

 

五. repr()

print(repr('你好'))        # '你好'         程序中内部存储的内容, 是给程序员看的

print('你好')       # 你好          给用户看的

print(r'\\你好')       # \\你好          原样输出

 

六. 递归

递归深度默认是1000, 可以改变, 但实际只能到998左右, 看机器好坏, 到了深度会报错

遍历 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)

  

七. 二分法

核心: 切头去尾取中间, 一次砍一半

两种算法: 常规循环, 递归循环

# 递归来完成二分法
lst = [22, 33, 44, 55, 66, 77, 88, 99, 101 , 238 , 345 , 456 , 567 , 678 , 789]
def func(n, left, right):
    if left <= right: # 边界
        print("哈哈")
        mid = (left + right)//2
        if n > lst[mid]:
            left = mid + 1
            return func(n, left, right) # 递归  递归的入口
        elif n < lst[mid]:
            right = mid - 1
            # 深坑. 函数的返回值返回给调用者
            return func(n, left, right)    # 递归
        elif n == lst[mid]:
            print("找到了")
            return mid
            # return  # 通过return返回. 终止递归
    else:
        print("没有这个数") # 递归的出口
        return -1 # 1, 索引+ 2, 什么都不返回, None
# 找66, 左边界:0,  右边界是:len(lst) - 1
ret = func(66, 0, len(lst) - 1)
print(ret) # 不是None

  

时间复杂度, 空间复杂度最低的查找方法

lst1 = [5,6,7,8]
lst2 = [0,0,0,0,0,1,1,1,1]     # 个数是lst1中最大的元素加1
for el in lst1:           
    lst2[el] = 1

print(lst2[5])

  

  

posted @ 2018-08-15 18:50  NachoLau  阅读(140)  评论(0编辑  收藏  举报