python基础教程100例题: 23&24 (lambda reduce)

 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项之和。

        本题主要是找规律:\frac{2}{1} \, \, \, \, \frac{3}{2} \, \, \, \, \frac{5}{3} \, \, \, \, \frac{8}{5} \, \, \, \, \frac{13}{8}\cdots\cdots 发现后一个数字的分母,恰好是前一个数字的分子。所以关键问题是如何判断分子。单独看分子的规律是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))
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值