コース紹介#
フェーズ 1:基礎から上級へ#
3 つのプロジェクト
- ATM + ショッピングカート:手続き型
- 選択科目システム:オブジェクト指向
- コンピュータウイルス:プログラム、サーバー、クライアント
フェーズ 2:ビジネスプロジェクト#
- BBS
- ルフィ学城
- WeChat ミニプログラム
- クローラー
- データ分析:金融量的取引
- 自動化運用:cmdb、コードリリース
- GO 言語開発
- 人工知能分野
コンピュータ#
コンピュータの 5 大構成要素#
- CPU 中央処理装置
- コントローラー:他のすべてのコンポーネントを制御
- 演算器:数学演算と論理演算
- メモリ io デバイス:データの読み書き
- RAM:電気ベース、電源が切れるとデータが失われ、一時的なアクセスに使用
- 外部ストレージ:ハードディスク、磁気ベース、アクセスが遅く、永続的に保存
- 入力デバイス:キーボード、マウス
- 出力デバイス:ディスプレイ、プリンター
オペレーティングシステム#
概念#
- コンピュータハードウェアの制御
- ハードウェアの複雑な操作のカプセル化
ソフトウェア
- アプリケーションソフトウェア
- システムソフトウェア
コンピュータアーキテクチャの三層構造#
- アプリケーション
- オペレーティングシステム
- コンピュータハードウェア
プラットフォームとクロスプラットフォーム#
プラットフォーム:
- オペレーティングシステム
- コンピュータハードウェア
その他#
プログラムと三大コアハードウェア#
プログラム:ハードディスク -> メモリ
CPU はメモリから命令を読み取り実行
CPU の詳細#
CPU の分類と命令セット#
- X86-32bit:intel
- x86-64bit:AMD
命令セット、つまり CPU 内で計算とコンピュータシステムを制御するための命令の集合
- 簡素命令セット RISC:命令が短く、安定
- 複雑命令セット CISC:命令が長く、豊富
X86-64#
-
x86:intel が世界初の CPU8086 を発明したため、このアーキテクチャのモデルを総称して x86 と呼ぶ。
-
64 ビット:CPU が一度にメモリから何ビットのバイナリ命令を取得できるか。
CPU には下位互換性がある。
レジスタ#
CPU と同じ素材で、メモリよりも速い。CPU が必要とする重要なデータを保存し、CPU のデータ取得速度を向上させる。
カーネルモードとユーザーモード#
2 種類のプログラム
- オペレーティングシステム:カーネルモード、ハードウェアを制御する命令セットと演算命令セットを呼び出す
- アプリケーション:ユーザーモード、演算関連の命令セットのみを呼び出す
したがって、2 つの状態が頻繁に切り替わる。
マルチスレッドとマルチコアチップ#
ムーアの法則。
シングルコアデュアルスレッド、つまり 1 つの CPU が 2 つの CPU の作業を行い、擬似的な並列処理、偽デュアルコア。
4 コア 8 スレッド:各 CPU は 2 スレッド。
- intel:すべてのコアが 1 つの L2 キャッシュを呼び出す
- AMD:各コアに個別の L2 キャッシュを割り当てる
メモリ io 関連#
- レジスタ L1:32 ビット 32x32、64 ビット 64x64
- 高速キャッシュ L2:CPU は最初に高速キャッシュを探し、高速キャッシュがヒットしなければメモリを探す
- メモリ
- ハードディスク
- 磁気テープ
速度の速さ - 遅さ
RAM#
ランダムアクセスメモリ
ROM#
読み取り専用メモリ、速度はメモリと同じ。したがって、一般的には工場出荷時の重要なプログラムの保存に使用される、例えば BIOS。
CMOS#
これも揮発性。速度は遅い。消費電力は非常に低い。マザーボードにはマザーボードバッテリーがあり、時計チップに電力を供給し、計算後に CMOS に保存する。
ハードディスク構造#
ハードディスク:
- 機械式ハードディスク、つまりディスク、機械的回転に依存。
- 磁道:1 周のデータ bit(二進数)-Byte(バイト)-kB、実際にはハードディスクメーカーは 1000 でカウントする
- セクター:512 バイト、つまりハードディスクが一度に読み書きする最小単位。オペレーティングシステムは 1 回の読み取りで 1 ブロック、つまり 8 つのセクター = 4096 バイトを読み取る
- シリンダー:同じ半径の磁道が重なり合って仮想シリンダーを形成
- パーティション:2 つのシリンダーの間の部分
- ソリッドステートドライブ
IO 遅延#
ハードディスクの読み書き速度は非常に速いが、遅いのはデータを探す時間である。
- 平均シーク時間
- 平均遅延時間:最低はハードディスクが半回転する時間
IO 遅延は上記 2 つの合計である。
プログラムの最適化の核心的な方法は、ハードディスクからの読み書きを減らし、できるだけメモリから行うことである。
仮想メモリ swap#
物理メモリが不足しているときにディスク上に領域を確保する。IO 遅延を引き起こす可能性がある。
IO デバイス#
含まれる
- デバイス制御:ドライバ
- デバイス自体
バス#
マザーボード上の各コンポーネントを接続して相互作用させる。
- PCI ブリッジ:ノースブリッジ、高速デバイスを接続
- ISA ブリッジ:サウスブリッジ、低速デバイスを接続
オペレーティングシステムの起動プロセス#
BIOS: Basic Input Output System、工場出荷時に ROM デバイスに書き込まれる。
起動プロセス:
- コンピュータに電源を入れる
- BIOS がハードウェアの正常性を監視する
- BIOS が CMOS メモリのパラメータを読み取り、起動デバイスを選択する
- 起動デバイスから最初のセクターの内容を読み取る(MBR マスターブートレコード 512 バイト、前 446 ビットはブート情報、後 64 ビットはパーティション情報、最後の 2 ビットはフラグビット)
- パーティション情報に基づいて BootLoader 起動ロードモジュールを読み込み、オペレーティングシステムを起動する
- オペレーティングシステムが BIOS に問い合わせて設定情報を取得し、ドライバをロードする。
Python 入門#
プログラミング言語の紹介#
- 機械語
- アセンブリ言語
- 高級言語
- コンパイラ型:c->gcc コンパイラ -> 機械語、実行効率が高い
- インタプリタ型:py-> バイトコード -> インタプリタ(一行ずつ)-> 機械、クロスプラットフォーム性が強い
python の紹介#
- インタプリタ型
- 構文スタイル:PEP8 規範
インタプリタ#
インタプリタは任意の言語で書くことができる、CPython、Jpython。
2.6-2008
2.7-2010 後にリリースされた移行版
3.0-2008
3.1-2009
3.2-2011
python プログラムを実行する 2 つの方法#
- インタラクティブ
- スクリプト
プログラム実行の 3 ステップ#
- インタプリタを起動する
- インタプリタが py をメモリに読み込む
- インタプリタが解釈して実行する
変数と基本データ型#
変数#
3 つの構成要素#
変数名 代入演算子 変数名
変数名#
小文字とアンダースコアを推奨
変数値の 3 つの特徴#
- id:変数値のメモリアドレス
id()
- type
type()
- value
可変型と不変型#
- 可変型:value を変更しても、メモリアドレス id は変わらない
- set
- list
- dict
- 不変型:value を変更すると、id も変わる
- number
- bool
- string
- tuple
is と ==#
- is は左右の変数のメモリアドレスが同じかどうかを比較する
- == は変数の値を比較する
小整数オブジェクトプール#
インタプリタが起動すると、メモリ内に一連のメモリ空間を事前に確保して、よく使われる整数(-5, 256)を保存する。
IDE の小整数プールはさらに大きい。
定数#
python の構文には定数の概念はない!
全て大文字は定数を表すが、これは単なる規範的な書き方で、実際には変数である。
基本データ型#
文字列#
単一、二重、三重引用符で定義可能、ネストする場合は単二が逆であるか、エスケープする必要がある。
print('-' * 10)
# -----------
リスト#
メモリには値のメモリアドレスが保存され、値は保存されない!
もし list2 = list1 であれば、両者は同じヒープを指し、値を変更すると両方が変更される。
浅いコピーと深いコピー:
- 浅いコピー:リストの第一層のメモリアドレスをコピーするが、可変型があれば、まだ一緒に連結される。
list2 = list1.copy()
- 深いコピー:完全に独立したコピーを作成し、不変型の id は変わらず、可変型の id は変更される。
import copy
list3 = copy.deepcopy(list1)
辞書#
a = {
"key":"value",
"1":1,
"2":"qwe"
}
ガベージコレクションメカニズム GC#
参照カウント#
ガベージ:変数値が変数名にバインドされていない
参照カウント:特定の値にバインドされている変数の数、python はカウントが 0 の値を削除する。
del x # 変数と値のバインディングを解除
直接参照、間接参照
マーク&クリア#
循環参照の問題があり、メモリリークを引き起こす可能性がある。
メモリスタック領域に変数名が保存され、ヒープ領域に値が保存される。
世代回収#
何度もスキャンされても回収されなかった変数は、常用変数と見なされ、そのスキャン頻度は低下する。
ユーザーインタラクション#
入力#
input() # strとして保存
# python2
raw_input() # strとして保存
input() # ユーザーに明確なデータ型を要求し、入力されたものがその型になる
フォーマット出力#
- % フォーマット出力
print("name: %(name)s, age:%(age)d" % {"name": "a", "age": 10})
# %sは任意の型を受け入れる
- str.format
print("name: {name}, age:{age}".format(name = "a", age = 10))
- f
print(f"name: {name}, age:{age}")
基本演算子#
算術演算子#
10 // 3 # 整数部分のみを保持、つまり整数除算
3 ** 10 # 指数
10 % 3 # 余りを取得
比較演算子#
1 != 2
1 < x < 3
代入演算子#
- 変数代入
a = 1
- 増分代入
a += 1
b *= 1
- チェーン代入
z = y = x = 10
- 交差代入
m, n = n, m
- アンパック代入
list = [1, 2, 3, 4]
a, b, c, d = list
x, y, *_ = list # 最初の2つを取得
*_ , x, y = list # 最後の2つを取得
# 辞書のアンパックはキーを取得する
論理演算子#
暗黙のブール:すべての値は、0、None、False、Null、空値を除いては True である。
優先順位 not>and>or
ショートサーキット演算:左から右に条件を読み取り、連続した and のいずれかが false であれば、右に読み進まず、その位置の値を返す。
メンバー演算子 in#
"a" in "abc"
1 in [1, 2, 3]
身分演算子 is#
フロー制御#
if#
if 16 < a < 20:
elif 条件は上から下へ、上の条件が満たされない場合に次の条件に進む。
while#
条件ループ
while+else#
ループが正常に終了し、break されなかった場合、else が実行される。
while True:
...
else:
...
for#
反復ループ
for variable in Iterable object:
...
for i in range(1, 100):
...
for+else#
range#
# py2
>>> range(0, 5)
[0, 1, 2, 3, 4]
#py3 最適化
>>> range(0,5)
range(0,5)
print#
print("hello", end="*") # 終了をカスタマイズ、デフォルトは改行
基本データ型と組み込みメソッド#
数字型#
int#
python3 には long 型はない。
int('10')
bin(11) # 0b1011 0bで始まるのは二進数
oct(11) # 0o13 8進数
hex(11) # 0xb 16進数
int(int('0b1011', 2)) # 二進数から10進数に変換
float#
float('11')
虚数#
x = 10 + 2j
x.real #10
x.imag #2
文字列#
# 不変であり、全体として扱われ、特定の文字を単独で変更することはできない。
str(10)
msg = "hello"
# スライス
msg[0] # h
msg[-1] # o
msg[0:5] # hello 頭を含み、尾を含まない
msg[0:5:2] # hlo
msg[5:0:-1] # olle
"alex" in "alexxxx" # true
"alex" not in "alexxxx" # false
msg = " eee "
res = msg.strip() # デフォルトで両端の空白を削除、文字列は不変なので新たに代入する必要がある。
msg = "***eee***"
res = msg.strip("*") # stripは両端のみを削除し、中間は削除しない。
res = msg.lstrip()
res = msg.rstrip()
# 分割:特定の文字で文字列を分割し、リストを返す。
res = msg.split(":", 1) # デフォルトでは空白で分割し、分割回数は左から数える。
res = msg.lsplit(":", 1)
res = msg.rsplit(":", 1) # 右から左に分割。
res2 = ":".join(res) # :を区切り文字として結合。
res = msg.lower() # 小文字に変換。
res = msg.upper()
res = msg.startswith("aaa") # True 何で始まるか。
res = msg.endswith("aaa")
res = msg.replace("you", "me", 1) # 文字列の置換、回数指定。
"123".isdigit() # 純粋な数字。
msg.find("e") # インデックスを返し、見つからない場合は-1を返す。
msg.index("e") # インデックスを返し、見つからない場合はエラーを発生させる。
msg.count("e") # サブ文字列の出現回数を数える。
"分割線".center(50, "*") # 両側を*で埋める。
"分割線".ljust(50, "*") # 右側を埋める。
"分割線".rjust(50, "*")
"分割線".zfill(50) # 左側を0で埋める。
# is 判定シリーズ ドキュメントを参照。
isalpha()
isdigit()
isdecimal() # アラビア数字のみを認識。py3ではデフォルトでunicode。
isnumeric() # 漢字とアラビア数字を認識可能。