[maya] python:文字列フォーマット操作、%演算子

変数を文字列に代入する際に使用すると便利な%演算子(モジュロ演算子)

Python 2.7ja1 documentation:5.6.2. 文字列フォーマット操作

↑の説明文では理解できない、頭悪いから。
チュートリアルってくらいならもう少し噛み砕いて理解しやすく書けないものなんですかね。

すぐに忘れる脳みそのためのメモ:Python で文字列中の変数をフォーマットして置き換える
Python学習日記:Cのsprintfのような文字列フォーマット
萌えるmel読本の中の人が書くブログ:【Python】文字列フォーマット操作

↑のブログ様が詳細に解説してくださってるので、勝手に拝借いたします。

melでは冗長になりやすく手間がかかる文字列を効率的に使えることが利点だそうだ。
まずはベーシックな使用方法の例を

a = '!!!'
print('hello%sworld'%a)
#結果
#hello!!!world

文字列中で「%s」を入れたところに「a」の変数を代入してます。
「%s」の「s」はオブジェクトをstr()で変換することです。
「%d」にすると10進整数(decimal)に変換します。ちなみに10進整数は小数点以下は切り捨てられます。

pi = 3.141592
print(u'πは%d!?'%pi)
#結果
#πは3!?

変換の型はPython 2.7ja1 documentation:5.6.2. 文字列フォーマット操作にリストがわかりやすくまとめてあります。
また複数箇所に代入したい場合はタプル型で渡すことで可能です。

print(u'%sπは%f!'%('No!',3.141592))
#結果
#No!πは3.141592!

「%f」の浮動小数点数は小数点の後の桁数がデフォルトだと6です。
変更したい場合は%、ピリオド、桁数で変更できます。「%.2f」とすれば小数点が二桁になります。

print(u'%sπは%.2f!'%('No!',3.141592))
#結果
#No!πは3.14!

「%d」ではゼロパディングすることができます。
%、0、桁数、dです。「%04d」とすれば四桁の数値表記になります

a = 21
print('image.%04d.tif'%a)
#結果
#image.0021.tif

また辞書型を使用することで各要素のキーを代入することができます。

print('image_%(version)s.%(num)04d.tif'%{'version':'v01','num':21})
#結果
#image_v01.0021.tif

しかし上記のような記法はPython3では推奨されず廃止されるそうです!ここまでまとめたのに!!!
余白の書きなぐり:Python3の文字列について。%記法とformat()記法の対応関係

format()メソッドというものを使用するそうです。下記のサイト様が参考になりました。
gihyo.jp:第6回Pythonicな文字列フォーマットforamat()メソッド
Python 2.7ja1 documentation:7.1.3.2. 書式指定例
Python Snippets:format関数による文字列フォーマット
これについてもベーシックな使用方法の例を記します。(2.7以降のバージョンであれば下記に記述した例題は実行できます。maya2014のpythonは2.7.3でした。)

a = '!!!'
print('hello{}world'.format(a))
#結果
#hello!!!world

{}(カーリーブラケット)の部分に代入してくれます。
%演算子の例をformat()に置き換えてやってみます。

pi = 3.141592
print(u'πは{:d}!?'.format(int(pi)))
#結果
#πは3!?

「%d」の場合は変換し代入しますが、{:d}は書式を指定しているだけなのでfloat値の変数piをintに変換しないとエラーが出て代入することは出来ません。
まぁそもそもこんな無茶苦茶な使用することはないと思いますけど。
続きまして複数箇所に代入する場合です。

print(u'{}πは{}!'.format('No!',3.141592))
#結果
#No!πは3.141592!

単純に順番どおり代入してくれます。
また便利なのが代入の順序を番号を指定することで変更することが出来る点です。

print(u'{1}πは{0}!'.format('No!',3.141592))
#結果
#3.141592πはNo!!

浮動小数点数の桁数を変更する場合です。

print(u'{}πは{:.2f}!'.format('No!',3.141592))
#結果
#No!πは3.14!

ゼロパディングをする場合です。

a = 21
print('image.{:0>4}.tif'.format(a))
#結果
#image.0021.tif

またその他の幅寄せの方法です。

print('\'{:<10}\''.format("Hello")) #10文字幅。左寄せ
#結果
#'Hello     '
print('\'{:^10}\''.format("Hello")) #10文字幅。センタリング
#結果
#'  Hello   '
print('\'{:>10}\''.format("Hello")) #10文字幅。右寄せ
#結果
#'     Hello'
print('\'{:_>10}\''.format("Hello")) #詰め文字に_を指定。10文字幅。右寄せ
#結果
#'_____Hello'

辞書型を使用する場合です。

d = {'version':'v01','num':21}
print('image_{version}.{num:0>4}.tif'.format(**d))
#結果
#image_v01.0021.tif

%演算子とは書き方を変更しています。変数dにディクショナリを入れて、format()内でアンパックしてキーワード引数に使用してます。
アンパックについては下記サイト様がわかりやすいです。
Python 2.7ja1 documentation:4.7.4. 引数リストのアンパック
てくてくラボ:改めて文法の基本
リストやタプルからアンパックする場合は*演算子を使用し、ディクショナリからキーワード引数にアンパックする場合は**演算子を使用する。
解説できるほど理解できてませんが、簡単に言えば辞書型の個々のキーワードを引数としてformat()に渡すためにアンパックをしないといけないってことです。
簡単なアンパックの例です。

print(range(3, 6))             # 個別の引数を使った通常の呼び出し
#結果
#[3, 4, 5]
args = [3, 6]
print(range(*args))            # リストからアンパックされた引数での呼び出し
#結果
#[3, 4, 5]

まとめるのもだいぶ苦労しました…長かった…読み返すと最後の方だいぶ適当に書いてますね、まぁいいや…
正直%演算子は見辛いし美しくないので使うことはないですね。
将来的に廃止されるかもしれないものを使っても仕方ないですし。
やはりmelと違って出来ることも多い分覚えることも膨大ですね。
個人レベルの使用でツール作ったりするわけでもないので使う機会があるのかはわかりませんが、pythonはなかなか面白いですね。

最後に例文はテストなので現実的な使用方法ではございませんがご容赦ください!!!

  1. コメントはまだありません。

  1. トラックバックはまだありません。