Python3_lambda、sorted、filter、map、递归、二分法

知识点

1、lambda 匿名函数
2、sorted()函数
3、filter()函数
4、map()映射函数
5、递归
6、二分法

1、lambda匿名函数

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

# 一般函数
def func(n):
    return n*n
print(func(2))
# lambda函数表达式
# lambda匿名函数
# x参数
# 后面是直接返回的函数体
# 一行实现一个函数,但是不能完成复杂的函数操作
a = lambda x:x**2
print(a)
print(a(2))
4
<function <lambda> at 0x000001FE6AAAD2F0>
4
b = lambda x,y:x+y
print(b(3,5))
8
print(b.__name__)
<lambda>
2、sorted()函数,key函数返回的必须是数字,可比较对象

语法:sorted(Iterable,key=None,reverse=False)
该函数是个内置函数,返回的是一个新的列表,原本列表不变,只有新列表被排序

# list自带的sort()排序方法
lst = [3,6,2,45,23,345,12,12456,98,908]
lst.sort()
print(lst)
[2, 3, 6, 12, 23, 45, 98, 345, 908, 12456]
lst = [3,6,2,45,23,345,12,12456,98,908]
sorted(lst)
print(lst)
ll = sorted(lst)
print(ll)
[3, 6, 2, 45, 23, 345, 12, 12456, 98, 908]
[2, 3, 6, 12, 23, 45, 98, 345, 908, 12456]
# 倒序
ll = sorted(lst,reverse=True)
print(ll)
[12456, 908, 345, 98, 45, 23, 12, 6, 3, 2]
# 按照字符串长度给字符串排序
lst = ["尼古拉斯","赵四","华山派大弟子","魔教圣女"]
def func(s):
    return len(s)
ll = sorted(lst,key=func) # 该函数内部把可迭代对象中的每一个元素传给func()
print(ll)
['赵四', '尼古拉斯', '魔教圣女', '华山派大弟子']
# 按照字符串中a的个数给字符串排序
lst = ["aaa尼古拉斯","aaaaaaaaaaaaaaaa赵四","aaaaa华山派大弟子","a魔教圣女"]
def func(s):
    return s.count('a')
ll = sorted(lst,key=func)
print(ll)
['a魔教圣女', 'aaa尼古拉斯', 'aaaaa华山派大弟子', 'aaaaaaaaaaaaaaaa赵四']
lst = ["aaa尼古拉斯","aaaaaaaaaaaaaaaa赵四","aaaaa华山派大弟子","a魔教圣女"]
ll = sorted(lst,key=lambda x:x.count("a"))
print(ll)
['a魔教圣女', 'aaa尼古拉斯', 'aaaaa华山派大弟子', 'aaaaaaaaaaaaaaaa赵四']
lst = [{'id':11,"name":"华山大弟子"},{"id":1,'name':"赵四"},{"id":45,'name':"尼古拉斯"},{"id":66,'name':"大张伟"}]
def func(dic):
    return dic["id"]
ll = sorted(lst,key=func)
print(ll)
[{'id': 1, 'name': '赵四'}, {'id': 11, 'name': '华山大弟子'}, {'id': 45, 'name': '尼古拉斯'}, {'id': 66, 'name': '大张伟'}]
3、filter()筛选函数,key函数返回的必须是true或者false

语法:filter(function,Iterable)
filter会把iterable中的元素传递给function,然后根据function返回的true或者false来判断是否保留此项数据

# 筛选奇数
def func(i):
    return i%2==1
lst = [1,2,3,4,5,6,7,8,9,11,23,22,345]
ll = filter(func,lst)
print(ll)
# 判断是否是迭代器
print("__iter__" in dir(ll))
print("__next__" in dir(ll))

<filter object at 0x000001FE6ABC4908>
True
True
# 将迭代器转化为list对象,进行打印
print(list(ll))
[1, 3, 5, 7, 9, 11, 23, 345]
# 采用lambda匿名函数
lst = [1,2,3,4,5,6,7,8,9,11,23,22,345]
ll = filter(lambda x:x%2==1,lst)
print(list(ll))
[1, 3, 5, 7, 9, 11, 23, 345]
4、map()

mapreduce思想

lst = [1,2,3,4,5,6]
def func(i):
    return i**2
