八进制到字符串 - 麻烦

octal to string - trouble

我似乎无法理解在线课程中给出的这个问题的解决方案。我找到了解决它的实际代码,但我仍然不明白。谁能更详细地向我解释一下为什么这样做?我将不胜感激。

Linux 系统中文件的权限分为三组,每组三种权限:所有者、组和其他人的读、写和执行。这三个值中的每一个都可以表示为对每个权限求和的八进制数,其中 4 对应于读取,2 对应于写入,1 对应于执行。或者可以用字母 r、w 和 x 或 - 的字符串编写,当未授予权限时。 例如: 640 是 read/write 对所有者,对组读取,对其他人没有权限;转换为字符串,它将是:“rw-r-----” 755 是 read/write/execute 为 owner,read/execute 为 group 和 others;转换为字符串,它将是:“rwxr-xr-x” 填空使代码将八进制格式的权限转换为字符串格式。我对带有 for 循环的那一行感到很困惑——我只是不明白它。

我在网上找到的灵魂(可以正常使用):

def octal_to_string(octal):
 result = ""
 value_letters = [(4,"r"),(2,"w"),(1,"x")]
 # Iterate over each of the digits in octal
 for i in [int(n) for n in str(octal)]:
    # Check for each of the permissions values
    for value, letter in value_letters:
        if i >= value:
            result += letter
            i -= value
        else:
            result += '-'
 return result
    
print(octal_to_string(755)) # Should be rwxr-xr-x
print(octal_to_string(644)) # Should be rw-r--r--
print(octal_to_string(750)) # Should be rwxr-x---
print(octal_to_string(600)) # Should be rw-------

我相信您已经意识到,每个八进制数字(oit?octit?)对应于由各个权限的总和给出的一组权限。

0 = ---
1 = --x
2 = -w-
3 = -wx
4 = r--
5 = r-x
6 = rw-
7 = rwx

我们可以通过从我们的八进制数字中减去每个权限对应的值来导出这个字符串。

(6, '') -> (2, 'r') -> (0, 'rw') -> (0, 'rw-')

至于循环行,由于octal变量是一个3位(八进制)整数,我们首先将其转换为字符串,将每个字符分开以获得各个八进制数字,然后进行转换回到整数,以便我们可以处理它们。我们没有为每个操作编写单独的语句,而是使用 列表理解 生成我们将循环的八进制数字列表。