Python Iteration 迭代
1.基础内容
1) 什么是序列,如何用for循环遍历序列中的元素
序列是一种内置数据类型,用于表示一组有序的元素。常见的序列类型包括字符串、列表和元组。序列中的元素可以通过索引来访问,第一个元素的索引为 0
2)什么是累加器,如何用for循环和累加器变量来计算序列的和、平均值、最大值等
累加器是一种常用的编程模式,用于在循环中累积计算结果。累加器通常是一个变量,它在循环的每次迭代中都会被更新,以便在循环结束时保存最终的计算结果。
可以使用 for 循环和累加器变量来计算序列的和、平均值、最大值等。例如,在下面这个简单的例子中,我们使用 for 循环和累加器变量来计算一个列表中所有元素的和:
my_list = [1, 2, 3]
total = 0
for x in my_list:
total += x
print(total) # 输出 6
在这个例子中,我们定义了一个累加器变量 total 并将其初始值设为 0。然后,在 for 循环中,我们遍历列表中的每个元素,并将其累加到 total 变量中。最后,在循环结束后,total 变量保存了列表中所有元素的和。
类似地,可以使用 for 循环和累加器变量来计算序列的平均值、最大值等。例如,在下面这个简单的例子中,我们使用 for 循环和累加器变量来计算一个列表中所有元素的平均值:
my_list = [1, 2, 3]
total = 0
count = 0
for x in my_list:
total += x
count += 1
average = total / count
print(average) # 输出 2.0
在这个例子中,我们定义了两个累加器变量:total 和 count。然后,在 for 循环中,我们遍历列表中的每个元素,并将其累加到 total 变量中,并将 count 变量递增1。最后,在循环结束后,我们使用公式 average = total / count 来计算列表中所有元素的平均值。
3)如何用range函数来生成一系列整数,以及range函数的参数和用法
range() 函数可以用来生成一系列整数。它接受一个或多个参数,用于指定要生成的整数范围。
①当 range() 函数只接受一个参数时,它会生成从 0 到该参数减 1 的整数序列。例如,range(3) 会生成序列 [0, 1, 2]。
②当 range() 函数接受两个参数时,第一个参数指定序列的起始值,第二个参数指定序列的结束值(不包括该值)。例如,range(1, 4) 会生成序列 [1, 2, 3]。
③当 range() 函数接受三个参数时,第三个参数指定序列中相邻元素之间的步长。例如,range(1, 6, 2) 会生成序列 [1, 3, 5]。
使用 range() 函数的例子:
# 使用一个参数
for i in range(3):
print(i) # 输出 0 1 2
# 使用两个参数
for i in range(1,4):
print(i) # 输出 1 2 3
# 使用三个参数
for i in range(1,6,2):
print(i) # 输出 1 3 5
4)如何用for循环和索引来修改列表中的元素
我们使用 for 循环和索引来修改列表中的元素。通常,这可以通过结合使用 range() 函数和列表索引来实现。
例如,在下面这个简单的例子中,我们使用 for 循环和索引来将一个列表中的所有元素都乘以 2:
my_list = [1, 2, 3]
for i in range(len(my_list)):
my_list[i] *= 2
print(my_list) # 输出 [2, 4, 6]
在这个例子中,我们使用 range(len(my_list)) 来生成一个包含所有有效索引的序列。然后,在 for 循环中,我们遍历这个序列,并使用循环变量 i 来访问列表中的每个元素。最后,在循环体内部,我们使用列表索引语法 my_list[i] 来修改列表中的元素。
2.重点回顾
- for x in sequence: 循环语句,用于遍历序列中的每个元素,并将其赋值给变量x
- accumulator = accumulator + x: 累加器模式,用于将每次循环中的元素与累加器变量相加,从而得到最终结果。(需要定义到for循环外,否则每次都会被重新赋值)
- range(x): 函数,用于生成从0到x-1的整数序列
1)range(a,b): 函数,用于生成从a到b-1的整数序列
2)range(a,b,s): 函数,用于生成从a开始,以s为步长,直到b-1为止的整数序列
(参看 https://www.runoob.com/python/python-func-range.html ) - list[k] = list[k]+1: 列表修改语句,用于将列表中第k个元素增加1,也可写作list[k] += 1
- for循环结构时候,对于List/Tuple是顺序循环值,对于Dict是循环每个键,Set是循环每个元素
1)当使用 for 循环遍历元组或列表时,循环变量会依次取遍历每个元素的值。
my_tuple = (1, 2, 3)
for x in my_tuple:
print(x) # 输出 1 2 3
my_list = [1, 2, 3]
for x in my_list:
print(x) # 输出 1 2 3
[扩展] 元组和列表的区别:从底层实现来看,列表和元组都采用了顺序表结构。列表底层实现是动态顺序表,其大小可以改变;而元组底层实现是静态顺序表,其空间一旦分配就不可改变。
①元组是不可变类型,这意味着一旦创建了一个元组,就不能再对它进行修改。而列表是可变类型,可以对其进行添加、删除和修改等操作。
②由于元组是不可变类型,所以它在某些方面比列表更安全。例如,在作为字典的键或集合的元素时,只能使用不可变类型。
③元组通常用来表示一组具有相关性的数据,例如一个人的姓名、年龄和性别。而列表则更多地用来表示一组相同类型但没有固定长度的数据。
2)当使用 for 循环遍历字典时,循环变量会依次取遍历字典的每个键(键是唯一的,因为采用了散列表)。如果需要同时访问键和值,可以使用 items() 方法。
my_dict = {'a': 1, 'b': 2, 'c': 3}
for key in my_dict:
print(key) # 输出 a b c
for key, value in my_dict.items():
print(key, value) # 输出 a 1 b 2 c 3
3)当使用 for 循环遍历集合时,循环变量会依次取遍历集合的每个元素(直接采用散列表,元素是唯一的不可变的;但set()集合是可变长的、无序的、有限集合;而frozenset()是不变长的、无序的)。
my_set = {1, 2, 3}
for x in my_set:
print(x) # 输出 1 2 3
3.值得注意
- 注意变量空间和函数的实参和形参
在 Python 中,函数定义时的参数称为形参,而函数调用时传入的参数称为实参。形参是在定义函数时给出的变量名,用来接收调用该函数时传入的值。实参是在调用函数时给出的具体值,它将被赋值给对应的形参。
例如,在下面这个简单的函数中,x 和 y 是形参:
def add(x, y):
return x + y
当我们调用这个函数时,比如 add(3, 4),那么 3 和 4 就是实参。在这次调用中,实参 3 被赋值给了形参 x,实参 4 被赋值给了形参 y。
同时函数参数传递的方式取决于参数的类型。对于不可变类型(如数字、字符串和元组),它们的值是通过“传值调用”来传递的,这意味着在函数内部对这些参数进行修改时,不会影响到函数外部的变量。而对于可变类型(如列表和字典),它们是通过“传引用调用”来传递的,这意味着在函数内部对这些参数进行修改时,会影响到函数外部的变量。
def my_func(my_list):
my_list.append(4)
x = [1, 2, 3]
my_func(x)
print(x) # 输出 [1, 2, 3, 4]
my_list 是形参,x 是实参。由于 x 是一个列表(可变类型),所以当我们在 my_func 函数内部对 my_list 进行修改时,实际上也就修改了 x。
- 不能在遍历List时候同时修改它的内容(避免此问题是需要遍历其副本或者序号,然后进行修改)
在 Python 中,不建议在遍历列表的同时修改它的内容,因为这样做可能会导致意想不到的结果。当你遍历一个列表时,Python 会根据列表的索引来迭代每个元素。如果你在遍历过程中修改了列表的内容(比如添加或删除元素),那么列表的索引也会随之改变,这可能会导致某些元素被遗漏或重复遍历。
如果你需要在遍历列表的同时修改它的内容,可以考虑以下几种方法:
1)创建一个新列表来存储修改后的结果。
2)遍历原列表的副本(可以使用切片操作 my_list[:] 来创建一个副本),然后对原列表进行修改。
3)使用索引来遍历列表,而不是直接迭代每个元素。