goodwar7 发表于 2020-8-28 17:10:17

or 和字符串问题

各位大佬,在做判断程序时,使用(if fruit == '西瓜' or '香蕉':),输入任何数字、文字、字母都判断为正确,而变成(if fruit == '西瓜':)则正确判断,请问是哪里有问题,就是想猜多种水果名字,是or用的不对吗,文字类的只能用 xxx in 列表的方式吗?

temp = input('猜猜我喜欢的水果:')
fruit = temp
i = 3
while i:
    if fruit == '西瓜' or '香蕉':
      print('bingo')
      fruit = input('还有吗:')
    else:
      fruit = input('不对哦,再猜一下:')
    i -= 1
print('游戏结束')

疾风怪盗 发表于 2020-8-28 17:13:12

本帖最后由 疾风怪盗 于 2020-8-28 17:14 编辑

这个不能这么写的吧
if fruit == '西瓜' or '香蕉':
改成这样
if (fruit == '西瓜') or(fruit == '香蕉'):

昨非 发表于 2020-8-28 17:22:10


temp = input('猜猜我喜欢的水果:')
fruit = temp
i = 3
while i:
    if fruit == '西瓜' or fruit=='香蕉': #除了xxx in 列表外也可以这样
      print('bingo')
      fruit = input('还有吗:')
    else:
      fruit = input('不对哦,再猜一下:')
    i -= 1
print('游戏结束')

原因分析:==优先级高于or,所以你fruit==‘西瓜’得到的结果是bool型,又or了个字符串,才会引起错误

昨非 发表于 2020-8-28 17:23:24

疾风怪盗 发表于 2020-8-28 17:13
这个不能这么写的吧

改成这样

这里也不用加小括号

疾风怪盗 发表于 2020-8-28 17:25:08

昨非 发表于 2020-8-28 17:23
这里也不用加小括号

我知道,这不是为了更加清晰么,我一般写的时候都加上,读起来舒服点

昨非 发表于 2020-8-28 17:26:56

疾风怪盗 发表于 2020-8-28 17:25
我知道,这不是为了更加清晰么,我一般写的时候都加上,读起来舒服点

嗯嗯,就是现在有一点儿不太清楚,输入的所有非零数字都会被判断成bool True 吗?

sunrise085 发表于 2020-8-28 17:27:15

本帖最后由 sunrise085 于 2020-8-28 17:29 编辑

有两个问题你没有搞清楚
第一、==的优先级要高于or,你这样写,会先判断fruit=='西瓜',然后将结果与 '香蕉' 进行or运算,只要输入的不是 '西瓜',那么该表达式的结果都是 '香蕉',若输入的是'西瓜',则表达式的结果是 '西瓜' ,也就是说if语句的条件永远成立
第二、判断fruit是不是两者中的一个,不能这样用 or 运算,即使后面加上括号,写成if fruit == ('西瓜' or '香蕉'): 也不对。因为括号内的or运算结果永远是 '西瓜',也就是说其实是在判断 fruit 是不是 '西瓜'

正常的应该这样写:
if fruit == '西瓜' or fruit =='香蕉':

或者这样写

if fruit in [ '西瓜' ,'香蕉']:

疾风怪盗 发表于 2020-8-28 17:30:42

昨非 发表于 2020-8-28 17:26
嗯嗯,就是现在有一点儿不太清楚,输入的所有非零数字都会被判断成bool True 吗?

他这么写,不管输入任何东西,if '香蕉' 就是判断为true的吧,又因为是or,所以就取了真,判断一直成立

昨非 发表于 2020-8-28 17:32:04

疾风怪盗 发表于 2020-8-28 17:30
他这么写,不管输入任何东西,if '香蕉' 就是判断为true的吧,又因为是or,所以就取了真,判断一直成立

嗯,明白了,谢谢

陈晓奇努力学习 发表于 2020-8-28 17:45:56

if 后面只要不是None或者是False,都是算作True

sunrise085 发表于 2020-8-28 18:06:43

陈晓奇努力学习 发表于 2020-8-28 17:45
if 后面只要不是None或者是False,都是算作True

你说的不够全面
为假的情况有:数字0(包含 0 和 0.0),空字符串、空列表、空元组、空字典、None 、False等

goodwar7 发表于 2020-8-28 21:02:40

昨非 发表于 2020-8-28 17:22
原因分析:==优先级高于or,所以你fruit==‘西瓜’得到的结果是bool型,又or了个字符串,才会引起错误

