赞
踩
range函数是python中内置的一个函数,表示一个不可变的数列,常用于for循环中
range函数的参数必须为整数。形式如下
range(start,stop[,step])
start表示数列的起点,如果省略,则默认为0;stop表示数列的终点,不可以省略,需要指出的是range生成的数列是左闭右开型,终点是stop前面一个数;step表示数列的步长,可以为正数也可以为负数,但是不可以为零,默认为1.
举例:
range(n)表示从0开始,步长为1,终点为n-1
- for i in range(10):
- print(i,end = ' ')
- #输出0 1 2 3 4 5 6 7 8 9
range(n)相当于range(0,n,1);
需要注意的是,如果start大于stop,step不可省略且必须小于0.
例题1
编写一个能计算并输出小于n(n>1)的正奇数的倒数的和的小程序。
经过简单的分析,为了得到小于n的正基数,我们需要的是一个步长2的数列,该数列可以用range函数得到,即range(1,n,2)
代码如下
- n = eval(input())
- result = 0
- for i in range(1,n,2)
- result += 1/i
- print(result)
-
- #输入10
- #输出1.7873015873015872
通过列表可以简化这段代码
- n = eval(input())
- print(sum(map(lambda x:1/x,list(range(1,n,2)))))
-
- #输入 10
- #输出 1.7873015873015872
简化过后的代码利用了python中其他的内置函数,sum函数用于求和,map函数可以将第一个参数里的函数映射到列表里的每一个元素上,list函数则是将range(1,n,2)转化成一个列表,lambda x:1/x是一个匿名函数,:左边是函数参数,右边是返回值。
例题2
编写一个能计算并输出正奇数的倒数的正负交错数列和的小程序。
初步分析可知,需要一个变量记录正负号的变化,因此新增一个变量cnt
代码如下
- n = eval(input())
- result = 0
- cnt = 0
- for i in range(1,n,2):
- if not cnt%2:
- result += 1/i
- else:
- result -= 1/i
- cnt += 1
- print(result)
- #输入 10
- #输出 0.8349206349206351
这段代码看起来比较冗长,因为每一步都需要判断一下cnt是奇数还是偶数;经过进一步分析
,发现可以用一个标志变量flag记录正负变化。
代码如下
- n = eval(input())
- result = 0
- flag = 1
- for i in range(1,n,2):
- result += 1/i*flag
- flag = -flag
- print(result)
-
- #输入 10
- #输出 0.8349206349206351
这段代码看起来简洁多了,将题目中的+ 和 - 转换成 +1 和 -1,每次循环flag取反。
例题3
1只公鸡5枚铜钱,1只母鸡3枚铜钱,3只小鸡卖1枚铜钱。原来的问题是用100枚铜钱买100只鸡,铜钱必须用完一枚不剩(不许贪污),且要求公鸡、母鸡、小鸡每样都必须有,计算公鸡、母鸡、小鸡各多少。现在的问题是: 输入两个正整数m和n,用m枚铜钱购买n只鸡,花完全部的钱,且要求公鸡、母鸡、小鸡每样都必须有,计算公鸡、母鸡、小鸡各多少。
本题所给的测试数据保证一定有解: 每行输出一组结果,按鸡翁数、鸡母数、鸡雏数的顺序输出,数字之间用空格分隔;
有多组解时,按公鸡数量由少到多输出;
为了取得所有的可能结果,可以尝试将所有组合方式例举出来,可以用三个for循环达到这一目的。之后再判断是否符合条件,若符合条件,则输出.
- m = eval(input()) #铜钱数
- n = eval(input()) #鸡的数量
- for cock in range(1,n): #公鸡
- for hen in range(1,n): #母鸡
- for chicken in range(1,n): #小鸡
- if not chicken%3 and 5*cock+3*hen+chicken//3 == m and cock + hen + chicken ==n:
- print(cock,hen,chicken)
- #输入
- 100
- 100
- #输出
- 4 18 78
- 8 11 81
- 12 4 84
仔细观察,不难发现公鸡的最大数量不是n而是m//5,超出了m//5,那铜钱就不够用来,母鸡和小鸡同理。同时,小鸡的数量可以用n - cock - hen表示,进一步简化了代码
- m = eval(input()) #铜钱数
- n = eval(input()) #鸡的数量
- for cock in range(1,m//5): #公鸡
- for hen in range(1,(m-5*cock)//3): #母鸡 先减去公鸡所需铜钱数
- chicken = n - cock - hen #小鸡 用鸡的总数减去公鸡和母鸡数
- if not chicken%3 and 5*cock+3*hen+chicken//3 == m: #省略数量判断
- print(cock,hen,chicken)
- else:
- print('无解')
- #输入
- 100
- 100
- #输出
- 4 18 78
- 8 11 81
- 12 4 84
例题4
本关任务:1只公鸡5枚铜钱,1只母鸡3枚铜钱,3只小鸡卖1枚铜钱。输入两个正整数m和n,用m枚铜钱购买n只鸡,铜钱必须用完一枚不剩(不许贪污),且要求公鸡、母鸡、小鸡每样都必须有,计算公鸡、母鸡、小鸡各多少? 若有解: 输出公鸡数量最少的一组结果,按鸡翁数、鸡母数、鸡雏数的顺序输出,数字之间用空格分隔; 若无解: 输出“无解”
与上一题不同的是,该题只需要输出第一组解,常规想法有两个,一个是用标志变量flag记录是否输出解。另一个是用else子句和continue实现该功能。在for语句中,若后面跟了一个else子句,则循环在正常结束后,会执行else里的代码,若是通过break跳出循环,则不执行。
第一种方法,flag标志变量
- m = eval(input()) #铜钱数
- n = eval(input()) #鸡的数量
- flag = False
- for cock in range(1,m//5): #公鸡
- for hen in range(1,(m-5*cock)//3): #母鸡 先减去公鸡所需铜钱数
- chicken = n - cock - hen #小鸡 用鸡的总数减去公鸡和母鸡数
- if not chicken%3 and 5*cock+3*hen+chicken//3 == m: #省略数量判断
- print(cock,hen,chicken)
- flag = True
- break
- if flag:
- break
- else:
- print('无解')
-
- #输入
- 100
- 100
- #输出
- 4 18 78
第二种方式,continue和else子句
- m = eval(input()) #铜钱数
- n = eval(input()) #鸡的数量
- for cock in range(1,m//5): #公鸡
- for hen in range(1,(m-5*cock)//3): #母鸡 先减去公鸡所需铜钱数
- chicken = n - cock - hen #小鸡 用鸡的总数减去公鸡和母鸡数
- if not chicken%3 and 5*cock+3*hen+chicken//3 == m: #省略数量判断
- print(cock,hen,chicken)
- break #找到了解,后跳出内侧循环
- else:
- continue #没有找到解,继续执行外层循环
- break #找到了解,跳出外层循环
-
- #输入
- 100
- 100
- #输出
- 4 18 78
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。