Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在if-else语句中使用范围内(..)_Python - Fatal编程技术网

Python 在if-else语句中使用范围内(..)

Python 在if-else语句中使用范围内(..),python,Python,python 2.7 是否可以这样做: print "Enter a number between 1 and 10:" number = raw_input("> ") if number in range(1, 5): print "You entered a number in the range of 1 to 5" elif number in range(6, 10): print "You entered a number in the range of 6

python 2.7

是否可以这样做:

print "Enter a number between 1 and 10:"
number = raw_input("> ")

if number in range(1, 5):
    print "You entered a number in the range of 1 to 5"
elif number in range(6, 10):
    print "You entered a number in the range of 6 to 10"
else:
    print "Your number wasn't in the correct range"
我发现如果我把一个数字放在1到10之间,它总是落在else语句上

这是否在if-else语句中使用了不正确的in-range

非常感谢,

>number=raw\u input()
>>> number = raw_input()
3
>>> type(number)
<type 'str'>
>>> "3" in range(1,5)
False


number = int(raw_input())
3. >>>类型(编号) >>>范围内的“3”(1,5) 假的 number=int(原始输入()
在检查输入之前,应先将输入(字符串)转换为数字。如果1。因此,它流向其他地方。把它转换成整数,一切都会好的

>>> number = raw_input("> ")
>>> type(number)
<type 'str'>
int(number) converts to <type 'int'>

为了完整性起见,
中的
运算符可用作测试属性成员资格的布尔运算符。因此,它在
if..else
语句中可用(完整的文档摘录见下文)

当使用
in
操作符时(例如
obj in container
),解释器首先查看
container
是否有
\uuuu contains\uuu
方法。如果不是,但如果
容器定义了
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

for value in container:
    if value == obj:
        return True
return False
最后,如果两个方法都没有定义,解释器将查找
\uuu getitem\uuu
方法在容器上迭代,并且仍然会测试任何值是否与
obj
相等。 你也可以看看

现在,在您的例子中,
range([start],stop[,step])
函数实际上返回一个列表(注意此列表不包含最后一个元素,因此
range(1,5)=[1,2,3,4]
),它定义了
\uuuuuuuuuuu包含的方法:

>>> type(range(1, 10))
list
>>> hasattr(list, '__contains__')
True
>>> 4 in range(1, 10)
True
因此,它完全有权在(1,10)
范围内写入
x。正如其他答案所指出的,您的问题实际上是通过将输入数据转换为整数来解决的类型问题(因为
“3”==3
为False)。 但是,如果您只想测试输入值是否有适当的边界,我将明确建议您使用比较运算符

>>> if 1 <= x < 10:
...     print 'ok'
... else:
...     print 'ko'
最后,这里是python文档中关于

集合成员资格测试中的和未测试中的运算符。如果x是集合s的成员,则s中的x计算为true,否则为false。x不在s中返回x在s中的求反。集合成员测试传统上被绑定到序列;如果集合是序列并且包含与该对象相等的元素,则对象是集合的成员。然而,对于许多其他对象类型来说,支持成员资格测试而不是序列是有意义的。特别是,字典(用于键)和集合支持成员资格测试

对于列表和元组类型,当且仅当存在索引i,使得x==y[i]为真时,y中的x为真

对于Unicode和字符串类型,当且仅当x是y的子字符串时,y中的x为真。等效测试是y.find(x)!=-1.注意,x和y不必是同一类型;因此,abc中的u'ab'将返回True。空字符串始终被视为任何其他字符串的子字符串,因此“abc”中的“”将返回True

在版本2.3中进行了更改:以前,x必须是长度为1的字符串

对于定义
\uuuuuuuuuuuuuuuuuu包含
()方法的用户定义类,当且仅当y.
\uuuuuuuuu包含
(x)为真时,y中的x为真

对于不定义
\uuuu包含
()但定义
\uuuu iter\uuuu
()的用户定义类,如果在y上迭代时生成某个值z且x==z,则y中的x为真。如果在迭代过程中引发异常,就好像在中引发了该异常一样

最后,尝试旧式的迭代协议:如果一个类定义了
\uuu getitem\uuu
(),当且仅当存在一个非负整数索引i,使得x==y[i],并且所有较低的整数索引都不会引发索引器异常时,y中的x才为真。(如果引发任何其他异常,则与引发该异常一样)

运算符not in被定义为具有反真值in

运算符是和不是对象标识的测试:当且仅当x和y是同一对象时,x为y为真。x不是y,产生反真值。[7]


另一种可能的解决方案是在开头使用int:

number = int(raw_input("> "))
请注意,
范围(1,5)
不包括数字5。
int(“5”)在范围(1,5)
->
False
>>> type(xrange(1, 10))
xrange
>>> hasattr(xrange, '__contains__')
False
>>> hasattr(xrange, '__iter__')
True
>>> 4 in xrange(1, 10)
True
number = int(raw_input("> "))