23、题目:打印出如下图案(菱形):
*
***
*****
*******
*****
***
*
这个题可以进行两次循环,一次是输出前三行,另一次循环输出剩下四行。第一次循环,每次输出 * 的次数是1 3 5 ,每次间隔是2, 所以 i 的范围是range(1,7,2) 第二次循环,每次输出 * 的次数是7 5 3 1,每次间隔是 - 2 ,所以 i 的范围是range(7,0,-2),需要注意range是包括前面的数字,不包括最后一个数字,所以 i 循环到 5 就结束, j 循环到 1 就结束。center的意思是每次输出的结果都居中,参数表示每一行的占位,缺失的地方用空格表示。
for i in range(1,7,2):
print(('*'*i).center(10))
for j in range(7,0,-2):
print(('*'*j).center(10))
24、题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
本题主要是找规律: 发现后一个数字的分母,恰好是前一个数字的分子。所以关键问题是如何判断分子。单独看分子的规律是2,3,5,8,13也就是每一个数字都是前一个数字的分子和分母的和。设置初始值,第一个分数的分子分母设为 a = 2, 分母设为 b = 1 ,所以每一步循环就是求 a/b 的和。每一个 分子a 都是前一个分数的分子分母的和,即 a + b 。同时,根据分母的规律,下次的分母 b 应该是 上一步循环的 分子 a ,但是在循环时候 分子已经改变了,所以需要一个中间变量 t 。
sum = 0
a = 2
b = 1
for i in range(1,21):
sum += a/b
t = a
a = a + b
b = t
print(sum)
同时,这个题还有一个运用python内置的求和函数reduce进行计算。所以先设置一个空列表 l 列表内的每一个数字就是 a / b 的值,简单的运用b,a = a,a + b就可以在每一次循环改变a,b的值,也就是把上一步的分子a 作为下一步的分母b ,上一步的 分子分母之和 a + b 作为下一步的分子 a
最后把每次算得的分数的结果放到 l 列表里,用reduce函数加总即可。
python 的帮助文件中,对reduce的解释是:reduce(...)
reduce(function, sequence[, initial]) -> value
Apply a function of two arguments cumulatively to the items of a sequence,
from left to right, so as to reduce the sequence to a single value.
For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates
((((1+2)+3)+4)+5). If initial is present, it is placed before the items
of the sequence in the calculation, and serves as a default when the
sequence is empty.
reduce有三个参数,第一个参数是函数, 第二个是序列,第三个可以设置初始值(也可以不设置,默认为0)。
reduce(lambda x,y: x + y,l) 第一个参数是函数,函数是用lambda虚拟函数设置的,help中对lambda定义为:Lambda expressions (sometimes called lambda forms) are used to create anonymous functions. The expression "lambda parameters: expression" yields a function object. The unnamed object behaves like a function object defined with:
def <lambda>(parameters):
return expression
也就是说lambda相当于设置了一个函数,第一个参数x,y的意思是有两个变量,x+y代表lambda这个虚拟函数是把这两个变量相加。
第二个参数是 l 。也就是说对 l 这个序列用lambda函数,就是把 l 序列里的没一个数字相加,就是求和的含义。
from functools import reduce
a = 2.0
b = 1.0
l = []
l.append(a / b)
for n in range(1,20):
b,a = a,a + b
l.append(a / b)
print (reduce(lambda x,y: x + y,l))