下面是打印转换成字符串的八进制的脚本。对于如何在每个权限(r/w/x)的字符串中添加分隔符的建议,我将不胜感激。
def octal_to_string(octal):
result = ""
value_letters = [(4,"r"),(2,"w"),(1,"x")]
#Iterating over each digit in octal
for digit in [int(n) for n in str(octal)]:
#Checking for each of permission values
for value, letter in value_letters:
if digit >= value:
result += letter
digit -= value
else:
pass
return result我现在得到:
In [7]: octal_to_string(755)
Out[7]: 'rwxrxrx'
In [8]: octal_to_string(644)
Out[8]: 'rwrr'发布于 2020-02-25 12:15:23
要快速修复,只需将pass替换为result += '-';对于每个为假的权限测试,您只需插入一个破折号:
for value, letter in value_letters:
if digit >= value:
result += letter
digit -= value
else:
result += '-'不过,我只会使用,与& bitwise and operator一起使用
for value, letter in value_letters:
result += letter if digit & value else '-'这是因为4、2和1是数字的十进制(和八进制)值,3位中的每一位都设置为1,其他位设置为0。digit & 4只会产生4或0,这取决于在digit中设置的右位的第3位的值。由于0 is false, and 4 is a true value,这允许您测试是否设置了正确的位,因此可以在权限字母和-之间做出决定。我使用一个在一行中返回。
接下来,我不会使用列表理解将输入值转换为八进制数字;只需在这里使用map()懒散地进行转换,而不创建额外的list对象:
for digit in map(int, str(octal)):接下来,尽量避免在循环中使用字符串连接;尽管Python已经进行了一些优化,以避免在简单情况下的最坏情况下的性能,但您很容易忽略这种优化。最好将字符附加到列表中,然后使用str.join()一步创建最终字符串。
组合成一个完整的功能:
def octal_to_string(octal):
result = []
for digit in map(int, str(octal)):
for value, letter in ((4, "r"), (2, "w"), (1, "x")):
result.append(letter if digit & value else "-")
return "".join(result)演示:
>>> octal_to_string(755)
'rwxr-xr-x'
>>> octal_to_string(644)
'rw-r--r--'现在,函数接受的是十进制数,而不是八进制数。从API设计中,您确实希望只接受字符串(包含表示八进制值的数字),或者如果接受整数,则应该将该值视为十进制,并使用0o八进制表示法:
>>> 0o755 # actual octal number
493
>>> format(0o755, "o") # string representing value in octal notation
'755'如果这样做,只需将str(octal)转换为format(octal, 'o')以获得八进制数字:
>>> octal = 0o755
>>> for digit in map(int, format(octal, "o")):
... print(digit)
...
...
7
5
5发布于 2020-02-25 12:15:44
将pass更改为result += "-"
def octal_to_string(octal):
result = ""
value_letters = [(4,"r"),(2,"w"),(1,"x")]
#Iterating over each digit in octal
for digit in [int(n) for n in str(octal)]:
#Checking for each of permission values
for value, letter in value_letters:
if digit >= value:
result += letter
digit -= value
else:
result += "-"
return result
print(octal_to_string(755))输出:
rwxr-xr-x发布于 2022-08-20 08:18:41
def octal_to_string(octal):
result = ""
value_letters = [(4,"r"),(2,"w"),(1,"x")]
# Iterate over each of the digits in octal
for digits in [int(n) for n in str(octal)]:
# Check for each of the permissions values
for value, letter in value_letters:
if digits >= value:
result += letter
digits -= value
else:
result += "-"
return resulthttps://stackoverflow.com/questions/60394192
复制相似问题