python匿名函数、迭代器、高阶函数(二)

简介: python匿名函数、迭代器、高阶函数(二)

python匿名函数、迭代器、高阶函数(一):https://developer.aliyun.com/article/1495740

高阶函数

#高阶函数 : 能够把函数当成 参数传递 的就是高阶函数 (map ,filter ,reduce , sorted)

1、map

map(func,iterable)

功能: 处理数据

把iterable中的数据一个一个拿出来,扔到func做处理,通过调用迭代器来获取返回值

参数:

func : 函数(内置函数,自定义函数) 定义的函数带一个参数,并且有返回值

iterable : 可迭代性对象 (容器类型数据,range对象,迭代器)

返回值:

迭代器

可以循环处理一批数据,然后再返回出来

#(1) 把列表中的元素都变成整型

lst = ["1","2","3","4"]
lst_new = []
for i in lst:
    lst_new.append(int(i))
print(lst_new)



#用map改写
from collections import Iterator,Iterable
it = map(int,lst)
print(isinstance(it,Iterator))

map返回的是个迭代器

代码解析:

第一次调用迭代器

先把列表中的第一个元素"1"拿出来扔到int中做强转,变成整型1返回出来

第二次调用迭代器

先把列表中的第一个元素"2"拿出来扔到int中做强转,变成整型2返回出来

第三次调用迭代器

先把列表中的第一个元素"3"拿出来扔到int中做强转,变成整型3返回出来

第四次调用迭代器

先把列表中的第一个元素"4"拿出来扔到int中做强转,变成整型4返回出来

#1.调用迭代器 next

print(next(it))
print(next(it))
print(next(it))
print(next(it))
#print(next(it)) error

#2.调用迭代器 for

print("<======>")
it = map(int,lst)
for i in it:
    print(i)

#3.调用迭代器 for + next

print("<======>")
it = map(int,lst)
for i in range(3):
    print(next(it))

#4.强转迭代器 => 列表

it = map(int,lst)
print(list(it))

#(2) [1,2,3,4] => [2,8,24,64]

# print(1 * 2 ** 1)
# print(2 * 2 ** 2)
# print(3 * 2 ** 3)
# print(4 * 2 ** 4)
    
# 1 << 1
# 2 << 2
# 3 << 3
# 4 << 4

lst = [1,2,3,4]
lst_new = []
for i in lst:
    lst_new.append(i << i)
print(lst_new)

#map改写

def func(n):
    print(1111)
    return n << n
    
it = map(func,lst)
print(list(it))

只有在调用迭代器的时候,才会真正触发map函数中的所有内容;不调用不触发;

强转迭代器时,把可以调用的所有数据都放到列表中

第一次调用时:

把1拿出来,扔func当中做处理,返回2,

第二次调用时:

把2拿出来,扔func当中做处理,返回8,

第三次调用时:

把3拿出来,扔func当中做处理,返回24,

第四次调用时:

把4拿出来,扔func当中做处理,返回64,

到此列表[2,8,24,64]

注意点:形参和返回值必须写;

#(3) 给你一个列表[“a”,“b”,“c”] => [97,98,99]

# 字典的键值翻转操作
dic = {97:"a",98:"b",99:"c"}
dic_new = {}
for k,v in dic.items():
    # print(k,v) # 97 a | 98 b | 99 c
    dic_new[v] = k # dic_new["a"] = 97
print(dic_new)
lst = ["a","b","c"]
lst_new = []
for i in lst:
    lst_new.append(dic_new[i])
print(lst_new)

#map改写

lst = ["a","b","c"]
lst = ["c","b","a"]
lst = ("c","b","a")

# func 实现字典的翻转,通过给与a,b,c三个键,得到对应的ascii码,通过list强转得到列表
def func(n):
    print(n)
    dic = {97:"a",98:"b",99:"c"}
    dic_new = {}
    for k,v in dic.items():
        dic_new[v] = k 
    print(dic_new) # {'a': 97, 'b': 98, 'c': 99}
    return dic_new[n]

        
it = map(func,lst)
print(list(it))

2、reduce

reduce(func,iterable)

功能: 计算数据

把iterable中的前两个数据扔到func函数中做计算,把计算的结果和iterable中第三个值在继续扔到func中做计算

以此类推 …

所以,定义的函数必须包含两个参数,并且要把计算结果返回

最后返回计算的结果

参数:

func: 自定义函数

iterable : 可迭代对象 (容器类型数据 range对象 迭代器)

返回值:

计算的结果

#(1) [7,7,5,8] => 7758

lst = [7,7,5,8]

#方法一

strvar = ""
for i in lst:
    strvar += str(i)
res = int(strvar)
print(res , type(res))

#方法二

"""
7 * 10 + 7 = 77
77 * 10 + 5 = 775
775 * 10 + 8 = 7758
"""
#1.先变成迭代器
it = iter(lst)
#2.取出两个值
num1 = next(it)
num2 = next(it)
print(num1,num2)
#做计算
total = num1 * 10 + num2
print(total) # 77
#3.把计算的结果在和剩下的数据做计算
for num in it:
    total = total * 10 + num
#4.返回最后的结果
print(total , type(total))

print(“<==========>”)

#reduce改写

‘’‘从…functools模块, 引入 … reduce方法’‘’

from functools import reduce
lst = [7,7,5,8]
def func(x,y):
    # print(x,y)
    return x * 10 + y
res = reduce(func,lst)
print(res)

如果使用reduce,定义的函数必须包含两个变量,因为reduce会把前两个数据扔给func处理,然后把计算结果再与第三个数据做计算,以此类推

