python D14 内置函数二

# 内置函数二
# 1、lambda匿名函数
# 2、sorted()
# 3、filter()
# 4、map()
# 5、递归函数

# 一、lambda匿名函数
# 未来解决一些简单的需求而设计的一句函数
# func = lambda n: n**n # n的n次方
# print(func(5))
# lambda表示的是匿名函数,不需要用def来声明,一句话就可以声明出一个函数
# 语法:
# 函数名 = lambda 参数: 返回值
# 注意:
# 1、函数的参数可以有多个,多个参数之间用逗号隔开
# 2、匿名函数不管多复杂,只能写一行,且逻辑结束后直接返回数据
# 3、返回值和正常的函数一样,可以是任意数据类型

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

# 二、sorted()
# 排序函数
# 语法:sorted(Iterable, key=None, reverse=False)
# Iterable:可迭代对象
# key:排序规则(排序函数),在sorted内部会将可迭代对象中的每一个元素传递给
# 这个函数的参数,根据函数运算的结果进行排序
# reverse:是否倒叙,True:倒叙,False:正序

# 和函数组合使用
# 根据字符串长度进行排序
# lst = ["麻花藤", "冈本次郎", "中央情报局", "狐仙"]
# def func(s):
# return len(s)
# print(sorted(lst, key = func)) # ['狐仙', '麻花藤', '冈本次郎', '中央情报局']
# # 和lambda组合使用
# lst = ["麻花藤", "冈本次郎", "中央情报局", "狐仙"]
# print(sorted(lst, key = lambda s: len(s))) #['狐仙', '麻花藤', '冈本次郎', '中央情报局']

# 三、filter()
# 筛选函数
# 语法:filter(function, Iterable)
# function:用来筛选的函数,在filter中会自动的把ilterable中的元素传递给function
# 然后根据function返回值得True或者False来判断是否保留此项数据
# ilterable:可迭代对象
# lst = [1, 2, 3, 4, 5, 6, 7] # 筛选偶数
# lst_new = filter(lambda num: num % 2 == 0, lst)
# print(lst_new) # <filter object at 0x00A327D0> 可迭代对象
# print(list(lst_new))

# 四、map()
# 映射函数
# 语法:map(function,iterable)可以对可迭代对象中的每一个元素进行映射,分别
# 取执行function
# 计算列表每个元素的平方,放回新列表,与lambda连用
# lst = [1, 2, 3, 4, 5]
# lst_new = map(lambda num: num**2, lst)
# print(lst_new) # <map object at 0x03432510>
# print("__iter__" in dir(lst_new)) # True
# print(list(lst_new)) # [1, 4, 9, 16, 25]

# 五、递归
# 在函数中调用函数本身,就是递归
# def func():
# print("我是谁")
# func()
# func()

# 在python中递归的深度最大到998

# 递归的应用:
# 我们可以使用递归来遍历各种树形结构,比如我们的文件夹系统,可以使用递归来遍历该
# 文件夹中的所有文件
# import os
# def func(file,ceng):
# files = os.listdir(file)
# for fn in files:
# new_files = os.path.join(file, fn)
# if os.path.isdir(new_files):
# print("\t"*ceng, fn)
# func(new_files, ceng + 1)
# else:
# print("\t"*ceng, fn)
# lst = os.listdir(path) # 打开一个文件夹. 获取到文件夹内的所有内容 ["a","b"]
# for el in lst: # 当前文件夹内的所有的文件名(包括文件夹名字)
# # 拼接文件的真实路径
# file_real_path = os.path.join(path, el)
# # 判断这个路径是文件还是文件夹
# if os.path.isdir(file_real_path):
# # 递归的入口
# print(el)
# func(file_real_path) # 重新执行刚才的操作
#
# else: # 不是文件夹, 是文件
# # 递归的出口
# print(el)

# os:文件操作函数
# os.listdir():将目标文件所有文件名放在一个列表里
# os.path.join():拼接文件夹
# os.path.isdir():判断是否为文件夹

# os : 和操作系统相关的一些功能
# os.listdir("d:/") 帮我们打开一个文件夹. 返回文件夹内的所有内容(文件的名字)
# os.path.join("马化腾","马云") 马化腾/马云
# os.path.isdir(路径) 判断这个路径是文件夹还是文件

# 六、二分法查找
# ⼆分查找. 每次能够排除掉⼀半的数据. 查找的效率非常⾼. 但是局限性比较⼤. 必须是有
# 序序列才可以使⽤⼆分查找
# 要求: 查找的序列必须是有序序列.
# 判断n是否在lst中出现. 如果出现请返回n所在的位置
# lst = [22, 33, 44, 55, 66, 77, 88, 99, 101, 238, 345, 456, 567, 678, 789]

# 二分法查找——非递归算法(优选)
# n = int(input("请输入一个数:"))
# left = 0 # 列表的左边界
# right = len(lst) - 1 # 列表的右边界
# while left <= right: #d当左边界大于右边界则没找打这个数,循环借宿
# mid = (left + right) // 2
# if n < lst[mid]: # 你输入的数小于中间值则右边界为 mid -1
# right = mid -1
# if n > lst[mid]: # 你输入的数小于中间值则左边界为 left -1
# left = mid + 1
# if n == lst[mid]:
# print("有")
# break
# else:
# print("没有")

# 二分法——递归
# lst = [22, 33, 44, 55, 66, 77, 88, 99, 101, 238, 345, 456, 567, 678, 789]
# n = int(input("请输入一个数:"))
# def func(lst, n, left, right):
# mid = (left + right) // 2
# if left > right:
# print("没有")
# return False
# if n < lst[mid]:
# right = mid - 1
# return func(lst, n, left, right)
# if n > lst[mid]:
# left = mid + 1
# return func(lst, n, left, right)
# if n == lst[mid]:
# print("有")
# return True
# # func(lst, n, 0, (len(lst)-1))
# result = func(lst, n, 0, (len(lst)-1))
# print(result)

# 切换列表
# lst = [22, 33, 44, 55, 66, 77, 88, 99, 101, 238, 345, 456, 567, 678, 789]
# n = int(input("请输入一个数:"))
# def func(lst,n):
# left = 0
# right = len(lst)-1
# mid = (left + right) // 2
# if n < lst[mid]:
# return func(lst[:mid], n)
# elif n > lst[mid]:
# return func(lst[mid+1:], n)
# elif len(lst) == 0:
# print("没有")
# return False
# else:
# print("找到了")
# return True
# func(lst,n)
# print(func(lst,n))

# 七、递归深度
# python中最大的递归深度是1000 但是你永远到不了1000
posted @ 2018-11-05 20:41  我是一名劍客  阅读(168)  评论(0编辑  收藏  举报