10年以上C#を書いた人がPythonで覚えたことの備忘録

10年以上C#で開発してきて、Pythonを使うことになったので印象に残っているC#のこれはPythonだとこう書くっていうのを備忘録として残しておくので、参考になれば幸いです。

基本的な型

List

//初期化
var list = new List<string>();

// 要素の追加
list.Add("abc");
list.Add("あいうえお");

// 値が含まれているか
contains = list.Contains("efg")
Console.WriteLine(contains) -> false

// 値を削除
list.Remove("abc");

// 件数を取得
var count = list.Count;

// インデックスを指定して取得
var item = list[0]

// 先頭、末尾を取得(System.Linq)
var first = list.First();
var last = list.Last();
# 初期化
list: list = []

# 要素の追加
list.append("abc");
list.append("あいうえお");

# 値が含まれているか
contains ="efg" in list
print(contains) -> false

# 値を削除
list.remove("abc")

# 件数を取得
count = len(list)

# インデックスを指定して取得
item = list[0]

# 先頭、末尾を取得
first = list[0]
last = list[-1]

Dictionary

// 初期化
var dict= new Dictionary<int, string>();

// 初期化2
var dist2= new Dictionary<int, string>()
{
    {1, "abc" },
    {2, "あいうえお" },
};

// 追加
dict.Add(1, "abc");
dict.Add(2, "あいうえお");

//値取得
var value = dict[1];

//キー判定
var containsKey = dict.ContainsKey(1);

// 削除
dict.Remove(1);

// キーの一覧取得
foreach (var key in dict.Keys)
{ }

// 値の一覧取得
foreach (var value in dict.Values)
{ }
# 初期化
dict = {}

# 初期化2
dist2 = {
    1: "abc",
    2: "あいうえお",
    }
## 同じキーを追加しても例外にならずに後勝ちになる(C#はキー重複で例外)
dict = {
    1: "abc",
    1: "あいうえお",
    }

# 追加
dict[1] = "abc"
dict[2] = "あいうえお"

# 値取得
value = dict[1]

# キー判定
containsKey = 1 in dict

# 削除
del dict[1]
## もしくは
dict.pop(1) # ただしキーが存在しないとエラーになる

# キーの一覧取得
for key in dict.keys:
    pass

# 値の一覧取得
for value in dict.values:
    pass

制御文

for

for (var index = 0; index < 5; index++)
{ }
for index in range(0, 10):
  pass

foreach

Pythonにforeachはなく、for文を使う

var list = new List<string>();
foreach(var item in list)
{ }
list: list = []
for item in list:
    pass

Satisfactoryの風景

2019年からコツコツやってるSatisfactory

全体像

位置的には、GRASS FIELDS (草原)の近くにある池?が2つ繋がっているエリアです。 地域住民の反対を無視してきれいな湖を埋め立てて建築を強行

MAP

全体風景
あのきれいな湖の面影すら残っていないくらい完璧に埋め立て工場 鉄、銅などから始まるすべての素材をこの工場で生産しているので超ツメツメ状態

生産設備①

1つの工場にすべての生産を突っ込んでるが流石に鉄系、銅系などによってエリア分け

鉄系のライン

地下1
地下2
工場全体が二重底構造で、汚いものはすべて床下に隠してしまえ発想 各生産ライン間の接続はすべて、床下に詰め込んで地上スッキリ中カオス

生産設備②

ここももとはきれいな湖で、もちろん埋め立て アルミの生産ラインはここ

アルミ系生産ライン

Updateが入って途中から水が必要!窒素が必要!とか言われて都度工事。

お家

お家には各種素材は生産物を保存する全手動の倉庫を完備 どこに何が入っているかわかりやすくてイイね!

倉庫

ブレーカー

工場の生産エリアごとに分電盤を設置して、エリア単位で供給停止ができるように。 なぜ? 停電になったときに復旧を簡単にするためですよ

ブレーカー

以上、とりあえずこんな感じでセンスないですが、Updateの度に増改築してマイルストーン達成していますが、そろそろこの工場では敷地的に厳しくなってきたなー

スクリーンショットの画像に枠線を付ける

ブログ記事書くために、スクショ取って載せる時になんか、締り?見栄えが良くないなーって思って画像の1pxの枠線を付けるんですよね

これを こういう風に

特に背景が白のときはスッキリ見えて個人的にこの一手間が好きです ただ、これいろいろやり方があり、ここ数年では、[Windows] + [Shift] + [S]によるスクリーンショットの枠線を自動で追加の機能が非常に便利でしたが、スクショ撮ったときにしか使えなかったのでちょい不便

C#使ってクリップボードから画像を取り出して、Bitmap作ってGraphicsで四角書いて~とかやってましたがいま時代、ブラウザでも簡単にできたんですよね 作ってみた、完全に個人の趣味

wakusentsuika.com

  • クリップボードやローカルの画像ファイルを読み取って任意の太さ、色の枠線を追加
  • JavaScriptですべて処理をするので、外部に画像を送信しない安心設計

WebView2を使ってブラウザごとにユーザプロファイルを作成する方法

FormのロードイベントなどWebViewが初期化されるタイミングで、下記の環境設定をいれることでプロファイルの保存先を自由に変更することが可能です。
WebView2のインスタンスごとにプロファイルの保存先を設定すれば各WebView2で異なるプロファイルを保持できるため擬似的にプロファイルを保持しないブラウザを作成することが可能になります。

 var environment = await Microsoft.Web.WebView2.Core.CoreWebView2Environment.CreateAsync(
     null,
     ".\profile"
 );

 await webView.EnsureCoreWebView2Async(environment);