#使用lambda 进行改造

print(reduce(lambda x,y: x*10 + y,lst))

#(2) “123” => 123 不使用int的情况下实现该操作;

strvar = "123"
def func(x,y):
    return x * 10 + y

#把字符串"123" 处理成数字的123
def func2(n):
    # dic = {"0":0,"1":1,"2":2,"3":3,"4":4,"5":5,"6":6,"7":7,"8":8,"9":9}
    dic = {}
    for i in range(10):
        dic[str(i)] = i    
    return dic[n]

it = map(func2,strvar)
# res = reduce(func,it)
# print(res,type(res))
# 简写
print(reduce(lambda x,y: x*10 + y,it))

3、filter

filter(func,iterable)

功能: 过滤数据

在自定义的函数中,

如果返回True, 该数据保留

如果返回False,该数据舍弃

参数:

func: 自定义函数,只能返回True或False

iterable : 可迭代对象 (容器类型数据 range对象 迭代器)

返回值:

迭代器

#1.只要列表中所有的偶数

lst = [1,2,34,5,65,6,56,7,56,756,7567,11]
lst_new = []
for i in lst:
    if i % 2 == 0 :
        lst_new.append(i)
print(lst_new)


#filter改写
def func(n):
    if n % 2 == 0:
        return True
    else:
        return False
it = filter(func,lst)
print(list(it))

# 使用lambda 改写
it = filter(lambda n :True if n % 2 == 0 else False , lst)
print(list(it))
print(list(filter(lambda n :True if n % 2 == 0 else False , lst)))

3、sorted

sorted(iterable,key=函数,reverse=False)

功能:排序数据

参数:

iterable : 可迭代对象 (容器类型数据 range对象 迭代器)

key : 指定函数(自定义/内置) 自定义函数要带有一个参数,并且有返回值

reverse : 是否倒序

返回值:

列表

tup = (-90,89,78,3)

#1.从小到大
res = sorted(tup)
print(res,type(res))

#2.从大到小

res = sorted(tup,reverse = True)
print(res,type(res))

#3.按照绝对值进行排序

tup = (-90,-100,1,2)
res = sorted(tup,key=abs)
print(res)

1 => abs(1) => 1
2 => abs(2) => 2
-90 => abs(-90) => 90
-100 => abs(-100) => 100

#4.按照自定义函数进行排序

tup = (19,23,42,87)
"""
42 % 10 2 => 42
23 % 10 3 => 23
87 % 10 7 => 87
19 % 10 9 => 19
"""
def func(n):
    print(n)
    return n % 10
lst = sorted(tup,key = func)
print(lst)

#5.任意的容器类型数据都可以通过sorted排序

container = "abc"
container = [1,2,3]
container = (1,2,3)
container = {"你好","王文","你真帅"}
container = {"caixukun","xiaozhan","zhaoshenyang","wangyibo"}
container = {"ww":"英俊帅气","zxy":"猥琐抠脚","zwl":"斯文败类"} # 排的是字典的键
print(sorted(container))


#总结:

sorted (推荐使用sorted)

(1) 可以排序所有的容器类型数据

(2) 返回一个新的列表

sort

(1) 只能排序列表

(2) 基于原来的列表进行排序


相关文章
|
27天前
|
大数据 数据处理 开发者
Python中的迭代器和生成器:不仅仅是语法糖####
本文探讨了Python中迭代器和生成器的深层价值,它们不仅简化代码、提升性能,还促进了函数式编程风格。通过具体示例,揭示了这些工具在处理大数据、惰性求值及资源管理等方面的优势。 ####
|
2月前
|
Serverless Python
python高阶函数
【10月更文挑战第2天】
28 5
|
2月前
|
缓存 并行计算 算法
如何提高 Python 高阶函数的性能?
【10月更文挑战第2天】
21 3
|
1月前
|
存储 程序员 数据处理
深入理解Python中的生成器与迭代器###
本文将探讨Python中生成器与迭代器的核心概念,通过对比分析二者的异同,结合具体代码示例,揭示它们在提高程序效率、优化内存使用方面的独特优势。生成器作为迭代器的一种特殊形式,其惰性求值的特性使其在处理大数据流时表现尤为出色。掌握生成器与迭代器的灵活运用,对于提升Python编程技能及解决复杂问题具有重要意义。 ###
|
2月前
|
存储 索引 Python
Python 迭代器是怎么实现的?
Python 迭代器是怎么实现的?
47 6
|
3月前
|
索引 Python
解密 Python 迭代器的实现原理
解密 Python 迭代器的实现原理
53 13
|
3月前
|
机器学习/深度学习 设计模式 大数据
30天拿下Python之迭代器和生成器
30天拿下Python之迭代器和生成器
23 3
|
2月前
|
存储 大数据 Python
Python 中迭代器与生成器:深度解析与实用指南
Python 中迭代器与生成器:深度解析与实用指南
25 0
|
4月前
|
数据采集 存储 大数据
Python关于迭代器的使用
在Python编程中,数据的处理和操作是核心任务之一。 想象一下,你有一个装满各种颜色球的箱子,你想逐个查看并使用这些球,但又不想一次性将它们全部取出。 这就引出了我们今天要讨论的主题——迭代。
|
4月前
|
存储 安全 数据库
Python中的可迭代性与迭代器
在Python中,可迭代性和迭代器是非常重要的概念,它们为我们提供了一种优雅且高效的方式来处理序列和集合数据。本文将深入探讨这些概念,包括可迭代协议以及与异步编程相关的可迭代性和迭代器。