Python3関連のことを調べてみた

Python3関連のことを調べてみた
目次

unittest pytestの一歩踏み込んだ使い方

# pytestの一歩踏み込んだ使い方

pytestを使ってテストを書いて~
中の関数呼び出しは mock があるから~
と言われたけれど、
関数のテストするには、例外処理とか、例にない mockの書き方とか
検索しても assert x == y までの書き方までが多くて、
リファレンス的なものにたどり着けなかったので、まとめ

# その関数がどの引数で呼ばれたか
“`python
from unittest import mock
mock_instance = mock.MagicMock(spec=MockModule)
mock_instance.method_name.assert_called_once_with(a, b, c)
“`

# 何回呼ばれたか
“`python
from unittest import mock
mock_instance = mock.MagicMock(spec=MockModule)
mock_instance.method_name.call_count == 1
“`
# メソッドの中で呼んだメソッドで例外を起こしたい

元記事を表示

【Python】ModuleNotFoundErrorの原因は環境変数PYTHONPATHにあった…

# エラー概要
以前まで使用していたpytestを実行したら、「`ModuleNotFoundError`」になって、失敗してしまった。

> xxx.app.main import app E ModuleNotFoundError: No module named ‘xxx’

# 原因と解決方法
今回の原因は`PYTHONPATH`にありました。

まずは以下のコマンドで確認。

“`
echo $PYTHONPATH
“`

そして今回実施するプロジェクトのルートディレクトリがない場合は以下のように追加してあげます。

“`
export PYTHONPATH=”${PYTHONPATH}:/xxxx”
“`

ディレクトリ構造は以下の通り。

使用したtestファイルでは、プロジェクトのルートディレクトリから別のディレクトリのモジュールをインポートして使用していたのですが、それが原因なのか。以前までできていたような気がするのだが…

