吐血整理Python 常用的几种高阶函数和简单的迭代函数
Posted Amo Xiang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了吐血整理Python 常用的几种高阶函数和简单的迭代函数相关的知识,希望对你有一定的参考价值。
目录
高阶函数: 高阶函数英文叫 Higher-order function。编写高阶函数,就是让函数的参数能够接收别的函数。把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式。高阶函数以及迭代函数还可以帮我们省去使用循环遍历元素的操作,在内部已经帮我们实现好了!
一、all() 函数——判断可迭代对象中的元素是否全为True
all() 函数用于判断可迭代对象是否包括假值即 0、空、False,除此之外都属于真值。如果包括假值结果就为 False,否则结果就为 True。all() 函数的语法格式如下:
all(iterable)
参数说明:
- iterable:可迭代对象,如列表、元组等。参数不能为空并且提供的参数必须是可迭代器对象,否则将提示 TypeError 错误信息。
- 返回值:返回值为 True 或 False,如果可迭代对象不包括空、0、False 的元素,那么返回值为 True,否则返回值为 False。
【示例1】使用all()函数判断可迭代对象是否包括空、0、False的元素。代码如下:
注意:如果可迭代对象中元素个数为 0,则返回值为 True,例如空列表、空元组、空字典、空字符串的返回值为 True,代码如下:
【示例2】判断列表中是否包括0。生成随机数列表,并通过all()函数的返回值判断随机数列表中是否包括0,如果包括0则输出该列表,如果不包括0则程序重新执行,代码如下:
import random # 导入随机数模块
while True:
a = [random.randint(0, 5) for _ in range(5)] # 生成0-5之间的随机数列表
if all(a) is False:
print(a)
break
else:
print('随机数列表中没有0,程序重新执行!')
运行程序,输出结果为:
二、any() 函数——判断可迭代对象是否全为假值
any() 函数用于判断可迭代对象元素是否都是假值即 0、空、False。如果全部为假值则返回 False,否则返回 True。any() 函数的语法格式如下:
any(iterable)
参数说明:
- iterable:可迭代对象,如列表、元组、字符串等。同样的,参数不能为空并且提供的参数必须是可迭代器对象,否则将提示 TypeError 错误信息。
- 返回值为 True 或 False,如果可迭代对象中只要有一个元素不是假值,则返回值为 True,如果可迭代对象中所有的元素都是假值,则返回值为 False。
【示例1】使用any()函数判断可迭代对象是否全为假值。代码如下:
三、filter() 函数——通过指定条件过滤序列
filter() 函数用于过滤掉可迭代对象中不符合条件的元素,返回由符合条件的元素组成的新的迭代器。filter() 函数把传入的函数依次作用于每个元素,然后根据返回值是 True 还是 False 决定保留还是丢弃该元素。filter() 函数的语法格式如下:
filter(function,iterable)
参数说明:
- function:用于实现判断的函数。注意:这里的函数指的是函数的名字,不要打()调用。
- iterable:可迭代对象,如列表、range 对象等。
- 返回值:返回一个迭代器对象。
【示例1】 filter()函数的基本应用。使用filter()函数过滤出0~20(不包括20)之间的所有奇数,代码如下:
def odd_number(num): # 定义一个判断奇数的函数
return num % 2 != 0
# 使用filter()函数过滤出序列中的奇数
new_list = filter(odd_number, range(1, 20))
print(new_list) # 返回一个迭代器对象
print(list(new_list)) # 使用list()函数将迭代器转换为列表
运行程序,输出结果为:
【示例2】 筛选指定范围的数据。定义学生列表,实现按照2020年高考理科成绩进行筛选,得出成绩在600分到700分之间的学生信息,代码如下:
def find(item): # 创建函数
total = int(item[1])
if 600 <= total <= 700: # 判断条件
return True
return False
list1 = [('小明', 600), ('小刚', 601), ('小雅', 524), ('小旭', 714), ('小章', 624),
('小白', 635), ('小赵', 480), ('小高', 580), ('小王', 541), ('小琪', 680)]
new_list = filter(find, list1) # 过滤序列中不符合条件的元素
list2 = list(new_list) # 使用list()函数转换为列表
print(list2) # 输出学生列表
print(f'600分以上:{len(list2)}人') # 输出人数
运行程序,输出结果为:
【示例3】筛选类型不是字符的元素。例如,在一个集合中有一组数据,包括字符串、数字等,下面筛选出类型不是字符串的元素,代码如下:
set1 = {'Amo', 123, 12.1, -1, "Paul"}
# {123, 12.1, -1}
print(set(filter(lambda x: type(x) != str, set1)))
【示例4】取出字符串中的数字并转换为整型。取出一组注册信息中的数字,然后转换为整数。首先判断字符串是否为数字,然后使用filter()函数过滤数字,最后转换为整型输出,代码如下:
str1 = 'ISVO20N2WTRJ4T0XXGQ5QWP9Z'
str2 = filter(str.isdigit, str1) # 过滤数字
new_list = list(str2) # 转换为列表
str3 = ''.join(new_list) # 连接列表
print(int(str3)) # 转换为整型输出 2024059
【示例5】去除序列中所有值为假的元素。如果将 filter() 函数的第一个参数 function 的值设置为 None,就会默认去除序列中所有值为假的元素,如 None、False、0、’’、()、[] 和 {}等,代码如下:
L = [1, '', 0, 'C', None, [0, 1, 2], False, 3.14, [], {'c': 1, 3: None}, {}]
f = filter(None, L) # 去除序列中为假的元素
print(list(f)) # [1, 'C', [0, 1, 2], 3.14, {'c': 1, 3: None}]
【示例6】获取序列中被删除的元素。filter() 函数的返回值是一个可迭代对象,利用 for 循环将返回数据与原始数据比较,就可以判断出哪些元素被删除了。代码如下:
L = [1, '', 0, 'C', None, [0, 1, 2], False, 3.14, [], {'c': 1, 3: None}, {}]
f = list(filter(None, L))
print(f)
delete_data = L
for i in f:
if i in L:
delete_data.remove(i)
print(f"被删除的元素为: {delete_data}")
【示例7】获取索引中以索引为基数所对应的元素。通过 filter() 和 lambda() 函数输出列表 list_a 中以索引为基数出现次数最多的元素。代码如下:
list_a = [12, 213, 22, 2, 2, 2, 22, 2, 2, 32]
li = filter(lambda x: x in list_a, [i for i in range(len(list_a))])
print(list(li)) # [2]
【示例8】判断是否已经收藏某课程。在线课堂项目中,用户可以收藏喜欢的课程。如果之前已经收藏过该课程,则不用收藏。所以每次收藏之前,需要查询该课程是否已经收藏。代码如下:
class Course(object):
"""
课程类
"""
def __init__(self, course_id):
self.course_id = course_id
# 判断是否已经收藏
def is_favorite(course_id):
# 获取所有收藏的课程 id
course = list(filter(lambda c: c.course_id == course_id, course_list))
if len(course) > 0:
return True
return
if __name__ == '__main__':
course_list = []
for i in range(1, 10):
# 实例化9个课程类,并传递课程id
course_list.append(Course(i))
print(is_favorite(7)) # True
print(is_favorite(10)) # None
四、map() 函数————通过函数实现对可迭代对象的操作
map() 函数接收一个函数为参数和一个或者多个可迭代对象为参数,返回一个迭代器。此迭代器中每个元素都是函数参数依次作用于可迭代对象后的结果。map()函数的语法格式如下:
map(function, iterable, …)
参数说明:
- function:函数。
- iterable:一个或多个可迭代对象。
- 返回值:返回迭代器。
注意:map()函数在Python 2.x返回的是列表,而在Python 3.x中返回的是可迭代器对象。
【示例1】将列表中的元素转换为Unicode字符。
num1 = [25105, 29233, 80, 89]
a = map(chr, num1) # 返回一个迭代器对象
print(a)
print(list(a)) # 使用list()函数转换为列表
运行程序,输出结果为:
<map object at 0x00000243A720A520>
['我', '爱', 'P', 'Y']
从程序的运行结果可以看出,map() 函数返回的是一个可迭代器对象,我们通过使用 list() 函数将其转换为列表。
【示例2】规范英文的大小写。通过map()函数规范英文短句中单词的大小写(即首字母大写,其余字母小写),代码如下:
name_list = ['Being', 'SinGle', 'IS', 'better', 'than',
'being', 'in', 'an', 'unfaithful', 'relationship'] # 创建列表
def function(x): # 定义函数
return x.capitalize() # 实现首字母大写,其他字母小写
print("规范后的英文短句:", list(map(function, name_list))) # 使用list()函数转换为列表
aa = list(map(function, name_list))
print(' '.join(aa)) # 连接列表
运行程序,输出结果为:
规范后的英文短句: ['Being', 'Single', 'Is', 'Better', 'Than', 'Being', 'In', 'An', 'Unfaithful', 'Relationship']
Being Single Is Better Than Being In An Unfaithful Relationship
【示例3】对列表中的元素进行平方计算。
num_list = [i for i in range(10)] # 创建空列表
list2 = map(lambda x: x ** 2, num_list) # 返回一个迭代器对象
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
print(list(list2)) # 使用list()函数转换为列表
【示例4】传入多个可迭代对象。当使用map()函数传入多个可迭代对象时,且里面的元素长度不一致时,生成的迭代器以最短长度为主,例如下面的代码:
list1 = [1, 3, 5] # 列表1
list2 = [2, 4, 6, 8, 10] # 列表2
result = map(lambda x, y: x + y, list1, list2) # 返回一个迭代器对象
# [3, 7, 11]
print(list(result)) # 使用list()函数转换为列表
注意:当map()函数传入多个可迭代对象时,参数function必须能够接收足够多的参数,以保证每个可迭代对象同一索引的值均能正确传入函数,否则将出现错误提示TypeError。
【示例5】使用 map 函数实现数据类型转换。实现将随机生成的三位数的数字分割为列表,首先将数字转换成字符型,但此时列表中的元素也同时变成了字符型数字,这时还需要通过 map() 函数对数据类型进一步转换为整型。例如,数字 612 ⇒ [‘6’,‘1’,‘2’] ⇒ [6,1,2],代码如下:
import random
# 随机生成10个三位数的数字
data_list = random.sample(range(100, 1000), 10)
for i in data_list:
# 将随机的三位数分割为列表,并使用map()函数将字符型数字转换为整型
print(str(i))
num_list = list(map(int, str(i)))
print(num_list)
五、range() 函数——生成器函数
range() 函数用于生成一个新的 range 类型,多用于 for 循环语句中,用于生成指定范围的整数。range() 函数的语法格式如下:
range(start,end,step)
参数说明:
- start:表示起始整数(包含起始整数),默认起始值为 0,起始整数可以省略,如果省略则表示从 0 开始。
- end:表示结束整数(但不包括该值,如 range(7) 得到的值为 0~6,不包括7),结束数值不能省略。当 range() 函数中只有一个参数时,即表示指定计数的结束值。结束整数可以大于 0,也可以小于或等于 0,但是结束整数小于或等于 0 时,生成的 range 对象是不包含任何元素的。
- step:表示步长,即两个数之间的间隔,参数 step 可以省略,如果省略则表示步长为 1。例如,range(1,7) 将得到 1、2、3、4、5、6。
- 返回值:返回一个 range 对象。
range()函数接收的参数必须是整数,不能是浮点数等其他数据类型,否则会提示类型错误。在使用range()函数时,如果只有一个参数,那么表示指定的是stop结束整数;如果是两个参数,则表示指定的是start开始整数和end结束整数;只有三个参数都存在时,最后一个参数才表示step步长。
【示例1】根据提供的参数生成一个range类型。
【示例2】使用list()函数将range类型转换为列表。
【示例3】使用range()函数实现数字的累加。使用range()函数实现从1到100的累加,代码如下:
result = 0 # 保存累加结果的变量
for i in range(101):
result += i # 实现累加功能
print(result) # 在循环结束时输出结果
【示例4】遍历字符串。下面使用range()函数结合for循环输出英文单词“Python”中的每个字母,代码如下:
str1 = 'Python'
for i in range(len(str1)):
print(str1[i])
【示例5】生成指定步长的数值序列。下面使用range()函数分别输出12月份中的奇数月份和偶数月份,代码如下:
num1 = range(2, 14, 2)
num2 = range(1, 13, 2)
print('偶数月份:', end=' ') # 输出偶数月份
for i in num1:
print(i, end=' ')
print('\\n', end='') # 换行
print('奇数月份:', end=' ') # 输出奇数月份
for i in num2:
print(i, end=' ')
运行程序,输出结果为:
偶数月份: 2 4 6 8 10 12
奇数月份: 1 3 5 7 9 11
六、reversed ()函数——反转序列对象
reversed() 函数用于反转一个序列对象,将其元素从后向前颠倒构建成一个新的迭代器,reversed() 函数的语法格式如下:
reversed(seq)
参数说明:
- seq:序列,如列表、元组、字符串或 range 对象等。
- 返回值:返回一个反转的迭代器。
【示例1】反转迭代器对象转换为列表后输出。
str1 = reversed('amo') # 定义字符串
print(str1) # 返回一个反转的迭代器
print(list(str1)) # 使用list()函数将可迭代对象转换为列表
list1 = [1001, 888, 999, 666] # 列表
print(list(reversed(list1)))
num = range(0, 101, 10) # range对象
print(list(reversed(num)))
tuple1 = ('Python', 'Java', 'C语言') # 元组
print(list(reversed(tuple1)))
运行程序,输出结果为:
<reversed object at 0x00000279954C5790>
['o', 'm', 'a']
[666, 999, 888, 1001]
[100, 90, 80, 70, 60, 50, 40, 30, 20, 10, 0]
['C语言', 'Java', 'Python']
【示例2】反转数字列表并排序。定义一个保存Python成绩的列表,然后使用sort()方法排序,使用reversed()函数对列表反转,实现降序排序,代码如下:
num_list = [100, 85, 56, 59, 75, 77] # 分数列表
num_list.sort() # 对分数排序
print(num_list)
print(list(reversed(num_list))) # 降序输出
【示例3】将部分列表元素反转。
a = [1, '23', 4, 5, 6]
ra = list(reversed(a[:3]))
print(ra) # [4, '23', 1]
a[0:3] = ra
print(a) # [4, '23', 1, 5, 6]
七、sorted() 函数——对可迭代对象进行排序
sorted() 函数用于对可迭代对象进行 排序,返回一个重新排序的列表,当使用该函数进行排序后,原列表的元素顺序不变。语法格式如下:
sorted(iterable, key=None, reverse=False):
参数说明如下:
- iterable:表示可迭代对象,如列表、字符串、字典等。
- key:可选参数,可选参数 key 是一个函数(方法),用来指定排序的规则(即按照指定的方法或函数对可迭代对象进行排序)。例如,设置 key=str.lower,表示可迭代对象中的每个元素转换为小写字母后再进行排序,返回的仍然是可迭代对象中的元素。默认 key=None,表示直接比较元素进行排序。
- reverse:可选参数,排序规则,默认 reverse=False,表示升序排列,如果 reverse=True,则表示降序排列。
- 返回值:返回重新排序的列表。
【示例1】对数字列表进行排序。定义一个保存 10 名学生高考理科成绩在 600 分以上的列表,然后应用 sorted() 函数对其进行升序和降序排列,代码如下:
grade_list = [656, 602, 610, 618, 663, 695, 622, 645, 677, 640] # 10名600分以上的学生成绩列表
# 升序列表: [602, 610, 618, 622, 640, 645, 656, 663, 677, 695]
print(f"升序列表: {sorted(grade_list)}") # 升序排序
# 降序列表: [695, 677, 663, 656, 645, 640, 622, 618, 610, 602]
print(f"降序列表: {sorted(grade_list, reverse=True)}") # 降序排序
【示例2】对字符列表进行排序。定义一个保存字符的列表,然后应用 sorted() 函数对其进行排序,并指定参数 key=str.lower
,代码如下:
char_list = ['a', 'b', 'c', 'd', '*', 'M', 'R', 'S', 'O', 'F', 'T'] # 定义列表
# 默认按字符ASCII码进行排序
# 升序: ['*', 'F', 'M', 'O', 'R', 'S', 'T', 'a', 'b', 'c', 'd']
print(f"升序: {sorted(char_list)}") # 进行升序排列
# 降序: ['d', 'c', 'b', 'a', 'T', 'S', 'R', 'O', 'M', 'F', '*']
print(f"降序: {sorted(char_list, reverse=True)}") # 进行降序排列
# 转换为小写字母后升序: ['*', 'a', 'b', 'c', 'd', 'F', 'M', 'O', 'R', 'S', 'T']
print(f"转换为小写字母后升序: {sorted(char_list, key=str.lower)}")
# 转换为小写字母后升序: ['T', 'S', 'R', 'O', 'M', 'F', 'd', 'c', 'b', 'a', '*']
print(f"转换为小写字母后升序: {sorted(char_list, key=str.lower, reverse=True)}")
* 的 ASCII 值为 41,A 的 ASCII 值为 65,a 的 ASCII 值为 97。
【示例3】按照列表中嵌套元组的指定元素进行排序。依据英语小 A 班学生列表 students 中元组的第 1 个下标值 (年龄) 和 第 2 个下标值 (身高) 进行升序和降序排列,代码如下:
# 定义列表(姓名、年龄以上是关于吐血整理Python 常用的几种高阶函数和简单的迭代函数的主要内容,如果未能解决你的问题,请参考以下文章
吐血整理Python 常用的数学运算与统计函数(附视频讲解)