Python迭代数字序列的内置函数介绍
2023-10-298.0k 阅读
Python迭代数字序列的内置函数介绍
range()函数
- 基本概念
range()
是Python中用于生成整数序列的内置函数。它在需要迭代一定范围的数字时非常有用,比如在循环中控制迭代次数。其基本语法有三种形式:range(stop)
:生成一个从0开始,到stop
结束(但不包括stop
)的整数序列。range(start, stop)
:生成一个从start
开始,到stop
结束(不包括stop
)的整数序列。range(start, stop, step)
:生成一个从start
开始,到stop
结束(不包括stop
),步长为step
的整数序列。
- 原理分析
range()
函数返回的是一个range
对象,这是一个可迭代对象,但它并不是立即生成所有的数字,而是在迭代过程中按需生成,这种方式被称为惰性求值。这样做的好处是在处理大范围数字序列时,不会占用过多的内存。例如,当你创建一个range(1000000)
对象时,并不会一次性在内存中创建包含一百万个数的列表,只有在实际迭代时才会逐个生成这些数字。
- 代码示例
# 形式一:range(stop)
for i in range(5):
print(i)
# 形式二:range(start, stop)
for i in range(2, 7):
print(i)
# 形式三:range(start, stop, step)
for i in range(1, 10, 2):
print(i)
- 在第一个示例中,
range(5)
生成的序列是0, 1, 2, 3, 4
,因为它从0开始,到5结束但不包括5。第二个示例range(2, 7)
生成2, 3, 4, 5, 6
。第三个示例range(1, 10, 2)
生成1, 3, 5, 7, 9
,步长为2。
enumerate()函数
- 基本概念
enumerate()
函数用于将一个可迭代对象(如列表、元组、字符串等)组合为一个索引序列,同时列出数据和数据的索引。其语法为enumerate(iterable, start=0)
,iterable
是要迭代的对象,start
是索引的起始值,默认为0。
- 原理分析
enumerate()
函数在内部通过迭代器协议工作。它会创建一个新的迭代器对象,该对象在每次迭代时返回一个包含索引和对应元素的元组。这个过程是基于对传入的可迭代对象的迭代,每次从可迭代对象中获取一个元素,并与当前的索引值组合成元组返回。
- 代码示例
fruits = ['apple', 'banana', 'cherry']
for index, fruit in enumerate(fruits):
print(f'{index}: {fruit}')
for index, fruit in enumerate(fruits, start = 1):
print(f'{index}: {fruit}')
- 在第一个示例中,
enumerate(fruits)
将fruits
列表与索引组合,从0开始,所以输出为0: apple
,1: banana
,2: cherry
。在第二个示例中,通过设置start = 1
,索引从1开始,输出为1: apple
,2: banana
,3: cherry
。
zip()函数
- 基本概念
zip()
函数用于将多个可迭代对象(如列表、元组等)中的元素按顺序配对,返回一个由这些配对组成的可迭代对象。其语法为zip(*iterables)
,*iterables
表示可以传入多个可迭代对象。
- 原理分析
zip()
函数通过并行迭代多个可迭代对象来工作。它创建一个迭代器,该迭代器从每个可迭代对象中同时取出一个元素,将这些元素组合成一个元组,直到最短的可迭代对象耗尽。例如,如果有两个列表[1, 2, 3]
和['a', 'b']
,zip()
会将它们组合为[(1, 'a'), (2, 'b')]
,因为第二个列表只有两个元素。
- 代码示例
list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']
result = list(zip(list1, list2))
print(result)
list3 = [10, 20]
result2 = list(zip(list1, list2, list3))
print(result2)
- 在第一个示例中,
zip(list1, list2)
将list1
和list2
的元素配对,生成[(1, 'a'), (2, 'b'), (3, 'c')]
。在第二个示例中,zip(list1, list2, list3)
由于list3
最短,只组合了两个元素,生成[(1, 'a', 10), (2, 'b', 20)]
。
reversed()函数
- 基本概念
reversed()
函数用于返回一个反向的迭代器,它接受一个序列(如列表、元组、字符串等)作为参数,并返回一个可迭代对象,该对象按相反的顺序生成原序列中的元素。
- 原理分析
reversed()
函数在内部利用了序列的__reversed__
方法(如果序列对象实现了该方法)。如果没有实现__reversed__
方法,它会使用切片的方式[::-1]
来创建反向的迭代器。它并不会修改原序列,而是返回一个新的迭代器对象,通过这个迭代器可以按反向顺序访问原序列的元素。
- 代码示例
my_list = [1, 2, 3, 4, 5]
rev_iter = reversed(my_list)
for num in rev_iter:
print(num)
my_string = 'hello'
rev_string_iter = reversed(my_string)
print(''.join(rev_string_iter))
- 在第一个示例中,
reversed(my_list)
返回一个反向的迭代器,通过循环打印出5, 4, 3, 2, 1
。在第二个示例中,reversed(my_string)
返回反向迭代器,通过join
方法将其转换为反向的字符串olleh
。
sum()函数
- 基本概念
sum()
函数用于对可迭代对象(如列表、元组等)中的元素进行求和。其语法为sum(iterable, start = 0)
,iterable
是要求和的可迭代对象,start
是起始值,默认为0。
- 原理分析
sum()
函数通过迭代可迭代对象中的元素,并将每个元素与当前的累加值相加。从起始值start
开始,依次将可迭代对象中的元素加到start
上,最终返回累加的结果。对于数值类型的可迭代对象,这种操作很直观。但需要注意的是,可迭代对象中的元素必须是可与start
进行加法运算的类型。
- 代码示例
num_list = [1, 2, 3, 4, 5]
total = sum(num_list)
print(total)
total_with_start = sum(num_list, 10)
print(total_with_start)
- 在第一个示例中,
sum(num_list)
对num_list
中的元素求和,结果为1 + 2+3 + 4+5 = 15
。在第二个示例中,sum(num_list, 10)
从10开始累加,结果为10 + 1+2 + 3+4+5 = 25
。
max()和min()函数
- 基本概念
max()
函数用于返回可迭代对象中的最大值,min()
函数用于返回可迭代对象中的最小值。它们的语法为max(iterable, *[, key, default])
和min(iterable, *[, key, default])
。iterable
是要操作的可迭代对象,key
是一个可选的函数,用于指定比较的依据,default
是当可迭代对象为空时返回的默认值。
- 原理分析
max()
和min()
函数通过比较可迭代对象中的元素来确定最大值和最小值。对于数值类型的可迭代对象,比较是直接的数值比较。当使用key
参数时,会先对每个元素应用key
函数,然后根据key
函数返回的结果进行比较。例如,当对一个包含字典的列表使用key
函数时,可以根据字典的某个键来比较。如果可迭代对象为空且没有提供default
值,会引发ValueError
异常。
- 代码示例
num_list = [1, 5, 3, 7, 4]
max_num = max(num_list)
min_num = min(num_list)
print(f'Max: {max_num}, Min: {min_num}')
words = ['apple', 'banana', 'cherry']
longest_word = max(words, key = len)
print(longest_word)
empty_list = []
# 不提供default值会引发ValueError
# min_empty = min(empty_list)
min_empty = min(empty_list, default = 'N/A')
print(min_empty)
- 在第一个示例中,
max(num_list)
返回7
,min(num_list)
返回1
。在第二个示例中,max(words, key = len)
根据字符串长度比较,返回最长的单词'banana'
。在第三个示例中,由于empty_list
为空,提供default = 'N/A'
,所以min(empty_list, default = 'N/A')
返回'N/A'
。
all()和any()函数
- 基本概念
all()
函数用于判断可迭代对象中的所有元素是否都为真(对于布尔值,True
为真,False
为假;对于其他类型,空值、零值等为假,非空值、非零值等为真)。any()
函数用于判断可迭代对象中是否至少有一个元素为真。它们的语法为all(iterable)
和any(iterable)
。
- 原理分析
all()
函数通过迭代可迭代对象中的元素,只要有一个元素为假,就立即返回False
,只有当所有元素都为真时才返回True
。any()
函数则相反,只要有一个元素为真,就立即返回True
,只有当所有元素都为假时才返回False
。这种实现方式利用了短路求值的特性,提高了效率。
- 代码示例
bool_list1 = [True, True, True]
bool_list2 = [True, False, True]
bool_list3 = [False, False, False]
result_all1 = all(bool_list1)
result_all2 = all(bool_list2)
result_all3 = all(bool_list3)
result_any1 = any(bool_list1)
result_any2 = any(bool_list2)
result_any3 = any(bool_list3)
print(f'all(bool_list1): {result_all1}')
print(f'all(bool_list2): {result_all2}')
print(f'all(bool_list3): {result_all3}')
print(f'any(bool_list1): {result_any1}')
print(f'any(bool_list2): {result_any2}')
print(f'any(bool_list3): {result_any3}')
num_list = [1, 2, 3]
non_zero_result = all(num_list)
print(f'all(num_list): {non_zero_result}')
num_list_with_zero = [1, 0, 3]
non_zero_result2 = all(num_list_with_zero)
print(f'all(num_list_with_zero): {non_zero_result2}')
- 在布尔列表的示例中,
all(bool_list1)
返回True
,因为所有元素都为True
;all(bool_list2)
返回False
,因为有一个False
元素;all(bool_list3)
返回False
。any(bool_list1)
返回True
,any(bool_list2)
返回True
,any(bool_list3)
返回False
。在数值列表示例中,all(num_list)
返回True
,因为所有元素都非零;all(num_list_with_zero)
返回False
,因为有一个零元素。
map()函数
- 基本概念
map()
函数用于将一个函数应用到可迭代对象的每个元素上,并返回一个新的可迭代对象,其中包含应用函数后的结果。其语法为map(function, iterable, ...)
,function
是要应用的函数,iterable
是要迭代的对象,可以有多个可迭代对象作为参数。
- 原理分析
map()
函数通过迭代iterable
对象,对每个元素调用function
函数,并将函数的返回值作为新的可迭代对象的元素。如果有多个可迭代对象作为参数,map()
会并行迭代这些可迭代对象,将对应位置的元素作为function
的参数。例如,如果有两个列表[1, 2, 3]
和[4, 5, 6]
,以及一个接受两个参数的函数add
,map(add, [1, 2, 3], [4, 5, 6])
会依次调用add(1, 4)
,add(2, 5)
,add(3, 6)
。
- 代码示例
def square(x):
return x * x
num_list = [1, 2, 3, 4, 5]
squared_list = list(map(square, num_list))
print(squared_list)
def add(x, y):
return x + y
list1 = [1, 2, 3]
list2 = [4, 5, 6]
sum_list = list(map(add, list1, list2))
print(sum_list)
- 在第一个示例中,
map(square, num_list)
将square
函数应用到num_list
的每个元素上,返回一个新的可迭代对象,通过list()
转换为列表[1, 4, 9, 16, 25]
。在第二个示例中,map(add, list1, list2)
将add
函数应用到list1
和list2
对应位置的元素上,返回[5, 7, 9]
。
filter()函数
- 基本概念
filter()
函数用于根据指定的函数过滤可迭代对象中的元素,返回一个新的可迭代对象,其中只包含使函数返回True
的元素。其语法为filter(function, iterable)
,function
是用于过滤的函数,iterable
是要过滤的可迭代对象。
- 原理分析
filter()
函数通过迭代iterable
对象,对每个元素调用function
函数。如果function
函数返回True
,则该元素被包含在返回的可迭代对象中;如果返回False
,则该元素被过滤掉。例如,对于一个数值列表和一个判断是否为偶数的函数,filter(is_even, num_list)
会返回列表中所有的偶数。
- 代码示例
def is_even(x):
return x % 2 == 0
num_list = [1, 2, 3, 4, 5, 6]
even_list = list(filter(is_even, num_list))
print(even_list)
- 在这个示例中,
filter(is_even, num_list)
将is_even
函数应用到num_list
的每个元素上,过滤出偶数,返回[2, 4, 6]
。
reduce()函数
- 基本概念
reduce()
函数在Python 3中被移动到了functools
模块中。它用于对可迭代对象进行累积计算,将一个函数作用于可迭代对象的元素上,将其结果与下一个元素继续作为函数的参数进行计算,直到处理完所有元素,返回最终的累积结果。其语法为reduce(function, iterable[, initializer])
,function
是用于累积计算的函数,iterable
是要处理的可迭代对象,initializer
是可选的初始值。
- 原理分析
reduce()
函数首先从可迭代对象中取出前两个元素作为function
的参数进行计算,得到一个中间结果。然后,这个中间结果与可迭代对象中的下一个元素一起作为function
的参数再次进行计算,如此反复,直到处理完所有元素。如果提供了initializer
,则第一次计算时,initializer
作为第一个参数,可迭代对象的第一个元素作为第二个参数。
- 代码示例
from functools import reduce
def multiply(x, y):
return x * y
num_list = [1, 2, 3, 4]
product = reduce(multiply, num_list)
print(product)
product_with_init = reduce(multiply, num_list, 2)
print(product_with_init)
- 在第一个示例中,
reduce(multiply, num_list)
计算1 * 2 * 3 * 4 = 24
。在第二个示例中,reduce(multiply, num_list, 2)
从初始值2开始计算,结果为2 * 1 * 2 * 3 * 4 = 48
。