有什么方法可以简化if / elif块吗?

时间:2020-03-13 09:44:13

标签: python python-3.x

在python上是一个非常新的(也是不好的),我只是想知道是否有人可以帮助我简化if / elif块。这是一个超级基本的代码,它基本上询问有人要输入什么密码,然后为他们随机分配一个pswd。但是,如果用户需要大写字母和数字,则可以选择。

if upper == True and numbers == True:
    lettersAndDigits = string.ascii_letters + string.digits
elif upper == True and numbers == False:
    lettersAndDigits = string.ascii_letters
elif upper == False and numbers == True:
    lettersAndDigits = string.ascii_lowercase + string.digits
elif upper == False and numbers == False:
    lettersAndDigits = string.ascii_lowercase

抱歉,菜鸟问题的人

感谢一群人,这确实有帮助:)

只是查看我的igcse和我试图重新学习正确的程序。我的老师在python方面不那么强

7 个答案:

答案 0 :(得分:5)

每个== True都没有用。之后,请注意numbers有一些共同之处,并将其提取出来。

if upper:
    lettersAndDigits = string.ascii_letters
else:
    lettersAndDigits = string.ascii_lowercase

if numbers:
    lettersAndDigits += string.digits

您可以进一步压缩它,但是Pythonistas原则上可能会讨厌它:

lettersAndDigits = string.ascii_letters if upper else string.ascii_lowercase
if numbers:
    lettersAndDigits += string.digits

答案 1 :(得分:3)

您可以在一个空数组中开始字符列表,然后随便添加字符。像这样:

lettersAndDigits = []
if upper:
    lettersAndDigits += string.ascii_uppercase

if lower:
    lettersAndDigits += string.ascii_lowercase

if numbers:
    lettersAndDigits += string.digits

这也将允许您使用任何组合,而您在代码中只考虑了四个组合。

答案 2 :(得分:1)

因此,您可以立即做的一件事就是摆脱== True== False部分,因为变量本身就是布尔值,您可以将它们进行比较以查看它们是否为布尔值。同样,您不需要 进行elif,因为其中只有一个wll返回true,因此您可以拥有一堆看起来确实更好的if语句。

if upper and numbers:
    lettersAndDigits = string.ascii_letters + string.digits

if upper and not numbers:
    lettersAndDigits = string.ascii_letters

if not upper and numbers:
    lettersAndDigits = string.ascii_lowercase + string.digits

if not upper and not numbers
    lettersAndDigits = string.ascii_lowercase

除此之外,在这个示例中,您 所能做的还不多。不幸的是,有时编程非常丑陋,而python没有切换功能,因此您不走运。

如果有人有其他想法,我没想到可以随时纠正我。

答案 3 :(得分:1)

使用4个组合创建一个小的列表,然后使用uppernumbers立即选择正确的字符串。不需要if

import string

lettersAndDigits = [[string.ascii_lowercase,string.ascii_lowercase + string.digits],
    [string.ascii_letters,string.ascii_letters + string.digits]]

upper = False
numbers = True
print (lettersAndDigits[upper][numbers])
# abcdefghijklmnopqrstuvwxyz0123456789
upper = True
numbers = False
print (lettersAndDigits[upper][numbers])
# abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

答案 4 :(得分:1)

我认为您无法进一步简化。不过,如果可以更容易阅读的块,则可以用不同的嵌套表达:

if upper == True:
    if numbers == True:
        lettersAndDigits = string.ascii_letters + string.digits
    else:
        lettersAndDigits = string.ascii_letters
else:
    if numbers == True:
        lettersAndDigits = string.ascii_lowercase + string.digits
    else:
        lettersAndDigits = string.ascii_lowercase

答案 5 :(得分:0)

这是一个辱骂性的单话(不要使用它!):

allowed_chars = [string.ascii_lowercase, string.ascii_letters][upper] + string.digits * numbers

使用bool0, 1的转换,以list乘以strint来索引strprivate TcpClient _tcpClient = new TcpClient(); protected SemaphoreSlim ClientSemaphore { get; } = new SemaphoreSlim(1, 1); public async Task ConnectAsync() { if (_tcpClient.Connected) { await DisconnectAsync(); } await _tcpClient.ConnectAsync(Hostname, RemotePort); //here the background Task is started _ = AutoReceiveMessages(); } private async Task AutoReceiveMessages() { while (_tcpClient.Connected) { //enter and lock semaphore await ClientSemaphore.WaitAsync(); try { //read from socket until timeout (ms) var msg = await ReadFromSocket(2000); foreach (var cmd in SplitMessageInTelegrams(msg)) { Console.WriteLine("MESSAGE --> " + cmd); } } catch (Exception ex) { } finally { //release semaphore ClientSemaphore.Release(); } } } private async Task<string> ReadFromSocket(double timeout = 0) { var buf = new byte[4096]; var stream = _tcpClient.GetStream(); //read from stream or timeout var amountReadTask = stream.ReadAsync(buf, 0, buf.Length); var timeoutTask = Task.Delay(TimeSpan.FromMilliseconds(timeout)); await Task.WhenAny(timeoutTask, amountReadTask) .ConfigureAwait(false); //timeout if (!amountReadTask.IsCompleted) { throw new TimeoutException("Timeout"); } //no timeout return Encoding.ASCII.GetString(buf, 0, amountReadTask.Result); }

答案 6 :(得分:0)

我不确定您的uppernumbers变量是什么类型,但是除非它们的值是None0[](空列表) ),{}(空字典),''(空字符串),它们都是True。因此,您可以将其简化为:

if variable:        # if variable == True:
    pass

if not variable:    # if variable == False: 
    pass

如此简化:

if upper:
    letters_and_digits = string.ascii_letters
else:
    letters_and_digits = string.ascii_lowercase
if numbers:
    letters_and_digits += string.digits

此外,请查看here,以了解有关命名变量的正确方法。