>>> range(1,11)
Run Code Online (Sandbox Code Playgroud)
给你
[1,2,3,4,5,6,7,8,9,10]
Run Code Online (Sandbox Code Playgroud)
为什么不1-11?
他们是否只是随意决定这样做,或者它是否具有一些我没有看到的价值?
mar*_*cog 225
因为调用range(0, 10)哪个返回[0,1,2,3,4,5,6,7,8,9]包含10个等于的元素更常见len(range(0, 10)).请记住,程序员更喜欢基于0的索引.
另外,请考虑以下常见代码段:
for i in range(len(li)):
pass
Run Code Online (Sandbox Code Playgroud)
你能不能看到如果range()真的len(li)那么这会有问题吗?程序员需要显式减1.这也遵循程序员喜欢的共同趋势for(int i = 0; i < 10; i++)了for(int i = 0; i <= 9; i++).
如果您经常以1开头调用范围,则可能需要定义自己的函数:
>>> def range1(start, end):
... return range(start, end+1)
...
>>> range1(1, 10)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Run Code Online (Sandbox Code Playgroud)
din*_*les 23
虽然这里有一些有用的算法解释,但我认为这可能有助于添加一些简单的"现实生活"推理,说明为什么它以这种方式工作,我在将这个主题介绍给年轻的新人时发现了这些推理:
对于像"范围(1,10)"这样的东西,可以通过认为一对参数代表"开始和结束"来产生混淆.
它实际上是开始和"停止".
现在,如果它是 "结束"值,那么,是的,您可能希望该数字将作为序列中的最终条目包含在内.但这不是"结束".
其他人错误地称该参数为"count",因为如果你只使用'range(n)'那么它当然会迭代'n'次.添加start参数时,此逻辑会中断.
所以关键是要记住它的名字:" 停止 ".这意味着,当达到时,迭代将立即停止.不是在那之后.
因此,虽然"开始"确实代表了要包含的第一个值,但在达到"停止"值时,它"打破"而不是在停止之前继续处理"那个".
我用来向孩子们解释这个问题的一个类比是,具有讽刺意味的是,它比孩子更好!它应该在它应该没有停止- 它立即停止而不完成它正在做的事情.(他们得到了这个;))
另一个类比 - 当你驾驶汽车时,你没有通过停止/收益/'让路'的标志,并最终坐在汽车旁边或后面的某个地方.从技术上讲,当你停下来时,你仍然没有达到它.它不包括在"你旅途中传递的东西"中.
我希望其中一些有助于向Pythonitos/Pythonitas解释!
kin*_*all 18
它与零基索引和len().例如,如果列表中有10个项目x,则编号为0-9.range(len(x))给你0-9.
当然,人们会告诉你这是更Python做for item in x或for index, item in enumerate(x)不是for i in range(len(x)).
切片也是这样的:foo[1:4]是项目1-3 foo(记住,由于从零开始的索引,项目1实际上是第二项).为了保持一致性,它们应该以相同的方式工作.
我认为它是:"你想要的第一个号码,然后是你不想要的第一个号码." 如果你想要1-10,你不想要的第一个数字是11,所以就是这样range(1, 11).
如果它在特定的应用程序中变得很麻烦,那么编写一个小的辅助函数就足够了,它可以在结束索引和调用中加1 range().
xua*_*nji 12
它对于分割范围也很有用; range(a,b)可以分为range(a, x)和range(x, b),而在包含范围,你会写x-1或x+1.虽然您很少需要分割范围,但您确实倾向于经常拆分列表,这是切片列表l[a:b]包括第a个元素但不包括第b个元素的原因之一.然后range具有相同的属性使其非常一致.
Ski*_*ick 11
范围的长度是最高值减去最低值.
它非常类似于:
for (var i = 1; i < 11; i++) {
//i goes from 1 to 10 in here
}
Run Code Online (Sandbox Code Playgroud)
用C风格的语言.
也像Ruby的范围:
1...11 #this is a range from 1 to 10
Run Code Online (Sandbox Code Playgroud)
但是,Ruby认识到很多时候你想要包含终端值并提供替代语法:
1..10 #this is also a range from 1 to 10
Run Code Online (Sandbox Code Playgroud)
考虑代码
for i in range(10):
print "You'll see this 10 times", i
Run Code Online (Sandbox Code Playgroud)
这个想法是你得到一个 length 列表y-x,你可以(如上所见)迭代它。
阅读Python 文档的范围 - 他们认为 for-loop 迭代是主要用例。
小智 5
基本上在python中range(n)迭代n时间,这是排他性,这就是为什么它在打印时不给出最后一个值的原因,我们可以创建一个给出包容性值的函数,这意味着它也将打印范围中提到的最后一个值。
def main():
for i in inclusive_range(25):
print(i, sep=" ")
def inclusive_range(*args):
numargs = len(args)
if numargs == 0:
raise TypeError("you need to write at least a value")
elif numargs == 1:
stop = args[0]
start = 0
step = 1
elif numargs == 2:
(start, stop) = args
step = 1
elif numargs == 3:
(start, stop, step) = args
else:
raise TypeError("Inclusive range was expected at most 3 arguments,got {}".format(numargs))
i = start
while i <= stop:
yield i
i += step
if __name__ == "__main__":
main()
Run Code Online (Sandbox Code Playgroud)
pythonrange(n)中的返回从0到n-1。分别是range(1,n)从1到n-1。因此,如果您想省略第一个值并获取最后一个值 (n),您可以使用以下代码非常简单地完成。
for i in range(1, n + 1):
print(i) #prints from 1 to n
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
267867 次 |
| 最近记录: |