Pythonの復習

とりあえず自分に役立つ
Pythonのチートシートとして。
できれば皆さんの役に立ちますように
必要があれば追記します。

# １．Python実行（Mac)
### ターミナルからPython実行
Pythonをインストールして下記コマンド
```bash
cd /Users/****/Desktop/Dev/python
python
```
これ書いてEnterすると下記の画面が出て
Pythonの対話モード（＞＞＞）になる
```bash
Python 3.10.9 (main, Mar  1 2023, 12:20:14) [Clang 14.0.6 ] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 
```
なお、やめるときは`quit()`と書いてEnterすれば移動したパスのところに戻る

### ファイルからPython実行
前もってcdでPythonを使う予定のフォルダに移動しておく
例えばMacでデスクトップのDevフォルダのpythonフォルダに移動して
app.pyを実行する場合は下記
```bash
cd /Users/****/Desktop/Dev/python
python app.py
```
# ２．仮想環境
### 仮想環境の作成
以下の作成のところで
`venv` という名前のディレクトリが作成され、その中に仮想環境が構築
結構よく使う

```bash
### 仮想環境の作成
python -m venv venv
##  仮想環境の有効化(Mac)
source venv/bin/activate
## 仮想環境の終了（無効化）->Command + c でも(macの場合）
deactivate

## パッケージのインストール（例: requests）
deactivate
## 必要パッケージを記録
pip freeze > requirements.txt
## 仮想環境に同じ環境を再現
pip install -r requirements.txt
```


# ３．チートシート

### 出力
```py
print('Hello, World')
```
### 単数行コメント
```py
# これはコメントです
```
### 複数行コメント
```py
#### 複数行コメント（推奨される正式な方法）###

# 1行目のコメント
# 2行目のコメント
# 3行目のコメント

#### 文字列リテラルを使った疑似コメント（非公式）###

"""
このようにクォートを使うことで
複数行の説明文を書くこともできる
主にdocstringに使われる
"""

```


### 変数と演算子
下３行がちょっと記憶曖昧なので注意

```py
x = 10
y = 3
print(x + y)    
print(x * y)    
print(x / y)    
print(x // y)   # 整数除算
print(x % y)    # 剰余
print(x ** y)   # べき乗

```
### リスト

```py
fruits = ['apple', 'banana', 'cherry']
print(fruits[0])          # 要素アクセス
fruits.append('orange')   # 追加
fruits.remove('banana')   # 値指定で削除
del fruits[1]             # インデックス削除

more = ['grape', 'melon']
combined = fruits + more  # 結合
```

### 辞書
辞書はまあまあ、よく使うよね
VBAにもあるし
```py
person = {"name": "Alice", "age": 25}
print(person["name"])          # アクセス
person["city"] = "Tokyo"       # 追加
del person["age"]              # 削除

people = [{"name": "A"}, {"name": "B"}]
for p in people:
    print(p["name"])
```

### タプル
タプルは変更不可のリストのようなもの、順序あり、辞書のキーなどに使える
未だにわかってない概念。復習必要かも

```py
# タプルはカッコ () を使い、変更できないリストのようなもの
colors = ('red', 'green', 'blue')

# 要素へのアクセス
print(colors[0])  # => 'red'

# アンパック（複数代入）
point = (3, 7)
x, y = point
print(x, y)  # => 3 7

# 1要素のタプルを作るにはカンマが必要
single = ('apple',)
print(type(single))  # => <class 'tuple'>

# タプルはイミュータブル（変更不可）
# colors[0] = 'yellow'  ← 実行するとエラー

```
### 集合(set)
集合：順序なし、重複なし、集合演算が可能

```py
# 集合は波カッコ {} または set() を使い、重複しない要素の集まりを表す
fruits = {'apple', 'banana', 'apple', 'orange'}
print(fruits)  # => {'banana', 'orange', 'apple'}（重複が自動で消える）

# 要素の追加
fruits.add('grape')

# 要素の削除
fruits.remove('banana')  # removeは対象がなければエラー
fruits.discard('melon')  # discardは存在しなくてもエラーなし

# 他の集合との演算
a = {'apple', 'banana'}
b = {'banana', 'cherry'}

print(a & b)  # 積集合（共通） => {'banana'}
print(a | b)  # 和集合（すべて） => {'apple', 'banana', 'cherry'}
print(a - b)  # 差集合（aからbを引く） => {'apple'}

# 空の集合は set() で作る（{} は空辞書になる）
empty_set = set()
print(type(empty_set))  # => <class 'set'>

# 0〜9までのうち、偶数だけを集めた集合を作る内包表記
even_set = {x for x in range(10) if x % 2 == 0}
print(even_set)  # => {0, 2, 4, 6, 8}
```

### 繰り返し

```py
# for文
for i in range(3):
    print(i)

# while文
i = 0
while i < 3:
    print(i)
    i += 1

# リストループ
for fruit in ['apple', 'banana']:
    print(fruit)

# 辞書ループ
person = {'name': 'Taro', 'age': 30}
for key, val in person.items():
    print(key, val)

# 内包表記
nums = [1, 2, 3]
squares = [n**2 for n in nums]
even = [n for n in nums if n % 2 == 0]

```
### if文
時々:を忘れる。他の言語と違うところだよなぁ
Case文も一応はあるが今んところあんまり使ってない？
必要なら追記します

```py
x = 10
if x > 5:
    print("大きい")
elif x == 5:
    print("等しい")
else:
    print("小さい")
```
### 関数
引数は（）の中、戻り値はreturnで返す。

```py
def greet(name):
    print(f"Hello, {name}!")

def add(a, b):
    return a + b

greet("Taro")
print(add(2, 3))
```

