Crossin的编程教室

标题: 简单的While加if,但是,奇怪的执行结果 [打印本页]

作者: pingfree    时间: 2021-1-13 16:04
标题: 简单的While加if,但是,奇怪的执行结果
#! /usr/bin/python
# -*- coding: utf-8 -*-
import re

# ip_rule = r'(?<![\.\d])(?:25[0-5]\.|2[0-4]\d\.|[01]?\d\d?\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)(?![\.\d])'
value = '输入合法的远程主机ip:'
ip_rule = r"^(??:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"

# retry=3,递减1,3次后break
def setup_reinput_ip_3(values, retry=3):
    val = raw_input(values)
    print val
    # re.match 如果匹配成功,则返回一个Match,否则返回一个None
    while re.match(ip_rule, val) is None:
        print 'retry1', retry
        if retry == 0:
            print 'retry2=', retry
            break
            return 'wrong' # 它的存在,只是为了试错
            print 'retry7', retry
        else:
            print 'retry3', retry
            retry -= 1
            print 'retry4', retry
            setup_reinput_ip_3('请输入合法的远程ip地址: ' + '(剩余 {} 次)'.format(retry), retry)
            print 'retry5', retry
    else:
        print 'retry6', retry
        return val


print setup_reinput_ip_3('输入远程主机ip:')


请问这个代码哪里出了问题?
为什么不匹配的输入结果不按照思路break呢?
它还会继续执行几次。

我的运行结果,粘贴如下:
输入远程主机ip:9
9
retry1 3
retry3 3
retry4 2
请输入合法的远程ip地址: (剩余 2 次)9
9
retry1 2
retry3 2
retry4 1
请输入合法的远程ip地址: (剩余 1 次)9
9
retry1 1
retry3 1
retry4 0
请输入合法的远程ip地址: (剩余 0 次)9
9
retry1 0
retry2= 0
retry5 0
retry1 0
retry2= 0
retry5 1
retry1 1
retry3 1
retry4 0
请输入合法的远程ip地址: (剩余 0 次)9
9
retry1 0
retry2= 0
retry5 0
retry1 0
retry2= 0
retry5 2
retry1 2
retry3 2
retry4 1
请输入合法的远程ip地址: (剩余 1 次)9
9
retry1 1
retry3 1
retry4 0
请输入合法的远程ip地址: (剩余 0 次)9
9
retry1 0
retry2= 0
retry5 0
retry1 0
retry2= 0
retry5 1
retry1 1
retry3 1
retry4 0
请输入合法的远程ip地址: (剩余 0 次)9
9
retry1 0
retry2= 0
retry5 0
retry1 0
retry2= 0
None

Process finished with exit code 0




作者: crossin先生    时间: 2021-1-14 17:59
函数里又调用函数,形成了递归调用

while re.match(ip_rule, val) is None:
    retry -= 1
    val = raw_input(values)

不匹配的情况下重试,3行代码就可以了。
不需要一层套一层,循环套递归,全都乱了




欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5