土豆焗薯条 发表于 2022-1-13 14:39

python条件判断中遇到的问题,百思不得其解

本帖最后由 土豆焗薯条 于 2022-1-13 16:19 编辑

各位大佬救命,在写一段程序的时候遇到一个奇怪的问题,代码运行到else分支里面 return True之后又会莫名其妙回到if分支运行if分支最后一行代码,而且运行if分支最后一行代码的次数和列表长度有关,调了好久都没调明白。
price = [8.849558,11.504425,1.769912,9.734513]

accu = 0.005
i = 0.13
index = 0
def cal(num):
    x = round(num * (1 + i), 4)
    if abs(x - round(x,1)) < accu:
      return True

def judge(list):                  # 在 i 给定的情况下,判断列表内所有元素是否满足
    global index
    if cal(list[index]):
      if index < (len(list)-1):
            index = index + 1
            print(list[index],'满足')
            judge(list)
            print(list[index], '满足2')#reture True之后会执行(len(price)-1)次,很奇怪      
       else:
            print(index,'True')   
            return True   # reture True之后不知道为什么会执行if分支最后一行代码
    else:
      return False

judge(price)

wslans 发表于 2022-1-13 15:26

第二个if和第二个else是不是没有对齐?

wslans 发表于 2022-1-13 15:28

肉眼可见的嵌套内的if对应的else前突了一个字符的位置

lion411 发表于 2022-1-13 15:39

wslans 发表于 2022-1-13 15:28
肉眼可见的嵌套内的if对应的else前突了一个字符的位置

顶你,虽然我也看出来了,比你晚了一步

markhoo911 发表于 2022-1-13 15:41

是不是缩进问题,你提问的时候,可以吧代码粘贴到编辑器,上面尖括号<>插入代码里面
这样格式就不会错乱了

土豆焗薯条 发表于 2022-1-13 15:42

wslans 发表于 2022-1-13 15:28
肉眼可见的嵌套内的if对应的else前突了一个字符的位置

不是对齐问题,我粘贴过来之后格式乱了

土豆焗薯条 发表于 2022-1-13 15:43

lion411 发表于 2022-1-13 15:39
顶你,虽然我也看出来了,比你晚了一步

不是对齐问题,我粘贴过来之后格式乱了

土豆焗薯条 发表于 2022-1-13 15:46

补一个代码截图和运行结果

junjie0927 发表于 2022-1-13 15:50

本帖最后由 junjie0927 于 2022-1-13 16:04 编辑

price =

accu = 0.005
i = 0.13
index = 0
def cal(num):
    x = round(num * (1 + i), 4)
    if abs(x - round(x,1)) < accu:
      return True

def judge(list):                  # 在 i 给定的情况下,判断列表内所有元素是否满足
    global index
    if cal(list):
      if index < (len(list)-1):
            index = index + 1
            print(list,'满足')
            judge(list)
            print(list, '满足2')#reture True之后会执行(len(price)-1)次,很奇怪

      else:
            print(index,'True')   
            return True   # reture True之后不知道为什么会执行if分支最后一行代码
    else:
      return False

judge(price)

因为第17行代码是最关键的

python的执行方式是从上到下。

第17行代码 judge(list)相当于调用函数。

也就是说:
第1次执行的时候,执行到judge(list)就第1次重judge(list),然后再第1重judge(list)中再次遇到第2重的judge(list),又在第2重的judge(list)再再次遇到第3重的judge(list).

此时因为index = index + 1的原因,此时的index = 4

不符合 if index < (len(list)-1),所以第三重judge(list)直接抛出return true,之后第二重抛出结果,第一重抛出结果,最后第1次执行的函数也等着抛出结果。


>>11.504425 满足 #第1次index = 0,执行judge(list),   print(list,'满足'),   遇到第2重judge(list),index = index + 1 = 1
>>1.769912 满足   #第2重index = 1,执行第2重judge(list),   print(list,'满足'),   遇到第3重judge(list),index = index + 1 = 2
>>9.734513 满足   #第3重index = 2,执行第3重judge(list),   print(list,'满足'),   遇到第4重judge(list),index = index + 1 = 3
>>3 True                #第4重index = 3,执行第3重judge(list),   len(list)-1 = 3,所以index < (len(list)-1)不符合,抛出return True,第4重judge(list)结束
>>9.734513 满足2 #第3重judge(list)继续执行,print(list, '满足2'),第3重judge(list)结束
>>9.734513 满足2 #第2重judge(list)继续执行,print(list, '满足2'),第2重judge(list)结束
>>9.734513 满足2 #第1次judge(list)继续执行,print(list, '满足2'),第1次judge(list)结束

土豆焗薯条 发表于 2022-1-13 15:53

junjie0927 发表于 2022-1-13 15:50
price =

accu = 0.005


谢谢你!第一次发帖,不会这样发{:1_907:}
页: [1] 2 3
查看完整版本: python条件判断中遇到的问题,百思不得其解