### オブジェクト・クラス
ちなみに、クラスや関数を先に書いて最後に本文を書くのが良い。
下記の場合だと、dog = Dog("Pochi")以下が本文。

```py
class Dog:
    def __init__(self, name):
        self.name = name

    def bark(self):
        print(f"{self.name} says woof!")

dog = Dog("Pochi")
dog.bark()
dog.breed = "Shiba"  # 属性追加
del dog.name         # 属性削除

```

### 例外処理
ここは他の言語ともよく似ているかな

```py
try:
    result = 10 / 0
except ZeroDivisionError:
    print("ゼロ除算エラー")
finally:
    print("終了処理")

```
### ファイル操作
ファイル操作はよくある。

```py
# 書き込み
with open("sample.txt", "w", encoding="utf-8") as f:
    f.write("Hello File!")

# 読み込み
with open("sample.txt", "r", encoding="utf-8") as f:
    content = f.read()
    print(content)
```
### クラスの継承
微妙にPHPとかと異なるかな

```py
class Animal:
    def speak(self):
        print("...")

class Cat(Animal):
    def speak(self):
        print("Meow!")

cat = Cat()
cat.speak()
```

### モジュール（自作・標準）
ここらへんはJSとよく似ているかな

```py
# sample_module.py
def hello():
    print("Hi from module!")

# main.py
import sample_module
sample_module.hello()
```
### 標準ライブラリ
結構よく使う気がします。多分結構使ってる。
math使わねーだろ、と思ったらDeepLearning系でよく使う。
AI扱うなら覚えておかねば。

```py
# math：数学関数
import math
print("--- math ---")
print(math.sqrt(16))          # 平方根
print(math.factorial(5))      # 階乗
print(math.pi)                # 円周率

# random：ランダム処理
import random
print("\n--- random ---")
print(random.randint(1, 10))          # 1〜10の整数
print(random.choice(['A', 'B', 'C'])) # 選択
items = [1, 2, 3, 4]
random.shuffle(items)
print(items)                          # シャッフル

# datetime：日時処理
import datetime
print("\n--- datetime ---")
now = datetime.datetime.now()
print(now)
today = datetime.date.today()
print(today)
tomorrow = today + datetime.timedelta(days=1)
print(tomorrow)

# calendar：カレンダー出力
import calendar
print("\n--- calendar ---")
print(calendar.month(2025, 5))  # 2025年5月のカレンダー

# os：OS操作
import os
print("\n--- os ---")
print(os.name)
print(os.getcwd())
# os.mkdir("test_dir")  # コメント解除でディレクトリ作成

# sys：システム情報
import sys
print("\n--- sys ---")
print(sys.version)
print(sys.argv)  # コマンドライン引数

# pathlib：ファイルパス操作
from pathlib import Path
print("\n--- pathlib ---")
p = Path("example.txt")
print(p.exists())   # 存在確認
print(p.resolve())  # 絶対パス

# statistics：統計処理
import statistics
print("\n--- statistics ---")
data = [1, 2, 3, 4, 4, 5]
print(statistics.mean(data))
print(statistics.median(data))
print(statistics.mode(data))

# collections：便利なデータ構造
from collections import Counter, defaultdict
print("\n--- collections ---")
c = Counter("aabbbcccc")
print(c)
d = defaultdict(int)
d["apple"] += 1
print(d)

# itertools：イテレータ操作
import itertools
print("\n--- itertools ---")
# 無限ループになるため注意：1個だけ表示
for i in itertools.cycle("AB"):
    print(i)
    break

product = list(itertools.product([1, 2], ['a', 'b']))
print(product)
```

### サードパーティ製パッケージ（例: requests）
まずTerminalで`pip install`をしないといけない

requestsはAPI関連でよく出ますね

```bash
pip install requests
```
```py
import requests
response = requests.get("https://httpbin.org/get")
print(response.status_code)
```

### フレームワーク（例: Flask）
上と同じくTerminalで（以下略）
私の場合はフレームワークは違うけど会社でよく使いますね

```bash
pip install flask
```
```py
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello Flask!"

# 実行： flask run
```
### APIの呼び出し（例: OpenWeatherMap）
「動かしながら学ぶPython」ではShopifyのAPIを使ったけど
大体やり方は同じです
ただ、仕様は当たり前だけど各団体によって異なるので
APIの確認は必須
まあ、ひとまずリクエストしてどんな形式になってるか確認して
目的のデータに絞って取得するっていう流れでいいのかな？
（仕様はまあ確認したほうがいいかな。。。）

```py
import requests

API_KEY = "your_api_key"
city = "Tokyo"
url = f"https://api.openweathermap.org/data/2.5/weather?q={city}&appid={API_KEY}"

response = requests.get(url)
data = response.json()
print(data["weather"][0]["description"])
```
### 番外編：Paiza用 標準入力・出力
普段はあんまりつかわない？
Paiza以外で使った記憶が。。。

```py
# 1行の入力を受け取る
s = input()
print(s)

# 数値として受け取る
n = int(input())
print(n * 2)

#スペース区切りの複数入力
a, b = map(int, input().split())
print(a + b)

#複数行の入力（最初に件数がわかっている場合）
n = int(input())
for _ in range(n):
    line = input()
    print(line)

# 裏技？ 入力全体を取得してリスト化
# JSの場合とよく似てるな
import sys
lines = sys.stdin.read().splitlines()
for line in lines:
    print(line)
```

++++++++++++++++++++++++++++++++++++++++++++++++++++++++

動かしながら学ぶPythonをベースにちょっと復習がてらまとめました