当前位置:   article > 正文

【Python 学习笔记】range()函数_本关任务:编写一个能计算并输出正奇数的倒数的正负交替数列和的小程序,输入一个表

本关任务:编写一个能计算并输出正奇数的倒数的正负交替数列和的小程序,输入一个表

range函数是python中内置的一个函数,表示一个不可变的数列,常用于for循环中

1 参数

range函数的参数必须为整数。形式如下

range(start,stop[,step])

start表示数列的起点,如果省略,则默认为0;stop表示数列的终点,不可以省略,需要指出的是range生成的数列是左闭右开型,终点是stop前面一个数;step表示数列的步长,可以为正数也可以为负数,但是不可以为零,默认为1.

举例:

range(n)表示从0开始,步长为1,终点为n-1

  1. for i in range(10):
  2. print(i,end = ' ')
  3. #输出0 1 2 3 4 5 6 7 8 9

range(n)相当于range(0,n,1);

需要注意的是,如果start大于stop,step不可省略且必须小于0.

2 例题

例题1

编写一个能计算并输出小于n(n>1)的正奇数的倒数的和的小程序。

1+\frac{1}{3}+\frac{1}{5}+\cdots

经过简单的分析,为了得到小于n的正基数,我们需要的是一个步长2的数列,该数列可以用range函数得到,即range(1,n,2)

代码如下

  1. n = eval(input())
  2. result = 0
  3. for i in range(1,n,2)
  4. result += 1/i
  5. print(result)
  6. #输入10
  7. #输出1.7873015873015872

通过列表可以简化这段代码

  1. n = eval(input())
  2. print(sum(map(lambda x:1/x,list(range(1,n,2)))))
  3. #输入 10
  4. #输出 1.7873015873015872

简化过后的代码利用了python中其他的内置函数,sum函数用于求和,map函数可以将第一个参数里的函数映射到列表里的每一个元素上,list函数则是将range(1,n,2)转化成一个列表,lambda x:1/x是一个匿名函数,:左边是函数参数,右边是返回值。

例题2

编写一个能计算并输出正奇数的倒数的正负交错数列和的小程序。

1-\frac{1}{3}+\frac{1}{5}-\cdots

初步分析可知,需要一个变量记录正负号的变化,因此新增一个变量cnt

代码如下

  1. n = eval(input())
  2. result = 0
  3. cnt = 0
  4. for i in range(1,n,2):
  5. if not cnt%2:
  6. result += 1/i
  7. else:
  8. result -= 1/i
  9. cnt += 1
  10. print(result)
  11. #输入 10
  12. #输出 0.8349206349206351

这段代码看起来比较冗长,因为每一步都需要判断一下cnt是奇数还是偶数;经过进一步分析

,发现可以用一个标志变量flag记录正负变化。

代码如下

  1. n = eval(input())
  2. result = 0
  3. flag = 1
  4. for i in range(1,n,2):
  5. result += 1/i*flag
  6. flag = -flag
  7. print(result)
  8. #输入 10
  9. #输出 0.8349206349206351

这段代码看起来简洁多了,将题目中的+ 和 - 转换成 +1 和 -1,每次循环flag取反。

例题3

1只公鸡5枚铜钱,1只母鸡3枚铜钱,3只小鸡卖1枚铜钱。原来的问题是用100枚铜钱买100只鸡,铜钱必须用完一枚不剩(不许贪污),且要求公鸡、母鸡、小鸡每样都必须有,计算公鸡、母鸡、小鸡各多少。现在的问题是: 输入两个正整数m和n,用m枚铜钱购买n只鸡,花完全部的钱,且要求公鸡、母鸡、小鸡每样都必须有,计算公鸡、母鸡、小鸡各多少。

本题所给的测试数据保证一定有解: 每行输出一组结果,按鸡翁数、鸡母数、鸡雏数的顺序输出,数字之间用空格分隔;

有多组解时,按公鸡数量由少到多输出;

