【Python 学习笔记】range()函数

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

1 参数

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.

2 例题

例题1

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

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

经过简单的分析,为了得到小于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

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

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

初步分析可知,需要一个变量记录正负号的变化,因此新增一个变量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

猜你喜欢

转载自blog.csdn.net/qq_65021355/article/details/129930676