这里有很多地方你弄错了。
首先,您要做的是检查 0 和 a 之间的每个数字 x 是否包含 6 或 8 作为数字。因此,您应该在每个循环周期中测试的数字是 x 而不是 a。此外,return 语句不应在循环内,否则您的函数仅在一个循环周期后返回。这给了我们
def countnums(a) :
count = 0
for x in range(a):
if 6 and 8 in x:
count -= 1
elif 6 in x:
count += 1
elif 8 in x:
count += 1
return count
countnums(88)
其次,您使用了条件表达式(x 中的 6)。 "in" 是一个运算符,它可以接受不同类型的操作数。例如 (a in [5,6,7]) 仅当 a 等于列表的元素时返回 true,并且 ("hello" in "hello, world") 仅当左操作数是正确的那一个。现在您使用 (8 in x) 来表示“数字 8 以数字 x 的十进制形式出现”。不幸的是,没有为整数操作数定义运算符 in,因此 (8 in x) 是不正确的。你可以做的就是用字符串来表达这一点,str(x) 给你 x 的十进制字符串表示,所以你可以做(str(x) 中的“8”)。
这给了我们:
def countnums(a) :
count = 0
for x in range(a):
if '6' and '8' in str(x):
count -= 1
elif '6' in str(x):
count += 1
elif '8' in str(x):
count += 1
return count
countnums(88)
第三,你在 str(x) 中写了 ('6' 和 '8')。不幸的是,python 理解为 ('6') 和 ('8' in str(x)),并且知道 '6' 被评估为真(非空字符串始终为真),python 从你的表达式中理解的只是(str(x)中的'8')
表达你想要表达的正确方法是写(str(x)中的'6'和str(x)中的'8')
纠正这一点,我们得到:
def countnums(a) :
count = 0
for x in range(a):
if '6' in str(x) and '8' in str(x):
count -= 1
elif '6' in str(x):
count += 1
elif '8' in str(x):
count += 1
return count
countnums(88)
最后,当您使用 elif 语句时,仅当前一个语句被评估为假时才会评估它们。因此,在您的情况下,例如,对于 x 为 268,第一个 if 语句被评估为 true,计数减少,但由于我们执行了第一个 if 块,因此后两个甚至不会被评估,因此计数不会增加两次。
要纠正这个问题,您必须使用三个单独的 if 语句:
def countnums(a) :
count = 0
for x in range(a):
if '6' in str(x) and '8' in str(x):
count -= 1
if '6' in str(x):
count += 1
if '8' in str(x):
count += 1
return count
countnums(88)
此时程序运行。但是我们可以做一个额外的简化:python 中的布尔值可以作为一个数字来操作。例如,False 等于 0,True+True 等于 2,True+False 等于 1。
所以我们能做的是:
def countnums(a) :
count = 0
for x in range(a):
if ('6' in x) + ('8' in x) == 1:
count += 1
return count
countnums(88)