前書き

インストール

スペースの都合上、オンラインチュートリアルを参照してください (PythonにはAnacondaを推奨)。

コードリポジトリ

gitee

実行方法

「Hello World」を表示する例で説明します。

1
2
3
# main.pyファイル
name = input("あなたの名前を入力してください:")
print(f"こんにちは, {name}!")
1
python main.py

変数定義とデータ型

変数とは、メモリ上のあるアドレスを指す識別子であり、一般的にデータを格納するために使用されます。
データ型とは、変数の種類を示したもので、型によってその変数がメモリ上で占めるスペースの大きさが決まります。
代入とは、データ(値)を変数が指すアドレスに格納することであり、その後はこの変数を使ってそのデータを取得できます。

1
2
3
4
5
6
7
# 例:異なる型の変数を定義する
name = "Alice" # 文字列型
age = 25 # 整数型
height = 1.68 # 浮動小数点型
is_student = True # ブール型

print(f"{name} の年齢は {age}、身長は {height} メートル、学生かどうか: {is_student}")

配列array/リストlist/辞書dict|map/集合set/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# リストの定義
fruits = ["apple", "banana", "cherry"]

# 要素の追加
fruits.append("orange") # 末尾に追加
fruits.insert(1, "grape") # インデックス1の位置に挿入

# 要素の削除
fruits.remove("banana") # 値で削除
del fruits[0] # インデックスで削除

# 要素の変更
fruits[1] = "kiwi"

# リストの走査
for fruit in fruits:
print(fruit)

# 辞書の定義
person = {
"name": "Alice",
"age": 25,
"is_student": True
}

# キー値対の追加/変更
person["email"] = "alice@example.com"
person["age"] = 26

# キー値対の削除
del person["is_student"]

# 辞書の走査
for key, value in person.items():
print(f"{key}: {value}")

# 集合の定義
unique_numbers = {1, 2, 3, 4, 5}

# 要素の追加
unique_numbers.add(6)

# 要素の削除
unique_numbers.remove(3) # 要素が存在しない場合エラーが発生
unique_numbers.discard(10) # 要素が存在しない場合エラーは発生しない

# 集合演算
a = {1, 2, 3}
b = {3, 4, 5}
print(a.union(b)) # 和集合: {1, 2, 3, 4, 5}
print(a.intersection(b)) # 積集合: {3}
print(a.difference(b)) # 差集合: {1, 2}

フロー制御

フロー制御とは、プログラムの実行順序を定義することです。

順次実行

順次実行とは、上から順番に実行されることであり、これはプログラムの通常の実行フローです。

選択

選択とは、異なる条件に応じて異なるコードを実行することです。
選択のフローは単一分支と多分支に分かれます。

単一分支

単一分支とは、1つの分支ノードのみがあり、1回の条件判断しかありません。

1
2
3
4
# 例:単一分支 if文
score = 85
if score >= 60:
print("合格、試験通過!")

多分支

多分支には複数の分支ノードがあり、複数の条件判断があります (if-elif-else | switch-case)。

1
2
3
4
5
6
7
8
9
10
# 例:多分支 if-elif-else文
score = 75
if score >= 90:
print("成績は A")
elif score >= 80:
print("成績は B")
elif score >= 70:
print("成績は C")
else:
print("成績は D")

繰り返し

繰り返しとは、繰り返し実行されるプロセスのことです。

1
2
3
4
5
6
7
8
9
10
# 例:for文でリストを走査する
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
print(fruit)

# 例:while文で1から5を表示する
i = 1
while i <= 5:
print(i)
i += 1

関数

関数の本质はクロージャーであり、自身のスコープを持っています。
我々は関数を使ってコードの一部を定義でき、0または複数の入力を受け取り、関数内のコードを実行し、終了時に0または複数の出力を返します。
関数を使用することで共通ロジックを抽出し、コードを簡略化できます。

1
2
3
4
5
6
# 例:関数を定義して呼び出す
def greet(name):
return f"こんにちは, {name}!"

message = greet("Alice")
print(message)

クラス/構造体

クラス/構造体

クラスとは、データとメソッド(関数)を含む抽象的な構造であり、定義することができ、使用するためにクラスをインスタンス化する必要があります。つまり、メモリ上で指定されたサイズのスペースを確保して保存することです。
クラスのサイズは内部で何が定義されているか(例えばint)に依存し、コンパイラはデータサイズに応じてどのくらいのスペースを割り当てるか自動的に判断します。
1つのクラスから複数のインスタンス化オブジェクトを持つことができます。つまり、異なる変数が複数ありますが、これらの変数はすべてこのクラスの構造と一致しています。

