Hello,大家好,我是你们的老朋友景天,今天我们来聊一聊python的匿名函数,迭代器和高阶函数map,filter,reduce,sorted的用法。
匿名函概念: 用一句话来表达,只有返回值的函数叫匿名函数
语法: lambda 参数 : 返回值
特点: 简洁,高效
lambda函数
我们先对lambda函数进行一个简单的介绍
lambda函数是一种匿名函数,即没有名字的函数
使用lambda保留字定义,函数名是返回结果
lambda函数的函数体只是一个表达式
lambda函数用于定义简单的、能够在一行内表示的函数
lambda表达式” : “后面,只能有一个表达式,def则可以有多个。
lambda一般用来定义简单的函数,而def可以定义复杂的函数
lambda 冒号后面的表达式计算结果,即为该lambda的返回值。可以结合三目运算进行判断
(1) 无参的lambda表达式
def func(): return "文哥是个帅哥"
#使用lambda改造
func = lambda : "文哥是个帅哥" print( func() )
(2) 有参的lambda表达式
def func(n): return id(n) #改造 func = lambda n : id(n) print( func(100) )
(3) 带有判断条件的lambda表达式
def func(n): if n % 2 == 0: return "偶数" else: return "奇数" #改造 func = lambda n : "偶数" if n % 2 == 0 else "奇数" print( func(44) )
(4)三元运算符 / 三目运算符
三目运算符又称为三元运算符,条件运算符。三目运算符的作用就是判断,可以理解为if条件判断的简化版。
“”“语法: 真值 if 条件表达式 else 假值
如果条件表达式成立为True , 返回if前面的真值, 反之,返回else后面的假值 给变量
“””
n = 13 res = "偶数" if n % 2 == 0 else "奇数" print(res)
#小练习 : 比较两者之间的最大值进行返回
def func(x,y): if x > y: return x else: return y #改造 func = lambda x,y : x if x>y else y print( func(40,30) )
lambda只能表达有返回值的简单表达,如果带有复杂逻辑的运算,还是要用def来定义函数
迭代器
迭代器:
能被next()函数调用,并不断返回下一个值的对象称为迭代器(Iterator 迭代器是对象)
概念:
迭代器指的是迭代取值的工具,迭代是一个重复的过程,每次重复都是基于上一次的结果而继续的,
单纯的重复并不是迭代
特征:
并不依赖索引,而通过next指针(内存地址寻址)迭代所有数据,一次只取一个值,
而不是一股脑的把所有数据放进内存.大大节省空间,
–Iterable可迭代的对象 Iterator迭代器
range 是 可迭代对象
range 和 迭代器 能够产生惰性序列
可迭代数据可以通过list()方法强制转换成列表
1.可迭代对象
setvar = {“王同培”,“马春配”,“赵万里”,“赵沈阳”}
#获取当前对象的内置成员
lst = dir(setvar) #返回的是个列表,有什么属性,有什么方法,成员等,都打印到列表里面 print(lst)
#判断是否是可迭代对象
res = "__iter__" in lst print(res) # for i in setvar: # print(i) __iter__ 在当前对象的内置成员中,就是可迭代对象
2.迭代器
for循环之所以可以遍历所有的数据,是因为底层使用了迭代器,通过地址寻址的方式,一个一个的找数据;
可迭代对象 -> 迭代器 实际上就是从不能够被next直接调用 -> 可以被next指针直接调用的过程
如果是可迭代对象 -> 不一定是迭代器
如果是迭代器 -> 一定是可迭代对象
不是迭代器不可以被next直接调用
后面还有生成器,可以自定义控制迭代逻辑,比迭代器更先进
1.如何创建一个迭代器,可迭代对象可以通过iter()方法创建迭代器
setvar = {"王同培","马春配","赵万里","赵沈阳"} it = iter(setvar) print(it)
非可迭代对象,不能通过该方法创建迭代器
#创建迭代器,方法二: #变成迭代器,方法2 it = res.__iter__() # print(isinstance(it,Iterator))
2.如何判断一个迭代器
print(dir(it)) res = "__iter__" in dir(it) and "__next__" in dir(it) print(res)
根据当前对象的内置成员,迭代器与迭代对象都包含 iter 。但是迭代器比迭代对象多个__next__。
同时具备 __iter__和__next__的才是迭代器
3.如何调用一个迭代器
"""next是单向不可逆的过程,一条路走到黑""" res = next(it) print(res) res = next(it) print(res) res = next(it) print(res) res = next(it) print(res) # res = next(it) # print(res) #调用 res = it.__next__() print(res)
当迭代的数量超过迭代器数据的数量,会报错
4.重置迭代器
it = iter(setvar) print( it.__next__() ) #内置方法来迭代,该方法也不能超过数据个数迭代 print( it.__next__() ) print( it.__next__() ) print( it.__next__() )
通过iter(setvar)重置迭代器,可以重新开始迭代
也可以使用内置的__next()__方法来迭代
5.调用迭代器的其他方法
#1 for
it = iter(setvar) for i in it: print(i)
#2 for + next
it = iter(setvar) for i in range(2): print( next(it) ) print( next(it) ) print( next(it) ) # print( next(it) ) error 超出了寻址范围
6.判断迭代器/可迭代对象的其他方法
#从…模块 引入…内容
from collections import Iterator, Iterable """Iterator 迭代器 Iterable 可迭代的对象""" res = isinstance(it,Iterator) print(res) res = isinstance(it,Iterable) print(res)
python3.11版本导入方式:
from collections.abc import Iterator, Iterable
7.range是迭代器么?
print(isinstance(range(10),Iterator)) # False print(isinstance(range(10),Iterable)) # True
#变成迭代器
it = range(10).__iter__() print(isinstance(it,Iterator)) # True print(isinstance(it,Iterable)) # True
#调用方法一
#next res = next(it) print(res) res = next(it) print(res) #调用,方法二 res = it.__next__() print(res)
print(“<=====>”)
# for + next for i in range(3): print(next(it))
#调用方法三
# for for i in it: print(i)
python匿名函数、迭代器、高阶函数(二):https://developer.aliyun.com/article/1495744