Python while循环不按预期工作

时间:2016-06-04 20:35:06

标签: python loops while-loop

当我键入" no"进入输入我期望它添加1到" x",因此结束循环,但发生的是它忽略它并且不添加1 x。这是代码。

x = 1
password = ""

while x == 1:        
    # imagine there is some code here which works

    ans1 = input("\n\nTest a new password? ")
    ans1 = ans1.upper()

    print(ans1)

    if ans1 == ("Y" or "YES"):
        x = x
    elif ans1 == ("N" or "NO"):
        x = x + 10

    print(x)

底部的if / elif语句不起作用。它应该继续要求输入,直到用户说“不”,但这不起作用。

3 个答案:

答案 0 :(得分:5)

你应该使用或那样。

if ans1 == ("Y" or "YES"):

可替换为:

if ans1 == "Y" or ans1 == "YES": 

或者:

if ans1 in ("Y", "YES"): 

该错误来自or运算符的定义。当您执行“Y”或“是”时,它将返回“Y”,因为A or B被定义为如果A不为假则返回A.这里,A是“Y”,它不是假值。因此,它将返回A =“Y”。如果您执行if a == ("Y" or "YES"):,则il将等同于if a == "Y":。好吧,这有点棘手,但这是python的工作原理。

而且,你的代码很奇怪。退出这样的循环是一个非常糟糕的习惯。通常,我们将一个布尔值“循环”设置为false,当我们想要离开循环时。

以下是我将如何进行循环:

looping = True 
password = "" 

while looping: 

    ans1 = input("\n\nTest a new password? ")

    if ans1.upper() in ("NO", "N"): 
        looping = False

您还可以使用具有无限循环(while True:)的构造。然后,调用指令break退出循环。

答案 1 :(得分:2)

您也可以使用“break”或“exit”退出循环或程序。通常更好的是使用在意外情况下表现良好的较大条件(x <= 0或ans1不是YES而不是x == 0或ans1是YES或ans1是NO)。

.directive('mupStageButtons', function() {
    return {
        transclude: true,
        template: '<span ng-transclude></span>',
        replace: true,
        scope: {
            property: "=",
            action: "="
        },
        controller: function($scope) {
            console.log($scope); //I can see the property of $scope defined in console
            console.log($scope.property); //undefined
            this.property = $scope.property;
            this.changeStage = $scope.action; //anyway this is ok
        },
    };
})
.directive('mupStageButton', function() {
    return {
        transclude: true,
        templateUrl: '/static/templates/directives/StageButton.html',
        require: '^^mupStageButtons',
        scope: {
            value: "=",
            btnClass: "@",
        },
        link: function(scope, element, attrs, mupStageButtonsCtrl, transclude) {
            scope.property = mupStageButtonsCtrl.property;
            scope.changeStage = mupStageButtonsCtrl.changeStage;
        }
    };
})

//html

<mup-stage-buttons property="company.stage" action="setStage">
    <mup-stage-button value="0" btn-class="btn-default-grey">
    </mup-stage-button>
</mup-stage-buttons>


//controller for that html ^^^

.controller('CompanyDetailController', function($scope, $stateParams, Company){
    Company.query ({
      id : $stateParams.companyId
    }, function (data) {
      $scope.company = new Company(data);
    });
}

//template for <mup-stage-button>

<label ng-class="property === value ? 'active' : 'btn-on-hover' " class="btn {{btnClass}}" ng-click="changeStage(value)">
    <div ng-transclude></div>
</label>

然后你没有未定义的行为,也没有更少的条件要处理:如果不是“是”或“Y”,程序退出。

答案 2 :(得分:1)

嗯,这条线路有问题:     ans1 ==(“Y”或“YES”)

与此行不相似:

[Date]

第二个是正确的,第一个叫ans1 == "Y" or ans1 == "YES" 。那不是你想要的。基本上,如果x不为null,则成语null coalescing返回x,否则返回y 所以基本上你只是检查ans1是否为“Y”(不是“是”)

您可以通过以下方式检查成语列表是否包含您的成语:

x or y

您可以根据需要继续为该列表添加值。