为了取得所有的可能结果,可以尝试将所有组合方式例举出来,可以用三个for循环达到这一目的。之后再判断是否符合条件,若符合条件,则输出.

  1. m = eval(input()) #铜钱数
  2. n = eval(input()) #鸡的数量
  3. for cock in range(1,n): #公鸡
  4. for hen in range(1,n): #母鸡
  5. for chicken in range(1,n): #小鸡
  6. if not chicken%3 and 5*cock+3*hen+chicken//3 == m and cock + hen + chicken ==n:
  7. print(cock,hen,chicken)
  8. #输入
  9. 100
  10. 100
  11. #输出
  12. 4 18 78
  13. 8 11 81
  14. 12 4 84

仔细观察,不难发现公鸡的最大数量不是n而是m//5,超出了m//5,那铜钱就不够用来,母鸡和小鸡同理。同时,小鸡的数量可以用n - cock - hen表示,进一步简化了代码

  1. m = eval(input()) #铜钱数
  2. n = eval(input()) #鸡的数量
  3. for cock in range(1,m//5): #公鸡
  4. for hen in range(1,(m-5*cock)//3): #母鸡 先减去公鸡所需铜钱数
  5. chicken = n - cock - hen #小鸡 用鸡的总数减去公鸡和母鸡数
  6. if not chicken%3 and 5*cock+3*hen+chicken//3 == m: #省略数量判断
  7. print(cock,hen,chicken)
  8. else:
  9. print('无解')
  10. #输入
  11. 100
  12. 100
  13. #输出
  14. 4 18 78
  15. 8 11 81
  16. 12 4 84

例题4

本关任务:1只公鸡5枚铜钱,1只母鸡3枚铜钱,3只小鸡卖1枚铜钱。输入两个正整数m和n,用m枚铜钱购买n只鸡,铜钱必须用完一枚不剩(不许贪污),且要求公鸡、母鸡、小鸡每样都必须有,计算公鸡、母鸡、小鸡各多少? 若有解: 输出公鸡数量最少的一组结果,按鸡翁数、鸡母数、鸡雏数的顺序输出,数字之间用空格分隔; 若无解: 输出“无解”

与上一题不同的是,该题只需要输出第一组解,常规想法有两个,一个是用标志变量flag记录是否输出解。另一个是用else子句和continue实现该功能。在for语句中,若后面跟了一个else子句,则循环在正常结束后,会执行else里的代码,若是通过break跳出循环,则不执行。

第一种方法,flag标志变量

  1. m = eval(input()) #铜钱数
  2. n = eval(input()) #鸡的数量
  3. flag = False
  4. for cock in range(1,m//5): #公鸡
  5. for hen in range(1,(m-5*cock)//3): #母鸡 先减去公鸡所需铜钱数
  6. chicken = n - cock - hen #小鸡 用鸡的总数减去公鸡和母鸡数
  7. if not chicken%3 and 5*cock+3*hen+chicken//3 == m: #省略数量判断
  8. print(cock,hen,chicken)
  9. flag = True
  10. break
  11. if flag:
  12. break
  13. else:
  14. print('无解')
  15. #输入
  16. 100
  17. 100
  18. #输出
  19. 4 18 78

第二种方式,continue和else子句

  1. m = eval(input()) #铜钱数
  2. n = eval(input()) #鸡的数量
  3. for cock in range(1,m//5): #公鸡
  4. for hen in range(1,(m-5*cock)//3): #母鸡 先减去公鸡所需铜钱数
  5. chicken = n - cock - hen #小鸡 用鸡的总数减去公鸡和母鸡数
  6. if not chicken%3 and 5*cock+3*hen+chicken//3 == m: #省略数量判断
  7. print(cock,hen,chicken)
  8. break #找到了解,后跳出内侧循环
  9. else:
  10. continue #没有找到解,继续执行外层循环
  11. break #找到了解,跳出外层循环
  12. #输入
  13. 100
  14. 100
  15. #输出
  16. 4 18 78

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/145180
推荐阅读
相关标签
  

闽ICP备14008679号