当前位置: 首页 > 后端技术 > Python

干货讲解:Python-range函数用法详解

时间:2023-03-26 17:03:56 Python

本文基于Python3环境。Python2环境下范围会有所不同,但不影响我们使用。1.range()函数是什么?range()函数是python的内置函数,可以返回一系列连续相加的整数,可以生成一个列表对象。最常出现在for循环中,可以用作for循环中的索引。小题练习:for..range习题一:用for循环和range找出0~100内的所有偶数,追加到一个列表中。list1=[]foriinrange(0,100,2):list1.append(i)print(list1)2:用for循环和range求出0~50内能被3整除的数,追加到列表中。list2=[]forjinrange(0,50):ifj%3==0:list2.append(j)print(list2)3:用for循环和range求出0~50内被3整除的数number,并插入到list的第0个索引位置,最终结果如下:[48,45,42...]list3=[]forkinrange(0,50):ifk%3==0:list3.insert(0,k)print(list3)4:查找列表li中的元素,去掉每个元素前后的空格,找到以“a”开头的元素,加入到一个新的列表中,最后循环打印这个新列表。li=["alexC","AbC","egon","riTiAn","WuSir","aqc"]'''li=["alexC","AbC","egon","riTiAn","WuSir","aqc"]li1=[]forminli:b=m.strip().startswith('a')ifb==True:li1.append(m.strip())forninli1:print(n)2.语法格式range(start,stop[,step])参数说明:start为计数起始值,可省略,默认为0;停止指计数结束值,但不包括停止;step为步长,默认为1,不能为0。(特别注意:如果有三个参数,则最后一个参数表示为步长。)ps1:只有一个参数:表示全为整数从0到这个参数,不包括参数本身ran=range(6)#定义一个列表,将范围内的数字存入listarry_list=list(ran)print(ran)print(arry_list)结果如下:range(0,6)[0,1,2,3,4,5]ps2:range当函数有2个参数时,第一个参数表示左边界,第二个参数表示右边界,包括左边界,不包括右边界.ran_new=range(1,8)list_one=list(ran_new)#将range内的所有数据存入listprint(list_one)runningresult[1,2,3,4,5,6,7]ps3:rangecontains3当有是三个参数,第一个代表左边界,第二个代表右边界,第三个代表步长step,是两个整数的差值,包括左边和不包括右边。#当range包含3个参数时,第一个代表左边界,第二个代表右边界,第三个代表stepsizestep,是两个整数的差值,包括左边和不包括右边ran_two=range(1,16,2)list_two=list(ran_two)#list_two=print(ran_new)print(ran_two)print(list_two)运行结果为[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]范围(1,16)范围(1,16,2)[1,3,5,7,9,11,13,15]例子:print("例1:from初值为1,终值为10")foriinrange(1,10):print(i,end='')print("\n例2:终值为10")foriinrange(10):print(i,end='')print("\n例3:结束值为10,步长为2")foriinrange(1,10,2):print(i,end='')运行结果:例1:起始值为1,结束值为10123456789例2:结束值为100123456789例3:结束值为10,步长为2135793,报错问题(1)错误:TypeError:“列表”对象不可调用。参考错误类型:无法调用“list”对象原因:由于变量list和函数list同名,当函数使用list函数时,发现list是一个明确定义的list,而list不能调用。因此抛出TypeError。所以,我们以后在定义变量的时候,要避免和函数名、方法名、关键字重复,任何语言都是如此。(2)如果range函数报错:TypeError:'float'objectcannotbeinterpretedasaninteger怎么办?原因是range只能生成整型,不能生成float类型。使用numpy的arange函数解决:importnumpyasnpforiinnp.arange(0.1,0.5,0.05):print(i)#0.1,0.15,0.2,....,0.4,0.45,0.5不包括在内!#或者l=list(np.arange(0.1,0.5,0.05))4.range()函数需要注意①它代表一个左闭右开区间;②它接收的参数必须是整数,可以是负数,但不能是浮点数等其他类型;'''判断指定整数是否存在于序列中,不存在于'''print(10inr)#False,10不在当前r整数序列中print(9inr)#true,9在当前r中rsequenceprint(9notinr)#false,9不在当前r序列中③不可变序列类型,可以判断元素、查找元素、切片等操作,但不能修改元素;④是可迭代对象,但不是迭代器。#(1)左闭右开>>>foriinrange(3,6):>>>print(i,end="")345#(2)参数类型>>>foriinrange(-8,-2,2):>>>打印(i,end="")-8-6-4>>>>范围(2.2)----------------------------TypeErrorTraceback(mostrecentcalllast)...TypeError:'float'objectcannotbeinterpretedasaninteger#(3)序列操作>>>b=range(1,10)>>>b[0]1>>>b[:-3]range(1,7)>>>b[0]=2TypeErrorTraceback(最近一次调用)...TypeError:'range'对象不支持项赋值#(4)不是迭代器>>>hasattr(range(3),'__iter__')True>>>hasattr(range(3),'__next__')False>>>hasattr(iter(range(3)),'__next__')True5,range对象是一个不可变的序列官方是这样划分的很清楚——基本的序列类型有list、tuple和range(范围)对象三种。(共有三种基本序列类型:列表、元组和范围对象。)范围类型与列表和元组是相同的基本序列!范围序列和其他序列类型有什么区别?普通序列支持12种操作,范围序列只支持其中10种,不支持加法拼接和乘法重复。>>>范围(2)+范围(3)---------------------------------------TypeErrorTraceback(最近一次调用)...TypeError:+不支持的操作数类型:'range'和'range'>>>range(2)*2--------------------------------------TypeErrorTraceback(最近一次调用)...TypeError:不支持的操作数类型(s)for*:'range'and'int'那么问题来了:同样是不可变序列,为什么字符串和元组支持以上两种操作,而范围序列不支持呢?不可变序列虽然不能直接修改,但是我们可以将其复制到一个新的序列中进行操作。为什么范围对象甚至不支持这个?官方文档的解释:...由于范围对象只能表示遵循严格模式的序列,重复和连接通常会违反该模式。原因是range对象只代表一个遵循严格模式的序列,而重复的拼接和拼接通常会破坏这种模式……问题的关键在于range序列的模式!仔细想想,它其实代表一个等差数列,拼接两个等差数列,或者重复拼接一个等差数列,这也是range类型不支持这两种操作的原因。由此可知,其他的修改动作也会破坏等差数列的结构,根本不修改就可以了。【range类型的优点】无论range对象表示的整数序列有多长,所有range对象占用的内存空间都是一样的,因为只需要存储start、stop和step。只有使用范围对象时,才会计算序列中的相关元素。6.range函数实现反向遍历range函数实现反向遍历两种实现方式1)先创建一个列表,然后对列表中的元素进行反向操作例如:a=range(4)a=range(4)#[0,1,2,3]new=[]foriinreversed(a):new.append(i)print(new)#[3,2,1,0]2)直接使用range()函数完成逆向遍历//第三个参数表示100执行的所有操作,每次加-1直到0foriinrange(100,0,-1):print(i)7,list的使用listlist1=["SeeNo","seeyou","of","laugh","howamI","sleep","get","do"]foriinrange(len(list1)):print(i,list1[i])运行结果:[range和list的区别]range()是取顺序值,经常和for循环一起使用,比如for中的each(0,5)范围:for循环执行5次,每次取值0~4。而list()就是把一个字符串转成一个列表,比如a='01234',b=list(a),a会打印成一个列表:['0','1','2','3','4'],比如a=[0,1,2,3,4],输出结果会是[0,1,2,3,4]#Comparerangewithlistforiinrange(0,5):print(i)a=[0,1,2,3,4]print(a)八、range函数总结(1)range对象的使用和理解并不难,但是它在python的使用中很常见!(2)range对象既不是函数也不是迭代器,因此可以称为“惰性序列”;(3)参数说明:start为区间起点,stop为区间终点,step为步长;(4)range对象常与for循环一起使用;(5)范围对象可以被索引;关于range()函数还有一点需要注意:range()方法只生成可迭代对象,而不是迭代器!(Python2中的range()生成一个列表,本文基于Python3,生成一个可迭代对象。)获取迭代器有很多内置方法,如zip()、enumerate()、map()、filter()和reversed()等等,但是很少有像range()这样只能获取可迭代对象的方法。在for循环中遍历时,可迭代对象与迭代器具有相同的性能,即惰性求值,空间复杂度和时间复杂度没有区别。两者的区别总结如下:同样是lazyiterable,区别在于可迭代对象不支持自遍历(即next()方法),迭代器本身不支持切片(即__getitem__()方法)。尽管存在这些差异,但很难断定它们中的哪一个更优越。那为什么迭代器是为内置的五个方法设计的,而可迭代对象是为range()方法设计的呢?将它们全部统一起来不是更好吗?事实上,为了标准化,Pyhton已经做了很多这种事情。比如Python2中有range()和xrange()两个方法,Python3干掉其中一个。为什么不更正式一点,让range()生成一个迭代器呢?在这个问题上看到一些大佬的观点很好,这里引用一下:zip()等方法需要接收某些可迭代对象的参数,这是一个对它们进行再加工的过程,所以我也希望生产出来马上就有一个确定的结果出来,所以Python开发者把这个结果设计成一个迭代器。这样还有一个好处,当用作参数的可迭代对象发生变化时,生成的迭代器不会因为被消耗而被错误使用。\range()方法不同。它接收的参数不是可迭代对象,是一个初始处理的过程,所以设计成可迭代对象,可以直接使用,也可以做其他再处理用途。比如zip()等方法,完全可以接受range类型的参数。>>>用于zip(范围(1,6,2),范围(2,7,2)):>>>打印(i,end="")(1,2)(3,4)(5,6)也就是说range()方法是一个初级生产者,它生产的原料有很大的用处。如果早早的变成迭代器,无疑是多此一举。其实range对象是什么并不重要,如何使用才是我们应该关注的重点。如果想了解更多Python技术知识,可以上gzh【Python编程学习圈】,里面有很多干货分享,还有很多系统的Python学习资料可以免费获取,不要这么好的资源不要错过~