你好,你的意思是我这样写的if是:if true or 字符串?有点不太理解,因为我把这个( or '香蕉')去掉后就正确判断了,==的优先级高,那为什么改成(if fruit == '西瓜':)则程序能正确判断,‘西瓜’不是bool值吗?谢谢

goodwar7 发表于 2020-8-28 21:08:21

sunrise085 发表于 2020-8-28 17:27
有两个问题你没有搞清楚
第一、==的优先级要高于or,你这样写,会先判断fruit=='西瓜',然后将结果与 '香 ...

你好(然后将结果与 '香蕉' 进行or运算,只要输入的不是 '西瓜',那么该表达式的结果都是 '香蕉',)请问为什么非西瓜都是香蕉,不太理解,另外按其他回复,香蕉变成了字符串,但是我输入数字为啥也变成正确?

疾风怪盗 发表于 2020-8-28 21:18:50

if fruit == '西瓜' or '香蕉':
你这个判断语句,要理解的话,相当于是if fruit == '西瓜' if '香蕉':
然后fruit是变量,输入的内容,前面相当于是拿输入的内容和西瓜来判断真假,但是问题出在后面,if '香蕉' 永远是真的
那也就变成了,前半句可能真可能假,看你输入的内容,后半句永远为真
or是或的意思,假或真,必然得到结果真
所以不管你输入什么,因为有if '香蕉'的存在,永远判断为真
所以需要改成:
if fruit == '西瓜' or fruit =='香蕉':
这样才能让变量去和西瓜、香蕉做判断

昨非 发表于 2020-8-28 21:30:53

goodwar7 发表于 2020-8-28 21:02
你好,你的意思是我这样写的if是:if true or 字符串?有点不太理解,因为我把这个( or '香蕉')去掉后就 ...

我的意思是,你输入除“西瓜”以外的任何东西,or的前面都是bool型的False,
而if false or 【后半句】,那么if判断的结果都是等效于输入香蕉(这个语法7楼的老师讲的很清楚了,我没有刻意这么试过,当龟屁股吧{:10_277:})
也就是,无论输入什么,if后恒为True

goodwar7 发表于 2020-8-28 21:31:42

疾风怪盗 发表于 2020-8-28 21:18
你这个判断语句,要理解的话,相当于是
然后fruit是变量,输入的内容,前面相当于是拿输入的内容和西瓜 ...

感谢,这样明白了些,顺便能解答下面的吗{:5_110:}:

temp = input('宝宝最喜欢的人:')
talk = temp
i = 4
name = ['峰峰','伊伊','星星']
while i:
    if talk in name:
      print('嘿嘿,没错!')
      talk = input('还有吗:')
    else:
      talk = input('再猜猜:')
    i -= 1
print('讨厌,不玩了!!!')

宝宝最喜欢的人:峰峰
嘿嘿,没错!
还有吗:星星
嘿嘿,没错!
还有吗:伊伊
嘿嘿,没错!
还有吗:峰峰
嘿嘿,没错!
还有吗:星星
讨厌,不玩了!!!
>>>

为什么最后一行不是:嘿嘿,没错!讨厌不玩了!!!
实在想不出哪里错了。。。为什么会有这样的错误?感觉自己写的都挺正确的。

疾风怪盗 发表于 2020-8-28 21:38:56

if -1:
    print('-1')
if 0:
    print('0')
你把上面这个代码运行一下看看,就发现-1是判断为true,0是判断为false
i -= 1
你的变量i在经过几次-1后,你猜到星星时已经变为0了,while就不执行了,执行print('讨厌,不玩了!!!')

bangbang-ande 发表于 2020-8-29 21:38:52

疾风怪盗 发表于 2020-8-28 21:18
你这个判断语句,要理解的话,相当于是
然后fruit是变量,输入的内容,前面相当于是拿输入的内容和西瓜 ...

正解!!

bangbang-ande 发表于 2020-8-29 21:40:04

goodwar7 发表于 2020-8-28 21:02
你好,你的意思是我这样写的if是:if true or 字符串?有点不太理解,因为我把这个( or '香蕉')去掉后就 ...

除空字符串外字符串永远是true

bangbang-ande 发表于 2020-8-29 21:45:00

goodwar7 发表于 2020-8-28 21:31
感谢,这样明白了些,顺便能解答下面的吗:

temp = input('宝宝最喜欢的人:')


顺序问题:
因为你的运行方式:
先运行嘿嘿不错
再运行还有吗
所以按照这个模式一直下去就是这样,所以最后一定会变成先print(嘿嘿不错),在问还有吗,最后才结束
页: [1] 2
查看完整版本: or 和字符串问题