使用多个类似的“while”语句缩短代码

时间:2016-02-03 16:16:03

标签: python

可能是非常基本的问题,但是编写我的第一个程序并且不知道要搜索什么来找到答案。

我有一个看起来像这样的while语句:

while number > 9999 or number < 0 or number == 1111 or number == 2222 or number == 3333...

继续直到我到达9999.很多代码可能会缩短,我是否正确?不确定我在哪里可以阅读有关语法的内容,所以有人也可以将我链接到那里!

如果有人能提供帮助,我们会很高兴! :)

2 个答案:

答案 0 :(得分:9)

使用模数运算符:

while number > 9999 or number < 0 or (number % 1111 == 0 and number != 0):

答案 1 :(得分:3)

您可以合并前两个语句

number > 9999 or number < 0

使用集合理论

number not in range(0,9999)

其余的你可以用简单的模运算来检查:

not number % 1111

每当在number上调用上述操作时,它将返回0或不等于零的值。例如1 % 3 = 1(我们将较小的数字除以较大的数字,因此我们只得到较小的数字),4 % 2 = 0(因为4/2 = 2*2所以没有剩余的剩余因此0结束)等。

在Python中,True1相同,False0相同。我们希望循环继续运行,直到number具有可以除以1111而没有任何余数的值,因此我们必须否定该语句。让我们看一个如何工作的例子:

让我们说number = 53。在这种情况下,由于模数参数number/1111 = 53/1111 = 53,我们有1111。这意味着我们得到True(因为True == 53!= 0 == False),在用not运算符取消后我们得到False(因为not True总是False,反之亦然。当while语句变为True时,True循环停止。

由于我们想检查其中任何一个是否while (number not in range(0,9999)) or (not number % 1111): # do something ,我们可以这样做:

not in range(1,9999)

如果您想从范围中排除0,您只需转到/* Build: gcc -o test `sdl2-config --libs --cflags` test.c */ #include <stdio.h> #include <stdlib.h> #include <SDL2/SDL.h> void MessageBox(void); void clean(void); int main(int argc, char* argv[]) { SDL_Init(SDL_INIT_EVERYTHING); atexit(clean); SDL_DisplayMode mode; int id = 0; SDL_GetCurrentDisplayMode(id, &mode); char smode[20]; sprintf(smode, "%ix%i@%iHz", mode.h, mode.w, mode.refresh_rate); printf("%s", smode); MessageBox(); SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Missing file", "File is missing. Please reinstall the program.", NULL ); return(0); } void MessageBox() { const SDL_MessageBoxButtonData buttons[] ={ /* .flags, .buttonid, .text */ {0, 0, "no"}, {SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT, 1, "yes" }, { SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT, 2, "cancel" }, }; const SDL_MessageBoxColorScheme colorScheme = { /* .colors (.r, .g, .b) */ { /* [SDL_MESSAGEBOX_COLOR_BACKGROUND] */ { 0, 0, 0 }, /* [SDL_MESSAGEBOX_COLOR_TEXT] */ { 0, 255, 0 }, /* [SDL_MESSAGEBOX_COLOR_BUTTON_BORDER] */ { 255, 255, 255 }, /* [SDL_MESSAGEBOX_COLOR_BUTTON_BACKGROUND] */ { 0, 0, 0 }, /* [SDL_MESSAGEBOX_COLOR_BUTTON_SELECTED] */ { 255, 0, 255 } } }; const SDL_MessageBoxData messageboxdata = { SDL_MESSAGEBOX_INFORMATION, /* .flags */ NULL, /* .window */ "example message box", /* .title */ "select a button", /* .message */ SDL_arraysize(buttons), /* .numbuttons */ buttons, /* .buttons */ &colorScheme /* .colorScheme */ }; int buttonid; if(SDL_ShowMessageBox(&messageboxdata, &buttonid) < 0) { SDL_Log("error displaying message box"); } if(buttonid == -1) { SDL_Log("no selection"); } else { SDL_Log("selection was %s", buttons[buttonid].text); } } void clean() { SDL_Quit(); }