在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方面不那么强
答案 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个组合创建一个小的列表,然后使用upper
和numbers
立即选择正确的字符串。不需要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
使用bool
到0, 1
的转换,以list
乘以str
和int
来索引str
和private 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)
我不确定您的upper
和numbers
变量是什么类型,但是除非它们的值是None
,0
,[]
(空列表) ),{}
(空字典),''
(空字符串),它们都是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,以了解有关命名变量的正确方法。