ゆうは

わかりたいことをすべて、そして深堀り

Pythonを自動整形してくれるBlackを使う

Pythonを使うとき、Flaskの本に載っていたのを何も考えずに使っていました。

なんとなく使いだしたのですが、コードが見やすくなって今ではないと気持ちが悪く感じるようになってしまいました。

その書籍はこちら↓です。
44ページの「コードチェッカー・フォーマッターを利用する」です。

自動整形のblack

書籍には「flake8」「black」「isort」「mypy」が紹介されていたのですが、私は初心者なので長いコードを書くわけではないので4つの効果を感じることができません。

私が絶対に欲しいのは、コードを見やすくしてくれる自動整形の「black」です。

blackは書籍には以下のように説明があります。

PEP8に沿った書き方にコードを自動整形

blackの導入方法

ここ最近、新しい環境を作ることがなかったので、いざ新しい環境を作って自動整形を導入しようとしたらやり方を忘れてしまいました。

blackの導入方法を書籍ではなくネットで調べてみたところ、機能拡張で簡単にできるようになっていました。

導入方法は以下の2つだけです。 1. 機能拡張をインストールする 2. 右クリックで「ドキュメントのフォーマット...」を選択

機能拡張をインストールする

以下の画像の機能拡張をインストールします。

右クリックで「ドキュメントのフォーマット...」を選択

そして、pyファイルが表示されているところで右クリックして「ドキュメントのフォーマット...」を選択します。

これでblack導入完了です。

あとは、setting.jsonで以下のようになっているか確認すると実感できます。

これだけでPythonのコードが読みやすくなります。

ちなみに、私は「=」の両側に半角スペースをつけてほしくて自動整形を求めております。

関連記事

「flake8」「black」「isort」「mypy」についての記事です。 yuuuha.hatenablog.com

AtCoderのABC363の振り返り

AtCoderのABC363の振り返りです。

今回もやっぱりA問題とB問題だけしか解けませんでした。C問題はなんとかできそうなので次回までにがんばって解いてみようと思います。

atcoder.jp

A - Piling Up

A問題なのでひっかけ的な要素はないと信じて、問題文のままコードを書いていきました。提出するときはドキドキしましたが正解で安心しました。

R = int(input())

if R <= 99:
    print(100-R)
elif 100 <= R and R <= 199:
    print(200-R)
elif 200 <= R and R <= 299:
    print(300-R)
elif 300 <= R and R < 399:
    print(400-R)

A - Piling Up

B - Japanese Cursed Doll

B問題もひっかけなしを信じて考えました。ABS(AtCoder Beginners Selection)の「Shift only」と同じように解いてみました。

N, T, P = map(int, input().split())
L = list(map(int, input().split()))

cnt = 0
while True:
    total = 0
    for i in range(N):
        if L[i] >= T:
            total += 1
    if total >= P:
        break
    for i in range(N):
        L[i] = L[i]+1
    cnt += 1

print(cnt)

B - Japanese Cursed Doll

BlenderのPythonの移動・回転・スケール

BlenderではPythonが使えるんだ!」と感動して、2年くらい前に勉強していたことがありました。

当時はPythonBlenderも超初心者で、あまりにもやることやできないことが多すぎてギブアップしてしまいました。

Blender Python完全ガイド

それからもずっと興味はあって「またやろう」とずっと思っていました。

そんな時、アマゾンで『Blender Python完全ガイド』という書籍を発見しました。
ずっと気にしていたのですが最近購入してみたところ、すごくわかりやすくて改めて勉強を始めました。

Pythonコンソール

特によかったのは書籍の前半部分のPythonコンソールを使う部分です。「なるほど、こうやって使うと便利だな」とPythonを使う意味が理解できました。

2年前に思っていたのは、Pythonを使えば「複雑なデザインや複雑なオブジェクト配置ができる」という感じの認識でした。

確認や移動など

Pythonコンソールを利用してオブジェクトの確認や移動ができます。

例えば、以下の位置の確認です。

bpy.context.active_object.location
# Vector((0.0, 0.0, 0.0))

また、以下のように移動もできます。

