前言
本文是关于程序控制结构的习题整理和讲解
4.2
下面代码的运行结果为
for index,(f,s)in enumerate(zip((1,2,3),[4,5])):print(f, end=‘,’)
zip((1,2,3), [4,5]):zip函数将两个序列(元组(1,2,3)和列表[4,5])“压缩”成一个由元组组成的迭代器。在这个例子中,zip会生成一个迭代器,它的元素是来自两个序列的元素配对:(1, 4)和(2, 5)。注意,由于列表[4,5]比元组(1,2,3)短一个元素,所以结果只包含两个配对。
enumerate(zip((1,2,3), [4,5])):enumerate函数为zip函数生成的每个元素提供一个计数(从0开始),结果是一个包含(index, (f, s))元组的迭代器,其中index是元素的索引,(f, s)是zip函数生成的配对。
for index, (f, s) in enumerate(…):这是一个for循环,它遍历enumerate的结果。对于每次迭代,index是当前元素的索引,(f, s)是zip函数生成的配对。
print(f, end=‘,’):print函数打印出变量f的值,并使用end=','参数指定在末尾添加一个逗号而不是默认的换行符。
代码的输出是:
1,2,
补充:
zip()
zip()
是一个内置函数,它将多个可迭代对象(如列表、元组或字符串)中的元素配对,形成一个新的可迭代对象,这个对象是元组的序列。
例如,如果我们有两个列表:
list1 = [1, 2, 3]
list2 = [4, 5, 6]
使用zip(list1, list2)
会生成一个迭代器,它的元素是来自两个列表的元素配对:
<zip object at 0x7f94f2d116e0>
这个迭代器可以展开为:
[(1, 4), (2, 5), (3, 6)]
zip()
函数在遇到最短的输入序列后结束,这意味着如果输入序列的长度不同,长的序列中剩余的部分将被忽略。
enumerate()
enumerate()
是一个内置函数,它为每个元素从一个可迭代对象中生成一个包含元素索引(从0开始)和元素值的元组。
例如,如果我们有一个列表:
my_list = ['a', 'b', 'c']
使用enumerate(my_list)
会生成一个迭代器,它的元素是包含索引和值的元组:
<enumerate object at 0x7f94f2d11758>
这个迭代器可以展开为:
[(0, 'a'), (1, 'b'), (2, 'c')]
在for
循环中使用enumerate()
可以方便地获取每个元素的索引和值:
for index, value in enumerate(my_list):
print(index, value)
这将输出:
0 a
1 b
2 c
组合使用 zip() 和 enumerate()
在某些情况下,可以组合使用zip()
和enumerate()
来实现更复杂的迭代逻辑。例如,可以同时迭代多个序列,并为每个元素对获取索引。
for index, (value1, value2) in enumerate(zip(list1, list2)):
print(index, value1, value2)
这段代码将为list1
和list2
中的每个配对元素打印索引和对应的值。
4.4
下面代码的运行结果为-。
for n in range(100, 1, -1):
for i in range(2, n):
if n % i == 0:
break
else:
print(n)
break
答案97
这里由于是找一个素数,所以就九七。
4.6
多选题:下面表达式中作为条件表达式时等价于 True 的有(
3+5
[]
{3}
-3
在Python中,这些表达式在布尔上下文中的等价性如下:
-
3+5
- 这是一个数学运算,计算两个整数的和。结果为8
,是一个非零整数,在布尔上下文中被视为True
。 -
[]
- 这是一个空列表。在布尔上下文中,空列表被视为False
。 -
{3}
- 这是一个只包含一个元素3
的集合。由于它不是空的,它在布尔上下文中被视为True
。 -
-3
- 这是一个负整数。在布尔上下文中,任何非零数字(包括负数)都被视为True
。
所以,作为条件表达式时等价于True
的表达式有:
3+5
(结果为8
){3}
(非空集合)-3
(非零负数)
正确答案是:3+5
、{3}
和-3
。
4.10
分析逻辑运算符or 的短路求值特性。
在Python中,逻辑运算符or
通常用于连接两个或多个条件表达式。当使用or
运算符评估多个表达式时,Python会采用短路求值(short-circuit evaluation)的特性。这意味着:
-
从左到右求值:
or
运算符会从左到右依次评估表达式。 -
短路行为:如果在评估过程中遇到第一个为
True
的表达式,那么表达式的求值将立即停止,不再评估后续的表达式。这是因为在逻辑or
运算中,只要有一个操作数为True
,整个表达式的结果就确定了为True
。 -
全部求值:如果所有的表达式都为
False
,则or
运算符会继续求值直到最后一个表达式,最终整个表达式的结果为False
。
短路求值的特性在编程中非常有用,尤其是在以下场景:
- 避免错误:当某些表达式可能会引发异常时,可以在它们之前放置一个总是为
True
的表达式,以避免执行可能导致错误的表达式。 - 提高效率:当某个表达式的结果足以确定整个逻辑表达式的结果时,不需要继续评估后续表达式,从而节省计算资源。
下面是一个例子,演示or
运算符的短路求值特性:
def test():
print("Function test() is called")
return True
result = (test() or "This will not be evaluated")
print(result) # 输出: Function test() is called, True
在这个例子中,由于test()
函数返回True
,表达式(test() or "This will not be evaluated")
的值为True
。由于发生了短路,第二个表达式"This will not be evaluated"
不会被评估,因此字符串"This will not be evaluated"不会出现在输出中。
相反,如果test()
函数返回False
,那么第二个表达式将被评估,以确定整个逻辑表达式的结果。
4.11~4.16
4.11 判断闰年
- 思路:
- 从用户那里获取一个年份输入。
- 检查年份能否被400整除,如果能,则输出该年份是闰年。
- 如果不能,检查年份能否被4整除且不能被100整除,如果满足条件,则输出该年份是闰年。
- 如果都不满足,则输出该年份不是闰年。
4.12 删除列表中的所有奇数
- 思路:
- 生成一个包含58个随机整数的列表。
- 从列表末尾开始向前遍历,检查每个数字是否为奇数。
- 如果是奇数,则从列表中移除。
4.13 对列表中偶数下标元素降序排列
- 思路:
- 生成一个包含28个随机整数的列表。
- 将偶数下标位置上的元素提取到一个新列表中,并进行降序排序。
- 将排序后的元素放回原列表的相应位置。
4.14 因式分解
- 思路:
- 获取用户输入的一个小于1880的整数。
- 从2开始,尝试每个数字,检查它是否是输入整数的因数。
- 如果是因数,将该数字添加到因数列表中,并除以该数字,继续这个过程直到该数字不再是因数。
- 输出所有因数的乘积形式。
4.15 计算180以内所有奇数的和(三种方法)
-
方法一:直接求和
- 迭代从1到180的每个奇数,并将它们相加。
-
方法二:数学公式
- 使用公式求和:
n/2 * (first_odd + last_odd)
,其中n
是奇数的个数,first_odd
是第一个奇数(在这个范围内),last_odd
是最后一个奇数。
- 使用公式求和:
-
方法三:使用列表推导式
- 使用列表推导式生成1到180内所有奇数的列表,然后使用
sum()
函数求和。
- 使用列表推导式生成1到180内所有奇数的列表,然后使用
4.16 输出由1、2、3、4组成的所有素数
- 思路:
- 使用排列(permutations)生成1、2、3、4所有可能的排列组合。
- 对于每个排列,检查它是否形成素数。
- 如果是素数,则将其添加到输出列表中。