it = map(func,lst)
print(list(it))
[1, 4, 9, 16, 25, 36]
lst = [1,2,3,4,5,6]
it = map(lambda x:x**2,lst)
print(it)
<map object at 0x000001FE6ABBE320>
5、递归

递归最大的便利是遍历树形结构

# 伪代码
def tree(root):
    left = root.left()
    right = root.right()
    tree(left)
    tree(right)
import os
# 遍历树形结构
filePath = "F:\A大数据学习"
it = os.listdir(filePath) # 查看文件夹中的文件
print("__iter__" in dir(it)) # 可迭代对象
print("__next__" in dir(it)) 
True
False
filePath = "F:\A大数据学习"
def read(filePath,n):
    it = os.listdir(filePath)
    for el in it:
        if os.path.isdir(os.path.join(filePath,el)): # 判断是文件夹还是文件
            #pass  # 递归的入口
            read(os.path.join(filePath,el),n+1)
        else: # 普通文件
            print("\t"*n,filePath)
            print("\t"*n,el)  # 递归的出口
read(filePath,0)
 F:\A大数据学习
 java_socket编程单线程.md
 F:\A大数据学习
 Java_多线程(内附示例代码,可运行).md
 F:\A大数据学习
 java_文件的读写.md
	 F:\A大数据学习\logs
	 events.out.tfevents.1583757856.DESKTOP-P16CDOQ
 F:\A大数据学习
 pandas_data_process_AM.pdf
 F:\A大数据学习
 Python3_send和生成器函数的使用示例.md
 F:\A大数据学习
 python基础_python函数名的应用.md
 F:\A大数据学习
 Python基础_闭包和迭代器.md
	 F:\A大数据学习\TensorFlow_实战学习笔记(内附详细实现代码)
	 TensorFlow_实战学习笔记(内附详细实现代码).md
 F:\A大数据学习
 下载.png
 F:\A大数据学习
 分组.pdf
 F:\A大数据学习
 基于LSTM来实现mnist手写数字识别(内附代码).md
	 F:\A大数据学习\手把手入门:tensorflow案例实战MNIST(内附源代码和数据集)
	 output_15_0.png
	 F:\A大数据学习\手把手入门:tensorflow案例实战MNIST(内附源代码和数据集)
	 output_15_1.png
	 F:\A大数据学习\手把手入门:tensorflow案例实战MNIST(内附源代码和数据集)
	 output_15_2.png
	 F:\A大数据学习\手把手入门:tensorflow案例实战MNIST(内附源代码和数据集)
	 output_15_3.png
	 F:\A大数据学习\手把手入门:tensorflow案例实战MNIST(内附源代码和数据集)
	 output_15_4.png
	 F:\A大数据学习\手把手入门:tensorflow案例实战MNIST(内附源代码和数据集)
	 output_7_0.png
	 F:\A大数据学习\手把手入门:tensorflow案例实战MNIST(内附源代码和数据集)
	 手把手入门:tensorflow案例实战MNIST(内附源代码和数据集).md
 F:\A大数据学习
 手把手入门:tensorflow案例实战MNIST(内附源代码和数据集) (1).zip
 F:\A大数据学习
 手把手入门:tensorflow案例实战MNIST(内附源代码和数据集).zip
	 F:\A大数据学习\电子书
	 Scala语言规范.pdf
6、二分查找

二分查找每次能够排除一半的数据,查找的效率非常高,但是局限性比较大,只能有序序列才可以使用二分查找
要求:查找的序列必须是有序序列

# 第一种写法 非递归
lst = [11,22,33,445,55,44,66,77,88,99,100,106,190,111111,343352435,34,2,3]
n = 190
left = 0
right = len(lst)-1
mid = (left+right)//2

while left<=right:
    mid = (left+right)//2
    if n > lst[mid]:
        left = mid+1
    elif n < lst[mid]:
        right = mid-1
    else:
        print("存在在%s位置" % mid)
        break
else:
    print("不存在!")

存在在12位置
# 第二种写法 递归
lst = [11,22,33,445,55,44,66,77,88,99,100,106,190,111111,343352435,34,2,3]
n = 190
def binary(left,right,n):
    mid = (left + right)//2
    if n>lst[mid]:
        left = mid + 1
    elif n<lst[mid]:
        right = mid-1
    else:
        return mid
    return binary(left,right,n)
binary(0,len(lst)-1,22)
1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值