bpy.context.active_object.location.x = 1.0

確認や移動はできるのですが、確認や移動はPythonを使わなくてもできますし、上の例のような1行だけならPythonを使わないほうがいいくらいです。

大量のオブジェクトの場合

しかし、オブジェクトが大量にある場合はPythonを使ったほうが楽になります。

例えば、画面上にあるオブジェクトのタイプを調べることが可能です。

for o in bpy.data.objects:
    o.type

# 'CAMERA'
# 'MESH'
# 'MESH'
# 'LIGHT'
# 'META'
# 'FONT'

そして、以下のようにオブジェクトのxをゼロに揃えたりできます。

for o in bpy.data.objects:
    if o.type=='MESH':
        o.location.x=0

このようにデザインや複雑な配置だけではなく便利な使い方があることを知れました。一気に楽しくなりました。

移動・スケール・回転のまとめ

移動

bpy.context.active_object.location
# Vector((0.0, 0.0, 0.0))

bpy.context.active_object.location.x
bpy.context.active_object.location.y
bpy.context.active_object.location.z

スケール

bpy.context.active_object.scale
# Vector((1.0, 1.0, 1.0))

bpy.context.active_object.scale.x
bpy.context.active_object.scale.y
bpy.context.active_object.scale.z

回転・角度

bpy.context.active_object.rotation_euler
# Euler((0.0, 0.0, 0.0), 'XYZ')

bpy.context.active_object.rotation_euler.x
bpy.context.active_object.rotation_euler.y
bpy.context.active_object.rotation_euler.z

Blenderで文字を打つ方法

Blenderでテキストを使いたいな」と思ってやってみたけどうまくいかない。

テキストを打つ方法を調べてみたら、私にとってのベストな記事がありました。

このページです→ Blender3.0 テキストの使い方/日本語入力、厚みづけなど | しぐにゃもブログ

Textを選ぶ

Add(追加)から「Text」を選択します。

「Text」を選ぶと、以下のように「Text」が表示されます。

「Text」が表示された状態でtab(タブ)を押すと、カーソルが表示されて文字を入力できます。

日本語入力

しかし、この状態では日本語が入力できません。私の環境では日本語入力に変えることもできません。

なので、メモ帳などでテキストを打ってコピーして、Blenderにペーストするしかないようです。

フォント選択

フォントは以下のキャプチャの赤矢印部分をクリックして日本語フォントを選択します。

参考書籍

Blenderへの日本語入力の件は、書籍『Blender Python完全ガイド』の61ページのコラム部分に「WARNING」として紹介されています。

参考にしたページ

signyamo.blog

AtCoderのABC362の振り返り

AtCoderのABC362の振り返りです。

今回もやっぱりA問題とB問題の2問しか解けませんでした。B問題に時間がかかってしまいました。そして、アニメ『物語シリーズ』の新シーズンがあったので22時で切り上げてしまいました。

atcoder.jp

A - Buy a Pen

嫌いな色をlists.remove()で削除して、min()で最小値を出しました。

RGB = list(map(int, input().split()))
C = input()


if C == 'Red':
    c = 0
elif C == 'Green':
    c = 1
elif C == 'Blue':
    c = 2

RGB.remove(RGB[c])

print(min(RGB))

A - Buy a Pen

B - Right Triangle

最初に出した解答はWAになってしまいました。おそらく考え方は間違っていないだろうと思って、細かい部分を確認していきました。

最初は「直角三角形の定理」にひっぱられてしまって、計算時にルートしてしまってました。ルートすることで小数点以下の数値が変わってしまったと思います。ルートしなかったら正解になりました。

xa, ya = map(int, input().split())
xb, yb = map(int, input().split())
xc, yc = map(int, input().split())

AB = (xa-xb)**2+(ya-yb)**2
BC = (xb-xc)**2+(yb-yc)**2
CA = (xc-xa)**2+(yc-ya)**2

T = [AB, BC, CA]
c = max(T)
T.remove(c)

x = T[0]
y = T[1]
z = c

if x+y == z:
    print('Yes')
else:
    print('No')

B - Right Triangle