1
2
3
4
5
6
7
8
9
10
11
12
# 例:クラスを定義してインスタンスを作成する
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

def introduce(self):
print(f"私は {self.name}、今年は {self.age} 歳です。")

# オブジェクトの作成
p1 = Person("Alice", 25)
p1.introduce()

インターフェース

インターフェース(Interface)構文は、動作仕様を定義する方法です。それは、ある型がどのようなメソッド(関数)を持つべきかを記述しますが、これらのメソッドが具体的にどう実装されるのかは気にしません。

インターフェースは一種の抽象的な契約(contract)です:

  • メソッド名、引数、戻り値のみを定義します。
  • 具体的な実装(論理コード)は一切含みません。
  • ある型がインターフェースの中で定義されたすべてのメソッドを実装したら、「そのインターフェースを実装している」と言われます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 例:abcモジュールを使ってインターフェースを模擬する
from abc import ABC, abstractmethod

class Animal(ABC):
@abstractmethod
def speak(self):
pass

class Dog(Animal):
def speak(self):
return "ワンワン!"

class Cat(Animal):
def speak(self):
return "ニャーオ!"

# 呼び出し
dog = Dog()
cat = Cat()
print(dog.speak()) # 出力: ワンワン!
print(cat.speak()) # 出力: ニャーオ!

フレームワーク

開発を簡略化するために、プログラマは共通ロジックを抽出して関数にまとめたり、クラスやメソッドにまとめたりします。この不断に簡略化する過程でフレームワークが誕生します。
ただし私の理解では、ライブラリ(library)は共通の方法やクラスを集めたツール集いであり、ユーザーは自分の好みで多くの異なるライブラリを追加して使用できます。一方、フレームワーク(framework)はプロジェクトの規範やテンプレートを定義し、ユーザーはフレームワークの上でフレームワークが定めた基準や構造に従って開発を行います。ただし常にこの境界線は明確ではなく、両者の言葉は混在して使われることが多いです。

web

私たちが今書いているプログラムはすべてローカルで実行されています。世界中のユーザーにも使ってもらうためには、ネットワーク上に公開する必要があり、webフレームワークは言語自体が提供するネットワークライブラリをカプセル化し、ネットワークサービスを開くためのいろいろなメソッドを提供します。

Pythonでよく使われるwebフレームワークはflask|fastapi|djangoで、ここではfastapiを例に挙げます。

1
pip install fastapi uvicorn -i https://pypi.tuna.tsinghua.edu.cn/simple
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from fastapi import FastAPI

# FastAPIインスタンスの作成
app = FastAPI()

# ルートパスの定義
@app.get("/")
def read_root():
return {"message": "FastAPIの世界へようこそ!"}

# 起動コマンド:uvicorn main:app --reload
import uvicorn

if __name__ == '__main__':
# mainはファイル名、: appはインスタンス変数名
uvicorn.run(app='app:app', host="127.0.0.1", port=8080, reload=True)

localhost:8080にアクセスして確認してください。Swagger UI:http://127.0.0.1:8000/docs ReDoc:http://127.0.0.1:8000/redoc

db

私たちはこれまで変数を使ってデータを格納してきましたが、変数のデータはメモリ上にあり、プログラムが停止するとメモリ上のデータは回収されます。次のプログラム起動時には、OSが割り当ててくるのは別のメモリ空間かもしれません。そのため、私たちはデータを永続化して保存する必要があり、それがデータベースシステムです。

ここではsqlalchemyを例に挙げます。

1
pip install sqlalchemy -i https://pypi.tuna.tsinghua.edu.cn/simple
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

Base = declarative_base()

class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
age = Column(Integer)

# エンジンとテーブルの作成
engine = create_engine('sqlite:///example.db')
Base.metadata.create_all(engine)

# データの挿入
Session = sessionmaker(bind=engine)
session = Session()
session.add(User(name="Charlie", age=30))
session.commit()

# データのクエリ
users = session.query(User).all()
for user in users:
print(user.name, user.age)

拡張

  • AI方向:
    • データ分析|機械学習|深層学習|強化学習
    • numpy(計算)|pandas(データ読み込みと処理)|matplotlib(可視化)
    • scikit-learn(機械学習)|tensorflow|pytorch(深層学習)
    • さまざまな機械学習モデルの実装|深層学習ニューラルネットワーク
    • langchain|llama-index 大規模モデルアプリケーション
  • 多スレッド/マイクロサービス/反射-動的プロキシ/ファイル操作/ネットワークプログラミング/
  • フレームワークの原理/手書きコード
  • wasm/grpc

コミュニティ

以下のプラットフォームで私に連絡することができます:


本站总访问量