Day 15 内置函数补充

内置函数

 

1, lambda 匿名函数
lambda 参数: 返回值   函数名统一都叫lambd

# print("你好. 我\\叫周润发") # 对用户是友好的. 非正式的字符串
#
# # 正式(官方)的字符串, 面向对象的时候
# print(repr("你好, 我\'叫周润发")) # 程序中内部存储的内容, 这个是给程序员看的

# print("我叫%r" % "周润发") # %r 实际上调用的是repr()
# 原样输出
# print(r"马化腾说:\"哈哈哈, \" \n\t")

print("你好") # 用户看着舒服
print(repr("你好")) # 真实的字符串表示形式(正式的)

__str__()
__repr__()
# 普通的正常的函数
# 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
#
# print(func.__name__) # 查看函数的名字
# print(a.__name__) # __name__的值都是<lambda>
# print(b.__name__)

# def func(a, b):
#     return a + b
#
# x = lambda a, b: a+b
#
# print(x(1,2))


# def func(x, y):
#     return x, y
#
# print(func(1,2))
# #           1,     2

# suiyi = lambda x, y : 1, 2   # 笔试题
# print(suiyi)
# print(suiyi(250,38))

# lambda 参数: 返回值

# 匿名函数, 给函数传递2给参数. 返回最大值
# fn = lambda *args: max(args) # 单行函数
#
# print(fn(1,2,5,2,3,4,156,3,2,2,4,5,56,34,34,34,34,88))

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

def func():
    print("你好")
def func2():
    print("不好")

def gn(fn): # fn是一个参数. 根据实参给的值的变化而变化
    print(fn.__name__) # func
    fn()

gn(func2)
# lst = [16, 18, 32, 54, 12, 9]

# lst.sort() # list的方法

# print(lst)
#  内置函数中提供了一个通用的排序方案, sorted()
# s = sorted(lst)
# print(s)
#       0       1          0          1         1        0      0
# lst = ["聊斋", "西游记", "三国演义", "葫芦娃", "水浒传", "年轮", "亮剑"]
#
# def func(s):
#     return len(s)%2
#
# ll = sorted(lst, key=func)
#
# print(ll)
# key: 排序方案, sorted函数内部会把可迭代对象中的每一个元素拿出来交给后面的key
# 后面的key计算出一个数字. 作为当前这个元素的权重, 整个函数根据权重进行排序


lst = [
    {'name':"汪峰","age":48},
    {"name":"章子怡",'age':38},
    {"name":"alex","age":39},
    {"name":"wusir","age":32},
    {"name":"赵一宁","age":28}
    ]



ll = sorted(lst, key=lambda el: len(el['name']), reverse=True)
print(ll)

4. map() 映射函数
  map(function, iterable)
  把可迭代对象中的数据交给前面的函数进行执行. 返回值就是map的处理结果

# lst = ["张无忌", "张铁林", "赵一宁", "石可心","马大帅"]

# def func(el):
#     if el[0] == '张':
#         return False # 不想要的
#     else:
#         return True # 想要的

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


# lst = [
#     {"name":"汪峰", "score":48},
#     {"name":"章子怡", "score":39},
#     {"name":"赵一宁","score":97},
#     {"name":"石可心","score":90}
# ]
#
# f = filter(lambda el: el['score'] < 60 , lst) # 去16期的人
#
# print(list(f))

5. 递归
  函数自己调用自己
  最大深度: 1000 . 到不了1000就停了
  import sys
  sys.setrexxxxx

# 递归函数, 自己调用自己
# count = 1
# def func():
#     global count
#     print("alex是很帅的", count)
#
#     count = count + 1
#     func()
# func()
# 递归深度. 你可以自己掉用自己的次数,
# 官方文档中递归最大深度是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)

6. 二分法
  核心: 掐头去尾取中间. 一次砍一半
  两种算法: 常规循环, 递归循环

dic = {'5':1,'6':1} o(1)

# 时间复杂度最低, 空间复杂度最低
  lst1 = [5,6,7,8]
  lst2 = [0,0,0,0,0,1,1,1,1]
for el in lst1:
  lst2[el] = 1

  lst2[4] == 1 # o(1)

 

# lst = [22, 33, 44, 55, 66, 77, 88, 99, 101 , 238 , 345 , 456 , 567 , 678 , 789 ]
# n = 79

# for el in lst:
#     if el == n: # O(1)
#         print("找到了")
#         break
# else:
#     print("没有")


# 使用二分法可以提高效率, 前提条件:有序序列
# lst = [22, 33, 44, 55, 66, 77, 88, 99, 101 , 238 , 345 , 456 , 567 , 678 , 789]
#
# n = 88
# #
# left = 0
# right = len(lst)-1
#
# while left <= right: # 边界, 当右边比左边还小的时候退出循环
#     mid = (left + right)//2 # 必须是整除. 因为索引没有小数
#     if lst[mid] > n:
#         right = mid - 1
#     if lst[mid] < n:
#         left = mid + 1
#     if lst[mid] == n:
#         print("找到了这个数")
#         break
# else:
#     print("没有这个数")


# 递归来完成二分法
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(70, 0, len(lst) - 1)
print(ret) # 不是None

 

 

 

posted @ 2018-08-15 15:54  一只待宰的程序猿  阅读(169)  评论(0编辑  收藏  举报