MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

Python迭代数字序列的内置函数介绍

2023-10-298.0k 阅读

Python迭代数字序列的内置函数介绍

range()函数

  1. 基本概念
    • range() 是Python中用于生成整数序列的内置函数。它在需要迭代一定范围的数字时非常有用,比如在循环中控制迭代次数。其基本语法有三种形式:
      • range(stop):生成一个从0开始,到stop结束(但不包括stop)的整数序列。
      • range(start, stop):生成一个从start开始,到stop结束(不包括stop)的整数序列。
      • range(start, stop, step):生成一个从start开始,到stop结束(不包括stop),步长为step的整数序列。
  2. 原理分析
    • range()函数返回的是一个range对象,这是一个可迭代对象,但它并不是立即生成所有的数字,而是在迭代过程中按需生成,这种方式被称为惰性求值。这样做的好处是在处理大范围数字序列时,不会占用过多的内存。例如,当你创建一个range(1000000)对象时,并不会一次性在内存中创建包含一百万个数的列表,只有在实际迭代时才会逐个生成这些数字。
  3. 代码示例
# 形式一: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()函数

  1. 基本概念
    • enumerate() 函数用于将一个可迭代对象(如列表、元组、字符串等)组合为一个索引序列,同时列出数据和数据的索引。其语法为enumerate(iterable, start=0)iterable是要迭代的对象,start是索引的起始值,默认为0。
  2. 原理分析
    • enumerate()函数在内部通过迭代器协议工作。它会创建一个新的迭代器对象,该对象在每次迭代时返回一个包含索引和对应元素的元组。这个过程是基于对传入的可迭代对象的迭代,每次从可迭代对象中获取一个元素,并与当前的索引值组合成元组返回。
  3. 代码示例
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: apple1: banana2: cherry。在第二个示例中,通过设置start = 1,索引从1开始,输出为1: apple2: banana3: cherry

zip()函数

  1. 基本概念
    • zip()函数用于将多个可迭代对象(如列表、元组等)中的元素按顺序配对,返回一个由这些配对组成的可迭代对象。其语法为zip(*iterables)*iterables表示可以传入多个可迭代对象。
  2. 原理分析
    • zip()函数通过并行迭代多个可迭代对象来工作。它创建一个迭代器,该迭代器从每个可迭代对象中同时取出一个元素,将这些元素组合成一个元组,直到最短的可迭代对象耗尽。例如,如果有两个列表[1, 2, 3]['a', 'b']zip()会将它们组合为[(1, 'a'), (2, 'b')],因为第二个列表只有两个元素。
  3. 代码示例
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)list1list2的元素配对,生成[(1, 'a'), (2, 'b'), (3, 'c')]。在第二个示例中,zip(list1, list2, list3)由于list3最短,只组合了两个元素,生成[(1, 'a', 10), (2, 'b', 20)]

reversed()函数

  1. 基本概念
    • reversed()函数用于返回一个反向的迭代器,它接受一个序列(如列表、元组、字符串等)作为参数,并返回一个可迭代对象,该对象按相反的顺序生成原序列中的元素。
  2. 原理分析
    • reversed()函数在内部利用了序列的__reversed__方法(如果序列对象实现了该方法)。如果没有实现__reversed__方法,它会使用切片的方式[::-1]来创建反向的迭代器。它并不会修改原序列,而是返回一个新的迭代器对象,通过这个迭代器可以按反向顺序访问原序列的元素。
  3. 代码示例
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()函数

  1. 基本概念
    • sum()函数用于对可迭代对象(如列表、元组等)中的元素进行求和。其语法为sum(iterable, start = 0)iterable是要求和的可迭代对象,start是起始值,默认为0。
  2. 原理分析
    • sum()函数通过迭代可迭代对象中的元素,并将每个元素与当前的累加值相加。从起始值start开始,依次将可迭代对象中的元素加到start上,最终返回累加的结果。对于数值类型的可迭代对象,这种操作很直观。但需要注意的是,可迭代对象中的元素必须是可与start进行加法运算的类型。
  3. 代码示例
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()函数

  1. 基本概念
    • max()函数用于返回可迭代对象中的最大值,min()函数用于返回可迭代对象中的最小值。它们的语法为max(iterable, *[, key, default])min(iterable, *[, key, default])iterable是要操作的可迭代对象,key是一个可选的函数,用于指定比较的依据,default是当可迭代对象为空时返回的默认值。
  2. 原理分析
    • max()min()函数通过比较可迭代对象中的元素来确定最大值和最小值。对于数值类型的可迭代对象,比较是直接的数值比较。当使用key参数时,会先对每个元素应用key函数,然后根据key函数返回的结果进行比较。例如,当对一个包含字典的列表使用key函数时,可以根据字典的某个键来比较。如果可迭代对象为空且没有提供default值,会引发ValueError异常。
  3. 代码示例
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)返回7min(num_list)返回1。在第二个示例中,max(words, key = len)根据字符串长度比较,返回最长的单词'banana'。在第三个示例中,由于empty_list为空,提供default = 'N/A',所以min(empty_list, default = 'N/A')返回'N/A'

