文章目录
- map
- 使用示例:
- filter
- 示例:
- 注意事项:
- sorted
- `sorted()` 与 `list.sort()` 的区别:
- any
- 示例:
- all
- 示例:
- any 与 all 的对比
- zip
- 示例:
- 常见用途:
- enumerate
- 示例:
- 常见用途:
- reverse
- 示例:
- 注意:
- sum
- 示例:
- 注意事项:
- max / min
- 1. `max()` 函数
- 示例:
- 2. `min()` 函数
- 示例:
- 3. `max()` 与 `min()` 的共同特性
- 4. 注意事项
map
map()
用于将指定函数应用于给定可迭代对象(列表、元组等)的每个元素,并返回一个由结果组成的迭代器。
语法:
map(function, iterable, ...)
function
: 用于处理每个元素的函数。iterable
: 一个或多个可迭代对象(如列表、元组等)。- 如果传入多个可迭代对象,
function
必须接受相同数量的参数。
返回值:
map()
函数返回一个迭代器,它可以生成应用 function
后的结果。如果需要结果为列表或其他数据结构,可以通过 list()
或 tuple()
将其转换。
使用示例:
1. 基本示例:
假设我们有一个列表,想要将每个元素加倍:
def double(x):
return x * 2
numbers = [1, 2, 3, 4]
result = map(double, numbers)
# 将map对象转换为列表查看结果
result_list = list(result)
print(result_list) # 输出: [2, 4, 6, 8]
对于上面的代码,如果不想单独定义一个函数,可以使用 lambda
表达式:
numbers = [1, 2, 3, 4]
result = map(lambda x: x * 2, numbers)
result_list = list(result)
print(result_list) # 输出: [2, 4, 6, 8]
2. 多个可迭代对象:
map()
可以接受多个可迭代对象,并且 function
必须能够接受多个参数。它会并行地对多个可迭代对象的元素进行操作。
def add(x, y):
return x + y
a = [1, 2, 3]
b = [4, 5, 6]
result = map(add, a, b)
result_list = list(result)
print(result_list) # 输出: [5, 7, 9]
3. 处理不同长度的可迭代对象:
如果传入的可迭代对象长度不相等,map()
会根据最短的可迭代对象的长度进行迭代。
a = [1, 2, 3]
b = [4, 5]
result = map(add, a, b)
result_list = list(result)
print(result_list) # 输出: [5, 7]
filter
filter()
用于从可迭代对象中过滤出符合条件的元素。filter()
函数会遍历给定的可迭代对象,并将符合特定条件的元素返回。
语法:
filter(function, iterable)
function
:这是一个用于过滤的函数,它接收可迭代对象的每个元素并返回布尔值True
或False
。- 如果返回
True
,则该元素将被保留。 - 如果返回
False
,则该元素将被过滤掉。
- 如果返回
iterable
:可迭代对象(如列表、元组、集合等),即希望从中筛选元素的对象。
返回值:
filter()
函数返回一个 迭代器,我们可以使用list()
或tuple()
等函数将其转换为列表或元组等其他数据结构。
示例:
示例 1:过滤偶数
使用 filter()
函数来从一个数字列表中筛选出偶数:先定义一个函数,该函数检查一个数是否是偶数。后将其传递给 filter()
函数。
# 定义一个函数,判断一个数字是否为偶数
def is_even(x):
return x % 2 == 0
# 一个包含整数的列表
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 使用 filter 函数筛选出偶数
even_numbers = filter(is_even, numbers)
# 将 filter 对象转换为列表,并打印结果
print(list(even_numbers)) # 输出: [2, 4, 6, 8]
示例 2:过滤大于 5 的数字(lambda)
从一个列表中筛选出所有大于 5 的数字,使用 filter()
配合一个 lambda 表达式来实现。
# 使用 lambda 函数判断数字是否大于 5
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 使用 filter 筛选大于 5 的数字
greater_than_five = filter(lambda x: x > 5, numbers)
# 将 filter 对象转换为列表,并打印结果
print(list(greater_than_five)) # 输出: [6, 7, 8, 9]
示例 3:过滤空字符串
有一个包含字符串的列表,希望过滤掉其中的空字符串,只保留非空字符串。
# 一个包含字符串的列表
strings = ["apple", "", "banana", "", "cherry", ""]
# 使用 filter 筛选出非空字符串
non_empty_strings = filter(None, strings)
# 将 filter 对象转换为列表,并打印结果
print(list(non_empty_strings)) # 输出: ['apple', 'banana', 'cherry']
在这个例子中,None
被作为 filter()
的第一个参数。Python 会将 None
视为布尔值 False
或 True
。空字符串被视为 False
,而非空字符串被视为 True
,因此空字符串会被过滤掉。
注意事项:
-
返回类型:
filter()
函数返回的是一个 迭代器,而不是一个列表。如果需要结果是列表或其他类型的集合,要显式地将其转换为列表或其他数据结构,比如使用list()
、tuple()
等。 -
使用
None
作为函数:当filter()
的第一个参数是None
时,它会对可迭代对象中的每个元素进行布尔值检查。空值(如None
、0
、""
等)会被视为False
,其他值则视为True
。 -
性能:
filter()
使用惰性评估,即它不会立即处理所有元素,而是按需生成结果。这使得filter()
在处理大数据集时非常高效。# 生成一个大列表 numbers = list(range(1, 1000000)) # 使用 filter 筛选出偶数 even_numbers = filter(lambda x: x % 2 == 0, numbers) # 将 filter 对象转换为列表,并打印前 10 个元素 print(list(even_numbers)[:10]) # 输出: [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
在处理大数据集时,
filter()
是非常高效的,因为它是惰性求值的,只有在需要时才会进行计算。
sorted
sorted()
用于对可迭代对象进行排序。它返回一个新的排好序的列表,而不会改变原有的可迭代对象。sorted
可以用来对列表、元组、字符串、字典等可迭代对象进行排序。
语法:
sorted(iterable, key=None, reverse=False)
- iterable:必须提供一个可迭代对象(如列表、元组、字符串等)作为输入。
- key:一个函数,用来从每个元素中提取出用于比较的值,默认为
None
。如果提供了key
函数,它会对可迭代对象中的每个元素调用该函数,返回值将用于排序。key
参数常用于自定义排序的需求。 - reverse:布尔值,默认为
False
,表示按升序排序。如果设置为True
,则按降序排序。
返回值
sorted()
返回一个新的列表,包含排好序的元素。
示例 1:基本排序
- 如果没有提供
key
或reverse
参数,sorted()
会按升序对可迭代对象进行排序。 - 通过设置
reverse=True
,可以按降序对元素进行排序。
numbers = [4, 2, 9, 1, 5, 6]
# 按升序排序
sorted_numbers = sorted(numbers)
# 按降序排序
sorted_numbers_desc = sorted(numbers, reverse=True)
print(sorted_numbers) # 输出: [1, 2, 4, 5, 6, 9]
print(sorted_numbers_desc) # 输出: [9, 6, 5, 4, 2, 1]
示例 2:使用 key
参数进行排序
key
参数通常与自定义函数或 lambda
表达式一起使用,用于指定排序规则。它会根据返回的值对元素进行排序。
# 按字符串长度排序
words = ["banana", "apple", "kiwi", "orange"]
# 使用 key 参数按字符串的长度排序
sorted_words = sorted(words, key=len)
print(sorted_words) # 输出: ['kiwi', 'apple', 'banana', 'orange']
在这个例子中,key=len
表示使用字符串的长度作为排序依据。
示例 3:对元组列表进行排序
对于包含元组的列表,可以指定按元组的某个元素进行排序。
# 一个包含元组的列表
people = [("Alice", 30), ("Bob", 25), ("Charlie", 35), ("David", 20)]
# 按年龄(元组的第二个元素)排序
sorted_people = sorted(people, key=lambda x: x[1])
print(sorted_people) # 输出: [('David', 20), ('Bob', 25), ('Alice', 30), ('Charlie', 35)]
示例 4:排序字符串
字符串可以按字母顺序进行排序。
# 字符串
text = "hello"
# 将字符串按字母顺序排序
sorted_text = sorted(text)
print(sorted_text) # 输出: ['e', 'h', 'l', 'l', 'o']
示例 5:自定义排序规则
可以通过传递自定义的 key
函数来创建复杂的排序规则。
# 自定义排序规则,按字符串的最后一个字母排序
words = ["banana", "apple", "kiwi", "orange"]
# 按最后一个字母排序
sorted_words = sorted(words, key=lambda x: x[-1])
print(sorted_words) # 输出: ['banana', 'kiwi', 'orange', 'apple']
示例 6:排序字典
如果想对字典进行排序,通常可以选择按键或按值排序。
- 按字典的键排序:
# 一个字典
grades = {"Alice": 88, "Bob": 95, "Charlie": 85, "David": 92}
# 按字典的键排序
sorted_grades_by_key = sorted(grades)
print(sorted_grades_by_key) # 输出: ['Alice', 'Bob', 'Charlie', 'David']
- 按字典的值排序:
如果需要按字典中的值排序,可以使用key
参数,指定根据值进行排序。
# 按字典的值排序
sorted_grades_by_value = sorted(grades.items(), key=lambda x: x[1])
print(sorted_grades_by_value) # 输出: [('Charlie', 85), ('Alice', 88), ('David', 92), ('Bob', 95)]
示例 7:对嵌套列表排序
如果有一个嵌套列表,想要根据某个子元素进行排序,可以用 key
来指定排序的依据。
# 一个嵌套列表
nested_list = [[3, 4], [1, 2], [5, 6], [2, 7]]
# 按每个子列表的第一个元素排序
sorted_nested_list = sorted(nested_list, key=lambda x: x[0])
print(sorted_nested_list) # 输出: [[1, 2], [2, 7], [3, 4], [5, 6]]
性能
sorted()
使用 Timsort 算法,这是一种混合排序算法,具有 O(n log n) 的时间复杂度。对于大部分数据集,sorted()
是非常高效的。- 它会返回一个新的列表,原始的可迭代对象不会被修改。
sorted()
与 list.sort()
的区别:
sorted()
是一个内置函数,它返回一个新的排好序的列表,而不会修改原始对象。list.sort()
是列表对象的方法,它直接修改列表本身,排序是就地进行的,并且它不会返回任何值。
any
any()
用于判断一个可迭代对象中的元素是否至少有一个为 True
。如果是,则返回 True
,否则返回 False
。在检查过程中,any()
会依次遍历可迭代对象的元素,一旦发现有一个元素的值为 True
,它就会立即返回 True
,不再继续检查后续元素。如果没有元素为 True
,则返回 False
。
语法:
any(iterable)
- iterable:一个可迭代对象(如列表、元组、集合等),可以是任意类型的对象,只要它是可迭代的。
返回值:
- 如果 iterable 中至少有一个元素为
True
,则返回True
。 - 如果 iterable 中没有任何元素为
True
,或者 iterable 为空,返回False
。
特点:
any()
会对整个可迭代对象进行遍历。- 对于任何空的可迭代对象,
any()
总是返回False
,这是因为没有元素可以为True
。 any()
判断的是元素的布尔值,意味着它会自动将元素转换为布尔值进行判断。
示例:
示例 1:基本用法
values = [0, 1, 2, 3]
result = any(values)
print(result) # 输出: True
在这个例子中,values
列表中的元素有 0
(False)和 1, 2, 3
(True)。因为列表中至少有一个元素为 True
,所以 any()
返回 True
。
示例 2:没有任何 True
的元素
values = [0, False, None]
result = any(values)
print(result) # 输出: False
列表 values
中的所有元素都被认为是 False
(0
,False
,None
),所以 any()
返回 False
。
示例 3:空可迭代对象
values = []
result = any(values)
print(result) # 输出: False
对于空的可迭代对象,any()
始终返回 False
,因为没有元素可以为 True
。
示例 4:判断字符串是否包含非空字符
strings = ["", "", "hello", ""]
result = any(strings)
print(result) # 输出: True
在这个例子中,字符串列表中有一个非空字符串 "hello"
,它被视为 True
,因此 any()
返回 True
。
示例 5:与条件结合使用
any()
可以与条件语句结合,检查某些条件是否满足。比如,检查一个列表中的数字是否大于 10。
numbers = [1, 5, 10, 15]
result = any(num > 10 for num in numbers)
print(result) # 输出: True
在这个例子中,我们使用 any()
与生成器表达式结合,检查列表中是否有任何一个数字大于 10。因为 15
满足条件,所以返回 True
。
示例 6:与自定义函数结合使用
可以将 any()
与自定义函数结合使用,来判断是否存在符合某种条件的元素。
students = [
{"name": "Alice", "age": 20},
{"name": "Bob", "age": 25},
{"name": "Charlie", "age": 19}
]
result = any(student["age"] >= 21 for student in students)
print(result) # 输出: True
在这个例子中,any()
与生成器表达式结合使用,检查是否有学生年龄大于等于 21。如果有,返回 True
,否则返回 False
。
示例 7:非布尔值元素
any()
对非布尔值的元素进行布尔转换。Python 中的 0
,None
,False
,空字符串,空列表等都会被认为是 False
,其余的都被认为是 True
。
values = [0, "", [], {}, 1]
result = any(values)
print(result) # 输出: True
在这个例子中,values
列表包含多个 “假” 值(0
,空字符串,空列表,空字典)和一个 “真” 值(1
)。因为有 1
这个元素,any()
返回 True
。
性能
any()
会在找到第一个True
元素时就停止遍历,这使得它比检查所有元素的方式更加高效。- 如果可迭代对象中的第一个元素为
True
,它会立即返回True
,避免对后续元素的检查。
all
all()
用于判断一个可迭代对象中的所有元素是否都为 True
。如果可迭代对象中的所有元素都为 True
,则返回 True
,否则返回 False
。如果可迭代对象为空,all()
也会返回 True
,因为没有元素违反条件。
语法:
all(iterable)
- iterable:一个可迭代对象(如列表、元组、集合等)。它可以是任何类型的可迭代对象。
返回值:
- 如果 iterable 中的所有元素都为
True
,返回True
。 - 如果 iterable 中有一个元素为
False
,返回False
。 - 如果 iterable 为空,返回
True
。
特点:
all()
会检查可迭代对象中的所有元素。- 一旦发现任何元素的布尔值为
False
,all()
就会停止检查并返回False
,否则会返回True
。 - 对于空的可迭代对象,
all()
会返回True
。这是因为空集合没有元素来满足False
,因此按逻辑推断返回True
。
示例:
示例 1:所有元素为 True
/ 部分为False
values1 = [1, 2, 3, 4]
result = all(values1)
print(result) # 输出: True
values2 = [1, 2, 0, 4]
result = all(values2)
print(result) # 输出: False
values1
列表中的所有元素都被认为是 True
(因为所有元素都不是 0
、False
或 None
)。因此,all()
返回 True
。
values2
列表中包含 0
,它被视为 False
,因此 all()
返回 False
,即使列表中其他元素为 True
。
示例 3:空的可迭代对象
values = []
result = all(values)
print(result) # 输出: True
对于空的可迭代对象,all()
返回 True
,因为没有元素来违反所有元素为 True
的条件。
示例 4:与生成器表达式结合使用
all()
可以与生成器表达式结合,检查某些条件是否对所有元素都成立。例如,检查一个列表中的数字是否都大于 10。
numbers = [11, 12, 15, 20]
result = all(num > 10 for num in numbers)
print(result) # 输出: True
上面的代码,通过生成器表达式检查所有数字是否大于 10。因为列表中的每个数字都大于 10,all()
返回 True
。
示例 5:与条件结合使用
all()
可以用于检查某些条件是否对所有元素成立。例如,检查字符串列表中的所有字符串是否为非空字符串。
strings = ["hello", "world", "python"]
result = all(s != "" for s in strings)
print(result) # 输出: True
通过all()
检查列表中的所有字符串是否非空。因为所有字符串都非空,所以返回 True
。
示例 6:非布尔值元素
all()
会对可迭代对象中的每个元素进行布尔值转换。比如,0
,False
,None
,空字符串等都会被视为 False
,其余的则视为 True
。
values = [1, True, "Non-empty string", [1, 2]]
result = all(values)
print(result) # 输出: True
列表中的所有元素都被视为 True
(1
,True
,非空字符串,非空列表),因此 all()
返回 True
。
性能
all()
会在遍历过程中检查每个元素的布尔值,直到找到一个False
元素。如果找到,便立即返回False
,从而避免了对后续元素的检查。- 对于空的可迭代对象,
all()
始终返回True
,因为空集合没有元素违反条件。
any 与 all 的对比
any()
和all()
都是用于检查可迭代对象的布尔值。any()
检查是否有至少一个元素为True
,而all()
检查是否所有元素都为True
。
values = [0, 1, 2]
print(any(values)) # 输出: True
print(all(values)) # 输出: False
zip
zip()
用于将多个可迭代对象(如列表、元组等)中的元素逐一配对,返回一个 迭代器,它生成的是 元组。这些元组由对应位置的元素组成,形成一个新的可迭代对象。
语法:
zip(*iterables)
iterables
:一个或多个可迭代对象(如列表、元组、字符串等)。可以传入任意数量的可迭代对象。*
:表示将所有传入的可迭代对象拆开。
返回值:
zip()
返回一个zip
对象,这是一个迭代器,每次迭代会返回一个元组,元组的每个元素来自对应可迭代对象的相同位置。zip()
返回的迭代器在遍历时会生成元组,但它本身并不存储这些元组,只有在实际迭代时才会生成它们。
特点:
- 配对元素:它将多个可迭代对象中的元素按顺序配对,创建元组。
- 最短长度的可迭代对象为准:如果传入多个可迭代对象,它会根据最短的可迭代对象来停止配对。也就是说,结果的长度等于最短输入可迭代对象的长度。
- 返回迭代器:
zip()
返回的是一个迭代器,如果想查看结果,需要将其转换为列表、元组或其他可迭代对象。
示例:
示例 1:配对多个列表
list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']
list3 = ['x', 'y', 'z']
result = zip(list1, list2, list3)
# 打印结果
print(list(result)) # 输出: [(1, 'a', 'x'), (2, 'b', 'y'), (3, 'c', 'z')]
zip()
将三个列表中的元素按位置配对,形成包含三元素元组的迭代器,输出 [(1, 'a', 'x'), (2, 'b', 'y'), (3, 'c', 'z')]
。
示例 2:不同长度的可迭代对象
list1 = [1, 2, 3]
list2 = ['a', 'b']
result = zip(list1, list2)
# 打印结果
print(list(result)) # 输出: [(1, 'a'), (2, 'b')]
跟map()
的匹配规则类似,zip()
根据最短的列表 list2
来停止配对。即使 list1
有更多的元素,zip()
只会配对到 list2
的元素为止。因此,结果是 [(1, 'a'), (2, 'b')]
。
示例 3:将 zip()
结果转换回原来的列表
我们可以使用 zip()
函数来反向解压原有的元组。利用 *
操作符可以将 zip
对象解压回原来的多个列表。
list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']
zipped = zip(list1, list2)
# 使用 * 操作符解压
unzipped = zip(*zipped)
list1, list2 = list(unzipped)
print(list1) # 输出: [1, 2, 3]
print(list2) # 输出: ['a', 'b', 'c']
在这个例子中,我们先使用 zip()
将两个列表配对,然后再使用 zip(*zipped)
将它们解压回原来的两个列表。
示例 4:与字典结合使用
zip()
也可以与字典一起使用,来构建字典。通过 zip()
创建的元组可以用作字典的键值对。
keys = ['name', 'age', 'city']
values = ['Alice', 25, 'New York']
result = dict(zip(keys, values))
print(result) # 输出: {'name': 'Alice', 'age': 25, 'city': 'New York'}
在这个例子中,zip()
将 keys
和 values
列表中的元素配对,然后 dict()
将配对的元组转换成字典。
常见用途:
- 配对元素:可以方便地将两个或多个可迭代对象中的元素按位置配对,用于并行处理多个序列。
- 解压序列:可以通过
*
运算符将zip
生成的元组解压,恢复原始的多个序列。 - 字典生成:可以将两个序列(例如一个键列表和一个值列表)通过
zip()
组合成字典。
性能
zip()
产生的是一个 迭代器,而不是一个完整的列表或元组。只有在实际迭代时,它才会生成每个元组。- 这种按需生成的特性使得
zip()
在处理大量数据时更加高效,因为它不会一次性创建整个结果,而是会逐步产生需要的结果。
enumerate
enumerate()
用于将一个可迭代对象(如列表、元组或字符串)组合成一个 索引-元素 对的迭代器(哈希)。它常用于在循环中同时获取元素的索引和值,使得代码更加简洁和易读。
语法:
enumerate(iterable, start=0)
iterable
:一个可迭代对象(如列表、元组、字符串等),即想要进行枚举的对象。start
(可选):指定索引的起始值,默认为0
。可以根据需要设置不同的起始索引值。
返回值:
enumerate()
返回一个enumerate
对象,它是一个迭代器,每次迭代返回一个元组。这个元组包含两个元素:- 索引(从
start
开始) - 可迭代对象中的元素
- 索引(从
特点:
- 索引和值的配对:
enumerate()
同时提供元素及其索引。 - 支持起始索引值的设置:通过
start
参数可以指定索引从哪个数字开始,默认为0
。 - 返回的是迭代器:
enumerate()
返回的是一个迭代器,需要通过for
循环或list()
等方式进行遍历和转换。
示例:
示例 1:遍历列表,获取元素的索引和值
fruits = ['apple', 'banana', 'cherry']
for index, fruit in enumerate(fruits):
print(f"索引: {index}, 元素: {fruit}")
# 可以通过设定start关键字,指定索引的起始值:
for index, fruit in enumerate(fruits, start=1):
# 此时print,索引从1开始
输出:
索引: 0, 元素: apple
索引: 1, 元素: banana
索引: 2, 元素: cherry
在这个例子中,enumerate()
遍历列表 fruits
,并为每个元素返回它的索引和值。可以通过 start=n
设置起始的索引值为 n
示例 2:将 enumerate()
结果转换为列表
fruits = ['apple', 'banana', 'cherry']
enumerated_fruits = list(enumerate(fruits))
print(enumerated_fruits)
输出:
[(0, 'apple'), (1, 'banana'), (2, 'cherry')]
在这个例子中,enumerate()
返回一个迭代器,它被转换为列表并打印出来。结果是一个包含元组的列表,每个元组包含元素的索引和该元素。
示例 3:使用 enumerate()
在遍历时修改元素
fruits = ['apple', 'banana', 'cherry']
for index, fruit in enumerate(fruits):
if fruit == 'banana':
fruits[index] = 'orange'
print(fruits)
输出:
['apple', 'orange', 'cherry']
在这个例子中,我们通过 enumerate()
获取元素的索引,然后在遍历过程中修改列表中的元素。
常见用途:
- 同时获取索引和值:最常见的用途是在循环中同时获得元素的索引和值,避免使用
range()
函数和手动索引的麻烦。 - 更简洁的代码:通过
enumerate()
可以使代码更简洁,无需手动维护一个索引变量。 - 在修改可迭代对象时:可以在循环中获取索引并使用它来修改可变对象(如列表)。
性能
enumerate()
本身是一个生成器,它返回的是一个迭代器,在遍历时才会生成每个索引和值的元组。因此,它比直接创建一个列表要更加节省内存,适用于处理大型数据集。
reverse
reversed()
用于返回一个可迭代对象的反向迭代器。该函数不改变原始对象,而是返回一个新的迭代器,可以按反向顺序访问原始可迭代对象的元素。
语法:
reversed(iterable)
iterable
:任何支持迭代的对象,如列表、元组、字符串、集合、字典等。
返回值:
reversed()
返回一个 反向迭代器,可以通过for
循环等方式进行遍历。需要注意的是,返回的对象是一个迭代器,而不是列表或其他数据类型。
特点:
- 不修改原对象:
reversed()
只返回一个反向的迭代器,原始的可迭代对象本身并不会被修改。 - 只能用于可迭代对象:
reversed()
适用于所有可迭代对象(如列表、元组、字符串等),但不能用于普通的数字或其他不可迭代对象。 - 返回的是迭代器:返回的反向迭代器可以按反向顺序访问元素,但如果想要获取一个反向列表或元组等数据类型,需要显式转换。
- 效率高:
reversed()
采用惰性求值,即它不会立即创建一个完整的反向列表,而是生成一个迭代器,在需要时逐个返回元素。
示例:
示例 1:反转列表 / 字符串 / 元组
numbers = [1, 2, 3, 4, 5] # 列表
reversed_numbers = reversed(numbers)
word = "hello" # 字符串
reversed_word = reversed(word)
tup = (10, 20, 30, 40, 50) # 元组
reversed_tup = reversed(tup)
# 使用for循环遍历反向迭代器
for num in reversed_numbers:
print(num)
# 将反向迭代器转换为字符串并打印
print(''.join(reversed_word))
# 将反向迭代器转换为元组并打印
print(tuple(reversed_tup))
输出:
5
4
3
2
1
olleh
(50, 40, 30, 20, 10)
示例 2:反转字典的键
my_dict = {'a': 1, 'b': 2, 'c': 3}
reversed_keys = reversed(list(my_dict.keys()))
# 使用for循环遍历反向键
for key in reversed_keys:
print(key)
输出:
c
b
a
由于字典本身是无序的(直到 Python 3.7),首先使用 list()
将字典的键转换为列表,然后对其进行反转。
转换为其他数据类型:
如果需要将反向迭代器转换为列表、元组等,可以直接使用 list()
、tuple()
等方法。
numbers = [1, 2, 3, 4]
reversed_list = list(reversed(numbers))
print(reversed_list)
输出:
[4, 3, 2, 1]
注意:
reversed()
不能直接作用于字典,因为字典是一个无序的集合(直到 Python 3.7)。需要先提取字典的键或值,或转换为列表。- 对于一些不可变的数据类型,如字符串,
reversed()
返回的是一个迭代器,如果需要得到一个新的字符串,则需要使用''.join()
或其他方法进行转换。
性能
reversed()
是一个惰性求值函数,即它不会立即创建一个完整的反向序列。它返回一个迭代器,每次迭代时按需生成反向元素,因此在处理大数据时效率较高。- 如果需要频繁访问反向数据,
reversed()
会比手动创建一个新的列表(通过切片等方式)更加节省内存和计算时间。
sum
sum()
用于对可迭代对象(如列表、元组、集合等)中的元素进行求和操作。它可以接受一个可迭代对象并返回该对象中所有元素的总和。
语法:
sum(iterable, start=0)
iterable
:一个可迭代对象,如列表、元组、集合、字典的值等。该对象中的元素应为数值类型(整数、浮点数等)。start
:这是一个可选参数,默认为0
。它指定了累加的起始值。在对iterable
中的元素求和时,会将start
加到最终的结果中。
返回值:
sum()
返回一个数值,表示可迭代对象中所有元素的和。如果提供了 start
,那么返回值为 iterable
中元素的和加上 start
。
特点:
- 支持多种可迭代对象:
sum()
可以对列表、元组、集合、字典的值等可迭代对象求和。 - 支持指定起始值:可以通过
start
参数指定从哪个值开始累加。 - 只适用于数值类型:
sum()
只能用于数值类型(整数或浮点数)的元素。如果传入非数值类型,会抛出TypeError
。
示例:
示例 1:求列表/元组等数据结构元素的和
# 求列表元素的和
_list = [1, 2, 3, 4, 5]
list_ret = sum(_list)
print(f"list_ret: {list_ret}")
# 求元组元素的和
_tuple = (10, 20, 30, 40)
tuple_ret = sum(_tuple)
print(f"tuple_ret: {tuple_ret}")
# 使用 start 参数
_list2 = [1, 2, 3, 4]
list_ret2 = sum(_list2, 10) # 从10开始累加
print(f"list_ret2: {list_ret2}")
# 求集合元素的和
_set = {5, 10, 15, 20}
set_ret = sum(_set)
print(f"set_ret: {set_ret}")
# 如果列表为空,则求的结果为0
numbers = []
result = sum(numbers)
print(f:"result: {result}") # 0
输出:
list_ret: 15
tuple_ret: 100
list_ret2: 20
set_ret: 50
result: 0
**示例 2:对字典的值求和 **
my_dict = {'a': 1, 'b': 2, 'c': 3}
result = sum(my_dict.values())
print(result)
输出:
6
字典的 values()
方法返回字典的所有值,sum()
对这些值进行求和。
性能
- 时间复杂度:
sum()
函数的时间复杂度是 O(n),其中 n 是可迭代对象中元素的个数。它需要遍历整个可迭代对象一次来进行求和。 - 空间复杂度:由于
sum()
是原地计算的,不需要额外的存储空间,因此空间复杂度为 O(1)。
注意事项:
-
类型要求:
sum()
仅适用于数值类型(整数和浮点数),如果可迭代对象中包含非数值类型元素,会引发TypeError
异常。numbers = [1, 2, '3', 4] result = sum(numbers) # 会引发 TypeError
-
不适用于非数值类型的可迭代对象:如字符串、列表中有字符串元素时,直接使用
sum()
会导致错误。如果想对字符串列表进行连接,可以使用''.join()
。 -
start
参数的类型:start
参数的类型应与iterable
中的元素类型匹配,否则也会抛出TypeError
。
max / min
max()
和 min()
分别用于获取可迭代对象中的最大值和最小值。它们也可以用于比较多个单独的元素并返回最大或最小的元素。
1. max()
函数
语法:
max(iterable, *, key=None, default=None)
max(arg1, arg2, *args, key=None)
iterable
:一个可迭代对象(如列表、元组、集合等),用于查找其中的最大值。key
:一个可选的函数,用于指定对元素进行排序的方式。key
函数会作用于每个元素,并返回用于比较的值。默认为None
,表示直接比较元素。default
:如果iterable
为空且没有提供default
参数,会抛出ValueError
。如果提供了default
,则返回default
值,防止空迭代对象时报错。
另外,max()
还可以接收多个参数而不是可迭代对象,用于返回一组单独值中的最大值。
示例:
-
从列表中找最大值:
numbers = [1, 2, 3, 4, 5] result = max(numbers) print(result)
输出:
5
max()
返回列表中最大值5
。 -
使用
key
参数:words = ["apple", "banana", "cherry", "date"] result = max(words, key=len) # 根据字符串长度找最大值 print(result)
输出:
banana
max()
返回字符串长度最大的词banana
,因为len("banana")
最大。 -
多个参数求最大值:
result = max(1, 5, 2, 7, 3) print(result)
输出:
7
max()
直接比较传入的多个值,返回最大的7
。 -
空列表提供
default
参数:numbers = [] result = max(numbers, default=0) print(result)
输出:
0
由于列表为空,返回
default
参数值0
。
2. min()
函数
语法:
min(iterable, *, key=None, default=None)
min(arg1, arg2, *args, key=None)
iterable
:一个可迭代对象,用于查找其中的最小值。key
:一个可选的函数,用于指定对元素进行排序的方式,类似max()
中的key
参数。默认为None
。default
:如果iterable
为空且没有提供default
参数,会抛出ValueError
。如果提供了default
,则返回default
值。
min()
也可以接收多个参数并返回这些值中的最小值。
示例:
-
从列表中找最小值:
numbers = [1, 2, 3, 4, 5] result = min(numbers) print(result)
输出:
1
min()
返回列表中最小值1
。 -
使用
key
参数:words = ["apple", "banana", "cherry", "date"] result = min(words, key=len) # 根据字符串长度找最小值 print(result)
输出:
apple
min()
返回字符串长度最小的词apple
。 -
多个参数求最小值:
result = min(1, 5, 2, 7, 3) print(result)
输出:
1
min()
直接比较传入的多个值,返回最小的1
。 -
空列表提供
default
参数:numbers = [] result = min(numbers, default=0) print(result)
输出:
0
由于列表为空,返回
default
参数值0
。
3. max()
与 min()
的共同特性
- 都可以处理可迭代对象:两者都可以对列表、元组、集合等可迭代对象中的元素进行比较,并返回最大值或最小值。
- 都可以使用
key
参数:可以通过key
参数提供一个函数来定制比较的规则。例如,可以通过key=len
来比较字符串的长度,而不仅仅是字面值。 - 都可以处理多个单独的参数:除可迭代对象外,
max()
和min()
还支持将多个元素作为单独的参数传入进行比较。 - 空迭代对象时提供
default
参数:如果传入的可迭代对象为空且没有指定default
,两者都会抛出ValueError
异常。但如果指定了default
参数,则返回该值。
性能
- 时间复杂度:
max()
和min()
的时间复杂度都是 O(n),其中 n 是可迭代对象中元素的数量。因为它们需要遍历整个可迭代对象一次来找到最大或最小值。 - 空间复杂度:这两个函数都是原地操作的,因此它们的空间复杂度是 O(1)。
4. 注意事项
- 空迭代对象:如果没有提供
default
参数并且传入的是空的可迭代对象,max()
和min()
都会抛出ValueError
。 - 可比性:
max()
和min()
依赖于元素之间的比较运算符(<
、>
等)。如果迭代对象中的元素不可比较(例如,包含不同类型的元素),会引发TypeError
。