【问题描述】
请产生一个列表,保存0~100的整数(包含0和100),输出列表的所有偶数和。
输出结果:
100以内的偶数和=2550
【题前思考】
根据问题描述,填写表4-1-4。
表4-1-4 问题分析
【解题思路】
计算0~100的所有偶数和,首先需要定义一个变量来保存偶数和,其初值需要置为0;然后依次判断各个数是否是偶数,如果是偶数,则将其与保存“和”的变量相加;最后再按要求的格式输出结果。
【程序代码】
【代码分析】
①:产生0~100的列表,将其保存在列表a中,range(101)表示列表右边界的范围,但不包含101。
②:表示对列表a中的每一个项i执行循环体中的操作。if i % 2==0:s +=i,判断i是否能被2整除,如果能被2整除,则与s相加,最后s保存了0~100的所有偶数和。
③:按格式输出结果s,f表示格式化输出数据,字符串中的内容原样输出,{s}表示输出变量s的值。
【优化提升】
0~100的最小的偶数是0,相邻两个偶数之间的大小相差2,因此可以只产生0~100的偶数列表,使用函数sum( )来计算列表和。有以下几种优化的方法:
(1)sum([i for i in range(101)if i % 2==0])表示产生0~100满足条件i % 2==0的序列,并用sum( )函数求和。列表推导的[ ]可以改为( )表示生成器表达式,即不会一次产生所有项,而是读取一项才产生一项。如果将生成器用作函数参数可省略( )。上式用生成器可写为sum(i for i in range(101)if i % 2==0)。
(2)sum([2*i for i in range(51)])表示产生0~50的整数i,再用i*2构成列表,就得到了100以内的所有偶数,最后调用sum( )函数求这些偶数之和。
(3)sum(2*i for i in range(51))表示对列表生成器(2*i for i in range(51))求和,列表生成器用作参数时可以省略外面的圆括号。生成器与列表不同的地方在于,生成器不保存项,只在访问到相应的项时才会去计算这个项,而列表会将各个项存放到内存。
(4)sum([i for i in range(0,101,2)])或sum(i for i in range(0,101,2)),range( )函数的第3个参数表示步长,即从第一个参数开始,每次加几。在这个例子中步长2表示从第一个参数0开始每次加2,就得到了100以内的所有偶数。注意:第一个语句是对列表求和,第二个语句是对生成器求和。