all()和any()函数

  1. 基本概念
    • all()函数用于判断可迭代对象中的所有元素是否都为真(对于布尔值,True为真,False为假;对于其他类型,空值、零值等为假,非空值、非零值等为真)。any()函数用于判断可迭代对象中是否至少有一个元素为真。它们的语法为all(iterable)any(iterable)
  2. 原理分析
    • all()函数通过迭代可迭代对象中的元素,只要有一个元素为假,就立即返回False,只有当所有元素都为真时才返回Trueany()函数则相反,只要有一个元素为真,就立即返回True,只有当所有元素都为假时才返回False。这种实现方式利用了短路求值的特性,提高了效率。
  3. 代码示例
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,因为所有元素都为Trueall(bool_list2)返回False,因为有一个False元素;all(bool_list3)返回Falseany(bool_list1)返回Trueany(bool_list2)返回Trueany(bool_list3)返回False。在数值列表示例中,all(num_list)返回True,因为所有元素都非零;all(num_list_with_zero)返回False,因为有一个零元素。

map()函数

  1. 基本概念
    • map()函数用于将一个函数应用到可迭代对象的每个元素上,并返回一个新的可迭代对象,其中包含应用函数后的结果。其语法为map(function, iterable, ...)function是要应用的函数,iterable是要迭代的对象,可以有多个可迭代对象作为参数。
  2. 原理分析
    • map()函数通过迭代iterable对象,对每个元素调用function函数,并将函数的返回值作为新的可迭代对象的元素。如果有多个可迭代对象作为参数,map()会并行迭代这些可迭代对象,将对应位置的元素作为function的参数。例如,如果有两个列表[1, 2, 3][4, 5, 6],以及一个接受两个参数的函数addmap(add, [1, 2, 3], [4, 5, 6])会依次调用add(1, 4)add(2, 5)add(3, 6)
  3. 代码示例
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函数应用到list1list2对应位置的元素上,返回[5, 7, 9]

filter()函数

  1. 基本概念
    • filter()函数用于根据指定的函数过滤可迭代对象中的元素,返回一个新的可迭代对象,其中只包含使函数返回True的元素。其语法为filter(function, iterable)function是用于过滤的函数,iterable是要过滤的可迭代对象。
  2. 原理分析
    • filter()函数通过迭代iterable对象,对每个元素调用function函数。如果function函数返回True,则该元素被包含在返回的可迭代对象中;如果返回False,则该元素被过滤掉。例如,对于一个数值列表和一个判断是否为偶数的函数,filter(is_even, num_list)会返回列表中所有的偶数。
  3. 代码示例
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()函数

  1. 基本概念
    • reduce()函数在Python 3中被移动到了functools模块中。它用于对可迭代对象进行累积计算,将一个函数作用于可迭代对象的元素上,将其结果与下一个元素继续作为函数的参数进行计算,直到处理完所有元素,返回最终的累积结果。其语法为reduce(function, iterable[, initializer])function是用于累积计算的函数,iterable是要处理的可迭代对象,initializer是可选的初始值。
  2. 原理分析
    • reduce()函数首先从可迭代对象中取出前两个元素作为function的参数进行计算,得到一个中间结果。然后,这个中间结果与可迭代对象中的下一个元素一起作为function的参数再次进行计算,如此反复,直到处理完所有元素。如果提供了initializer,则第一次计算时,initializer作为第一个参数,可迭代对象的第一个元素作为第二个参数。
  3. 代码示例
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