以下は、文字列に変換進を印刷するスクリプトです。私は追加する方法の提案をいただければ幸いです - 各権限に文字列に区切りを(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'
クイックフィックスのために、単に置き換えるpass
とresult += '-'
、あるすべての許可検査のために偽のあなたは、単にダッシュを挿入することができます。
for value, letter in value_letters:
if digit >= value:
result += letter
digit -= value
else:
result += '-'
私はちょうど使用したいビットマスクをして、しかし、&
ビット単位の演算子:
for value, letter in value_letters:
result += letter if digit & value else '-'
この動作するため4
、2
及び1
小数(およびオクタル)それぞれに番号の値である1を1に設定3ビットの、他0には、digit & 4
唯一の製造しようとしている4
、または 0
、右あることから3番目のビットの値に応じて設定されたdigit
かどうか。以来0
falseであり、4
真の値である右のビットがセットされ、その許可の手紙との間で決定された場合、これはあなたにテストをすることができます-
。私が使用の条件式を単一の行のいずれかで返すこと。
次に、私は8進数への入力値を変換するために、リスト内包を使用していないと思います。ちょうど使用map()
にここに遅延し、追加のリストオブジェクトを作成せずに変換します。
for digit in map(int, str(octal)):
またはあなたが10で、入力値を分割し、数字を取得するには10のモジュラスを取ることができます。あなたがワンステップで行うことができますdivmod()
機能:
for _ in range(3):
octal, digit = divmod(octal, 10)
私が使用for
権限のために8進数値は常に3進数字(9ビット)から成るべきであるので、ここでは3回反復するループ。これは、あなただけの一番右の3を超えて任意の桁を無視して、優雅に長い値を受け入れることができます。
次に、ループ内で文字列の連結を使用して回避しよう。Pythonは、単純な状況で最悪のパフォーマンスを避けるための場所でいくつかの最適化を有しているが、あなたは簡単にその最適化を逃すことができます。文字を追加するための最良のリストを使用後、str.join()
1つのステップで、最終的な文字列を作成します。
完全な機能の中に一緒に入れてください:
def octal_to_string(octal):
result = []
for _ in range(3):
octal, digit = divmod(octal, 10)
for value, letter in ((4, "r"), (2, "w"), (1, "x")):
result.append(letter if digit & value else "-")
return "".join(result)
デモ:
>>> octal_to_string(755)
'r-xr-xrwx'
>>> octal_to_string(644)
'r--r--rw-'
さて、関数がどのような受け入れている小数点以下の数字ではなく、8進数で。APIの設計から、あなたが本当にどちらか受け入れるようにしたいと思うの文字列のみを(8進数を表す数字を含む)を使用すると、整数を受け入れない場合、または、その後、あなたにその値扱う必要があり、小数点および使用0o
進表記を:
>>> 0o755 # actual octal number
493
>>> format(0o755, 'o') # string representing value in octal notation
'755'
その場合、単に変更divmod(octal, 10)
にdivmod(octal, 8)
8進数を取得するには:
>>> octal = 0o755
>>> for _ in range(3):
... octal, digit = divmod(octal, 8)
... print(digit)
...
...
5
5
7
利点は、あなたが使用できることである他の表記を許可値を指定します(16進数で、それはなるだろうし0x1ed
)、またはに渡すst_mode
の属性os.stat()
を直接関数の呼び出し。