よく仮想環境venvを使っているので、その切り替えや新規作成により、設定に影響があったのかも。
または、何がしか(IDEと

元記事を表示

【Python3】ハノイの塔 (paizaランク A 相当):アルゴリズム付きの解説

https://paiza.jp/works/mondai/real_event/hanoi

**要求分析**
– 3つの杭(A、B、C)があり、杭Aには `n` 個の円盤が大きい順に積まれている。
– `n` 個の円盤を最短手順で杭Aから杭Cに移動させる。
– `t` 回の移動後の各杭の状態を出力する。

**アルゴリズム**
1. 初期状態を設定し、各杭に円盤を配置。
2. 再帰的に円盤を移動する関数 `move_disks` を定義。
3. 移動後の各杭の状態を出力する。

以下は実装例です。

“`python
def hanoi(n, t):
# 初期状態の設定
pegs = [list(range(n, 0, -1)), [], []]
moves = []

# ハノイの塔の再帰的な移動関数
def move_disks(num_disks, from_peg, to_peg, aux_peg):
if num_disks == 0:
return
move_disks(n

元記事を表示

【Python3】Fizz Buzz (paizaランク C 相当):アルゴリズム付きの解説

https://paiza.jp/works/mondai/c_rank_skillcheck_sample/fizz-buzz

以下の要件を満たす「Fizz Buzz」アルゴリズムを作成します。

**要求分析**
– 標準入力から整数 `N` を読み込む。
– 1から `N` までの整数を順に処理し、特定の条件に従って出力を変更する。

**アルゴリズム**
1. `N` を標準入力から読み込む。
2. 1から `N` までの整数を順に処理する。
3. 各整数 `i` に対して以下を行う:
– `i` が3の倍数かつ5の倍数の場合、`”Fizz Buzz”` を出力。
– `i` が3の倍数の場合、`”Fizz”` を出力。
– `i` が5の倍数の場合、`”Buzz”` を出力。
– その他の場合、整数 `i` をそのまま出力。

以下は実装例です。

“`python
# 標準入力から整数Nを読み込む
N = int(input().strip())

# 1からNまでの整数を順に処理
for i in range(1, N + 1):
#

元記事を表示

【Python3】文字列収集 (paizaランク S 相当)をやってみた

https://paiza.jp/works/mondai/real_event/word_collection

以下に、【問題】に対応するPythonソースコードを作成し、解説を行います。

“`python
# 入力の読み込み
import sys
input = sys.stdin.read

# 入力データを一括で読み込む
data = input().split()

# NとMを取得
N = int(data[0])
M = int(data[1])

# N個の文字列とその価格を格納するリスト
strings = []
prices = []

# N個の文字列と価格をリストに分割して格納
index = 2
for _ in range(N):
strings.append(data[index])
prices.append(int(data[index + 1]))
index += 2

# M個のクエリを格納するリスト
queries = []
for _ in range(M):
queries.append(data[in

元記事を表示

【Python3】【殿堂入りキャンペーン】お菓子の詰め合わせ (paizaランク A 相当)をやってみた

https://paiza.jp/works/mondai/a_rank_skillcheck_archive/school_hiking

“`python
# utf-8
def combinations(iterable, r):
# combinations()関数は、与えられたiterableからr個の要素を持つすべての組み合わせを生成するジェネレータです。
pool = tuple(iterable) # 入力のiterableをタプルに変換してpoolに格納します。
n = len(pool) # poolの長さ(要素の数)を取得します。
if r > n: # rがnより大きければ、組み合わせは存在しないので終了します。
return
indices = list(range(r)) # 組み合わせを表すインデックスのリストを作成します。
yield tuple(pool[i] for i in indices) # 最初の組み合わせを生成して返します。
while True:

元記事を表示

【Python3】じゃんけんの手の出し方 (paizaランク A 相当)をやってみた

以下に、Pythonプログラムを解説します。

“`python
# じゃんけんの手の出し方
n, m = map(int, input().split()) # じゃんけんの回数 n と出す指の本数の合計 m を入力
s = input() # 相手のじゃんけんの手を表す文字列 s を入力

# じゃんけんの手のカウントを初期化
enemy_g, enemy_c, enemy_p = 0, 0, 0
for v in s:
if v == “G”:
enemy_g += 1 # 相手がグーを出す回数をカウント
elif v == “C”:
enemy_c += 1 # 相手がチョキを出す回数をカウント
else:
enemy_p += 1 # 相手がパーを出す回数をカウント

ans = 0 # 勝つ回数の最大値を格納する変数
# 0 ≦ p ≦ m//5 の範囲で p(パーの回数)を全探索
for p in range(m // 5 + 1):
c = (m – p * 5) // 2

元記事を表示

【Python3】山折り谷折り (paizaランク A 相当)をやってみた

https://paiza.jp/works/mondai/real_event/origami

“`python
# 山折り谷折り A
# utf-8

”’
N 回折ったときの折り目は N-1 回折ったときの折り目から簡単に求めることができます。
1 回折ったときの折り目は “0”、2 回折ったときの折り目は “0” + “0” + “1” = “001”、3 回折ったときの折り目は “001” + “0” + “011” = “0010011” です。
N-1 回折ったときの折り目の文字列を S、S を逆順にし、0 と 1 を反転させた文字列を S’ とすると、N 回折ったときの折り目の文字列は S + “0” + S’ となります。

N 回折ったときの折り目の数 2N-1 個の要素を持つ配列を用意します。
方針の通りに 1 回折ったときの折り目から順に N 回折ったときの折り目までを順に求めます。
”’

# 入力値を取得
N = int(input())

# 折り目の数 2^N – 1 を計算して配列のサイズを決定
size = 2 ** N – 1

# 折り目

元記事を表示

【Python3】本の整理 (paizaランク A 相当)をやってみた

このコードでは、本の位置情報を記録する配列を用いて、効率的に交換回数を計算しています。

“`python
# 入力を読み込む
N = int(input())
shelf = [int(x) – 1 for x in input().split()]

# 各本の位置を記録する配列を用意
pos = [-1] * N
for i in range(N):
pos[shelf[i]] = i

# 交換回数を記録する変数
ans = 0

# 本棚の本を並び替える処理
for i in range(N):
# 既に正しい位置にある本はスキップ
if shelf[i] == i:
continue

# 交換回数を増やす
ans += 1

# i番目の本と現在の正しい位置にある本を交換
shelf[pos[i]] = shelf[i]
pos[shelf[i]] = pos[i]

# 交換回数を出力
print(ans)
“`

### プログラムの説明

1. **入力の読み込み**

元記事を表示

【Python3】長テーブルのうなぎ屋 (paizaランク B 相当)をやってみた

https://paiza.jp/works/mondai/b_rank_skillcheck_sample/long-table

以下は、うなぎ屋の座席配置をシミュレーションするPythonプログラムです。

“`python
# 入力を標準入力から読み取る
import sys
input = sys.stdin.read

# メイン処理関数
def main():
# 入力データを読み取り、行ごとに分割する
data = input().strip().split(‘\n’)

# 最初の行から座席数(n)とグループ数(m)を取得
n, m = map(int, data[0].split())

# 座席の使用状況を管理するリスト(Falseは空いている、Trueは埋まっている)
seats = [False] * n

# 座れた人数のカウンター
seated_count = 0

# 各グループの処理
for i in range(1, m + 1):
a_i, b_i =

元記事を表示

Attention機構を図解しながらわかりやすく説明する

# はじめに
[ゼロつく2](https://amzn.to/3zMUT0C)で解説されているAttention機構について、私の理解を含めて解説したいと思います。
また、ゼロつく2以外にも情報収集し、いくつか参考になった情報を加えてAttentionについて理解が深まるように記事を書きたいと思います。

# Attentionとは
* 入力データの中から重要な部分に焦点を当てる仕組み
* 自然言語を中心に発展した深層学習の技術の1つで、機械翻訳や文章生成の性能向上に寄与

## Attentionの利点
* 長い依存関係の処理
* 従来のRNNでは入力文章が長くなると、情報が保持しにくいという点がありましたが、重要な部分に焦点を当てることで効果的に処理できるようになりました
* 説明可能性の向上
* どこに焦点を当てているかを可視化することでモデルがどのように予測しているかを理解することができます
* 並列処理性能の向上
* TransformerのようなAttentionベースのモデルは並列処理に適しており、GPUを効率的に使用できます。従来のRNNでは、各

元記事を表示

EasyOCRインストール時の注意点(2024/6以降)

# はじめに

先日(2024/7)新しく構築した環境でEasyOCRを使ったプログラムがなぜか動かなかった(既存環境ならちゃんと動く)。調べたところ、EasyOCRが依存パッケージのバージョンアップについていけていないようなのでまとめた。

# 環境

+ EasyOCR 1.7.1
+ Python 3.9.13 / Python 3.12.4 (両方ともMicrosoft Store版)
+ Windows 10 Pro (64bit) 22H2

# 状況

EasyOCRを使ったプログラムを実行すると次の2種類のメッセージが出て、プログラムが異常終了する

“`
A module that was compiled using NumPy 1.x cannot be run in
NumPy 2.0.1 as it may crash. To support both 1.x and 2.x
versions of NumPy, modules must be compiled with NumPy 2.0.
Some module may need to rebuild

元記事を表示

【Python3】みんなでしりとり (paizaランク B 相当)をやってみた

https://paiza.jp/works/mondai/b_rank_skillcheck_archive/word_chain

“`python
# coding: utf-8

# 入力を受け取る
N, K, M = [int(i) for i in input().split()] # しりとりをする人数、単語リストの数、しりとりの発言数を取得
d_dict = {input() for i in range(K)} # 単語リストをセットに格納
m_list = [input() for i in range(M)] # しりとりの発言ログをリストに格納
n_list = [i + 1 for i in range(N)] # プレイヤーの番号リストを作成

n = 0 # 現在のプレイヤーのインデックス
flg = 0 # 直前のプレイヤーがルールを破ったかどうかを示すフラグ

# しりとりの発言を順番に処理する
for i in range(len(m_list)):
z = “” # ルールを破ったプレイヤーの番号を格納する変数
if

元記事を表示

【Python3】神経衰弱 (paizaランク B 相当)をやってみた

https://paiza.jp/works/mondai/b_rank_skillcheck_archive/concentration

**問題**:
神経衰弱と呼ばれるトランプゲームのシミュレーションを行います。数字が書かれたトランプを縦 H 枚、横 W 枚の長方形の形に並べた状態でスタートします。トランプには1〜13の数字のうちどれかが書かれており、同じ数字のトランプが複数存在します。プレイヤーが N 人おり、各プレイヤーがトランプをめくっていき、めくった2枚のトランプに同じ数字が書かれていればそのトランプを取り除きます。ゲームの初期状態とトランプの記録が与えられるので、各プレイヤーが取り除いたトランプの枚数を求めます。

**入力値**:
“`
H W N
t_{1,1} t_{1,2} … t_{1,W}
t_{2,1} t_{2,2} … t_{2,W}

t_{H,1} t_{H,W}
L
a_1 b_1 A_1 B_1
a_2 b_2 A_2 B_2

a_L b_L A_L B_L
“`

**期待される出力値**:
“`
各プレイヤーが

元記事を表示

Pythonマルチスレッド検証

## PythonのマルチスレッドでSQLite3からデータを取得する検証
### マルチスレッドでSQLite3からデータを取得する
#### 1.参照するテーブルのレイアウト
+ test_db.sqlite3.large_data

| 列名 | データ・タイプ |
|:-:|:-:|
| id | INT |
| col1 | INT |
| col2 | TEXT |
| 〜 | |
| col15 | TEXT |

#### 2.検証用コード
+ あらかじめ dataset をインストールしておくこと
“`
pip install dataset
“`
“`sqlite3_multi_thread.py
import concurrent.futures
import datetime
import traceback
import dataset

# 取得条件
CONDITIONS = [
{‘db’: ‘1’, ‘min’: ‘1’, ‘max’: ‘1000000’},
{‘db’: ‘2’, ‘min’: ‘1000001’, ‘max’

元記事を表示

Python、SQLite3でのマルチプロセステーブル生成

## Python、SQLite3でのマルチプロセステーブル生成検証

#### 1.検証内容
+ 1つのDBのテーブルを参照する。参照結果をもとに複数のDBに各々テーブルを作成する
+ sqlite-utilsモジュールを使用して、1SQLクエリで複数のDBのテーブルを使用する
+ マルチプロセスでテーブルを参照、作成する

#### 2.参照するテーブルのレイアウト
+ test_db.sqlite3.large_data
+ test_db.sqlite3.large_data2
+ test_db.sqlite3.large_data3

| 列名 | データ・タイプ |
|:-:|:-:|
| id | INT |
| col1 | INT |
| col2 | TEXT |
| 〜 | |
| col15 | TEXT |

#### 3.作成するテーブルのレイアウト
+ db_1.sqlite3.table_1
+ db_2.sqlite3.table_2
+ db_3.sqlite3.table_3
+ db_4.sqlite3.table_4
+ db_5.sqli

元記事を表示

【Python】基本!PEP8を意識して書いてみた!

# 本日の内容
今日の記事はPythonを使用する上で基礎的な情報を記載していきます。
実際に勉強会でも使用する内容になります。
下記に記載しているコードはコードスタイル「PEP8」を意識して記載しています。
PEP8については以下のサイトをご覧ください。

https://peps.python.org/pep-0008/

## 変数と四則演算

Pythonでは、整数、文字列、リスト、関数など、すべての値はメモリ上のどこかに存在するオブジェクトです。
変数には、値がどこにあるのかを示す「オブジェクトID」(オブジェクトのアドレス)が代入されます。
コードは以下になります。
“`python
# 変数
num = 1 # メモリ上に整数値1のint型オブジェクトが作られ、変数numにはオブジェクトIDが代入される
print(type(num)) #

moji = “こんにちは”
print(type(moji)) #

num_1 = 1.1
print(type(num_1)) #

元記事を表示

sys.argvの個人的まとめ

# 0.sys.argvとは
sys.argv は、Python でコマンドライン引数を処理するために使用されるリストです。プログラムがコマンドラインから実行されたとき、その引数が sys.argv に格納されます。

# 1.sys.stdinとの比較

sys.argv はコマンドライン引数を取得するために使用され、プログラムの起動時に与えられる入力に対応します。
sys.stdin は標準入力からデータを読み取るために使用され、プログラムの実行中に提供される入力に対応します。

# 2.sys.argvのコードの例

“`python:
import sys

# コマンドライン引数のリストを表示
print(“コマンドライン引数:”, sys.argv)

# コマンドライン引数が2つ以上ある場合、それらを表示
if len(sys.argv) > 1:
print(“引数のリスト:”)
for i, arg in enumerate(sys.argv[1:], start=1):
print(f” 引数 {i}: {arg}”)
else:

元記事を表示

Pythonの標準入力sys.stdinの個人的まとめ

# 0.はじめに

Pythonのユーザー入力というとinput()とsys.stdinの2つがありますが、ここではsys.stdinについて記載したいと思います。

# 1.sys.stdinとは
sys.stdinはファイルオブジェクトの一種で、標準入力(通常はキーボード)から直接データを読み取ることができます。主にスクリプトやプログラムで標準入力から一括してデータを読み取るのに使われます。

# 2.input()との比較

## 2.1.対話型入力と一括入力

input(): 対話型で一行ずつ入力を受け取るのに適しています。
sys.stdin: ファイルやパイプからの一括入力や複数行の入力を処理するのに適しています。

## 2.2.プロンプト表示

input(): プロンプトメッセージを表示してユーザーに入力を促します。
sys.stdin: プロンプトは表示されません。直接入力を受け取ります。

## 2.3.用途

input(): 主にスクリプトの対話型入力に使用されます。
sys.stdin: 標準入力からのデータ読み込みが必要なスクリプトや、リダイレクトされ

元記事を表示

【Python3】【殿堂入りキャンペーン】残り物の量 (paizaランク C 相当)をやってみた

https://paiza.jp/works/mondai/c_rank_skillcheck_archive/leftover

**問題: スーパーマーケットの生鮮食品の売れ残り計算**

**入力**:
1. 生鮮食品の初期重量 `m` (kg)
2. 生のまま販売した時の売上割合 `p` (%)
3. 売れ残りをお惣菜にした時の売上割合 `q` (%)

**出力**:
– 最終的な売れ残りの重量 (kg)

**アプローチ**:
1. 初期重量 `m` から `p%` を売り上げる
2. 残りの `m` から `q%` をお惣菜として売り上げる
3. 最終的な売れ残りを計算して出力

**コード**:
“`python
def solve(m, p, q):
# 最初に売れた量を計算 (生のまま)
sold_initially = m * p / 100.0
# 最初に売れた後の残りの量
remaining_after_first_sale = m – sold_initially
# 残りをお惣菜にして売れた量を計算
s

元記事を表示

OTHERカテゴリの最新記事