for或while循环中加else有什么用?循环后的else有什么作用?
一、背景
逛论坛的时候看到这样一个问题,想起自己刚开始学Python的时候,也是如此一方面惊讶于Python的简洁,一方面遇到了许许多多的低级问题。
循环语句后面加esle就是其中之一;
二、分析与演示
首先,我们先确定,C++里不能这么写,否则我又要补课了
C++11环境:
实锤报错:
1. Python里的else
C++没有应用这个语法,Python可以,下面将用实例讲解:
我们先设定一个需求:
给定一个字符串,按下标寻找指定字母a,没找到就输出None
C++代码需要:
我们实际应用肯定不需要这么写,这里是为了演示需要
#include <iostream>
#include <string>
using namespace std;
int main() {
string str="apple";
int i=0;
bool flag=false;
for(;i<str.length();++i)
{
if(str[i]=='a')
{
flag=true;
break;
}
}
if(flag){
cout<<i<<endl;
}
else
{
cout<<"NONE"<<endl;
}
return 0;
}
简单来说,就是C++需要判断一个标志位,来确定是否是循环是否是break出去的;
如果用python:
str = 'python'
i=0
while i<len(str):
if str[i]=='a':
break
i+=1
else:
print("None")
-
当str='python’时:
循环体没有被break 输出None -
当str含a时:str=‘apython’
没有输出 -
当没有进入循环体时: while False:
仍然输出了None
三、总结
综上三种情况:
-
进入了循环体:
1.1 没有break出来 -> 执行else
1.2 break出循环体 -> 跳过else -
没有进入循环体 -> 执行else
一言概之,当循环体被break的时候不会执行else
回到楼主的问题,应该的编译器的原因,3.6.5 下,IDLE无提示,PyCharm内部红线,但可以正常运行;
猜测是因为PyCharm编译器认为m那时候应该被回收了吧…
至于为啥 l 不红线,大概是因为l 在for 里被标黄线了吧…
这种检测策略问题希望懂的老哥说下(: