それを複合代⼊演算⼦で実現する。「a += 1」 >>> a = 10 >>> a += 1 >>> a 11 >>> a -= 5 >>> a 6 複合代⼊演算⼦の例 同⼀の意味を持つ命令 a += 1 a = a + 1 a -= 5 a = a - 5 a *= 10 a = a * 10 a /= 3 a = a / 3
print('2') a = 1 + 2 print(b) 1 2 Traceback (most recent call last): File "/Users/yuichi/Desktop/python/test_02.py", line 4, in <module> print(b) NameError: name 'b' is not defined エラーメッセージから「どのファイル(test_02.py)」の 「どの⾏(line 4)」で 「どのような問題(NameError: name ʻbʼ is not defined)」が おきているかわかる /chapter2/test_02.py コンソール出⼒
a = ['taro', 'jiro', 'saburo', 10] >>> a[1] = 'hanako' >>> a[3] = 'adam' >>> print(a) ['taro', 'hanako', 'saburo', 'adam'] 存在しないインデックスの参照はエラーとなる >>> a = ['taro', 'jiro', 'saburo', 10] >>> a[4] Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: list index out of range >>> a[4] = 100 Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: list assignment index out of range リストの要素をインデックスで指定して代⼊すると その要素が代⼊値で上書きされる
a = ['taro', 'jiro', 'saburo', 10] >>> len(a) 4 >>> a[3] 10 >>> a[4] Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: list index out of range len関数の確認と要素へのアクセス len関数の取得値でアクセス 可能なインデックス値の最⼤値が わかる
関数化されていれば「⾒やすい」し「変更(修正)しやすい」 a = 5 if a < 0: a *= -1 # 何か関係ない処理 b = -3 if b < 0: b *= -1 print(a) # 5 print(b) # 3 a = 5 a = abs(a) # 何か関係ない処理 b = -3 b = abs(b) print(a) # 5 print(b) # 3 /chapter3/get_abs_01.py /chapter3/get_abs_02.py
x < 0: x *= -1 return x a = my_abs(3) print(a) print(my_abs(-5)) print(my_abs(-5)) def my_abs(x): if x < 0: x *= -1 return x $ python3 define_function_04.py Traceback (most recent call last): File "define_function_04.py", line 1, in <module> print(my_abs(-5)) NameError: name 'my_abs' is not defined $ python3 define_function_03.py 3 5 コンソール出⼒ コンソール出⼒ /chapter3/define_function_03.py /chapter3/define_function_04.py 呼び出し側で渡した引数3が 関数側の引数xに代⼊される。 引数の数は同じにすること returnの 返り値が 戻される
5 $ python3 define_variable.py Traceback (most recent call last): File "define_variable.py", line 1, in <module> print(a) NameError: name 'a' is not defined コンソール出⼒ /chapter3/define_variable.py
x > 0: return x print('less than 0') return x * -1 print(my_abs(5)) print(my_abs(-5)) $ python3 return_value_02.py 5 less than 0 5 コンソール出⼒ /chapter3/return_value_02.py
on built-in function print in module builtins: print(...) print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False) Prints the values to a stream, or to sys.stdout by default. Optional keyword arguments: file: a file-like object (stream); defaults to the current sys.stdout. sep: string inserted between values, default a space. end: string appended after the last value, default a newline. flush: whether to forcibly flush the stream. help関数を使ったprint関数の詳細確認
= x + 1 return y print(test(5)) print(y) $ python3 name_space_02.py 6 Traceback (most recent call last): File "name_space_02.py", line 6, in <module> print(y) NameError: name 'y' is not defined コンソール出⼒ /chapter3/name_space_02.py
a = 'Hello Python' b = a.upper() print('Original a : ' + a) print('Return val b : ' + b) a = 'Hello Python' c = a.replace('Hello', 'Hell') print('Original a : ' + a) print('Return val c : ' + c) $ python3 string_method_01.py Original a : Hello Python Return val b : HELLO PYTHON $ python3 string_method_02.py Original a : Hello Python Return val c : Hell Python コンソール出⼒ コンソール出⼒ /chapter4/string_method_01.py /chapter4/string_method_01.py
name = 'Tom' age = 25 text = 'Hi, this is {}. {} years old.'.format(name, age) print(text) $ python3 string_method_03.py Hi, this is Tom. 25 years old. コンソール出⼒ /chapter4/string_method_03.py
plus(self, a, b): return a + b def minus(self, a, b): return a - b myclass = MyClass() a = myclass.plus(5, 3) print(a) b = myclass.minus(5, 3) print(b) $ python3 myclass.py 8 2 /chapter5/myclass.py コンソール出⼒
モジュール名 import *(全て) from math import ceil from time import * print(ceil(5.4)) sleep(1) print(floor(5.3)) $ python3 from_import_01.py 6 Traceback (most recent call last): File "from_import_01.py", line 6, in <module> print(floor(5.3)) NameError: name 'floor' is not defined /chapter6/from_import_01.py コンソール出⼒ importで指定したクラスや関数のみ読み込み モジュールの全てのクラスや関数を読み込み 読み込んでいないmathのfloorを 呼び出そうとしたためエラー
forループ: ファイルの1⾏ずつループ処理する。省メモリ fin = open('hello.txt', 'r') text = fin.read() print(text) hello world hello python $ python3 open_02.py hello world hello python fin = open('hello.txt', 'r') i = 1 for line in fin: line = line.rstrip() print('{} {}'.format(i, line)) i += 1 $ python3 open_03.py 1 hello world 2 hello python コンソール出⼒ コンソール出⼒ /chapter7/hello.txt /chapter7/open_02.py 1⾏ずつ⾏番号とテキストを出⼒: /chapter7/open_03.py 巨⼤なファイルには 必ずforループを使う
'r') for line in fin: print(line) fin.close() print('finished') $ python3 exception_01.py Traceback (most recent call last): File "exception_01.py", line 1, in <module> fin = open('abc.txt', 'r') FileNotFoundError: [Errno 2] No such file or directory: 'abc.txt' /chapter7/exception_01.py コンソール出⼒
fin = open('test999.txt', 'r') fin.close() except Exception as e: print('エラーが発⽣') print(e) $ python3 exception_03.py エラーが発⽣ [Errno 2] No such file or directory: 'test999.txt' /chapter7/exception_03.py コンソール出⼒
コンテナネットワーク 172.32.0.0/16 Backend VM Front VM Reverse Proxy etc Backend Instance Front Instance CDN etc Backend Container Front Container Load Balance r etc IPAM + DHCP(管理コンソール) IPAM + DHCP(管理コンソール) YAMLでの定義 ネットワークアドレスに依存せずサービス 構成ノード間で会話できる必要がある。 IPではなく名前で相⼿を指定する。 フロントも直接外に出さないほうがよい Global IP DNS 公開⽤パブリックIPとサービスのドメイン名の結びつけ
172.31.2.0/24 172.31.3.0/24 VM VM VM VM VM 172.30.1.0/24 172.30.2.0/24 172.30.3.0/24 VM VM VM VM VM Firewall Appliance 1 Firewall Appliance 2 L3 Switch (Gateway) 172.16.0.0/16 Private Cloud (Nutanix) 172.16.1.0/24 172.16.2.0/24 172.16.3.0/24 VM VM VM VM VM VPN VPN 0.0.0.0/0 via L3 Switch 172.31.0.0/16 via L3 FW1 172.30.0.0/16 via L3 FW2 172.16.0.0/16 via L3 Switch 172.31.0.0/16 via AWS 172.16.0.0/16 via FW1 172.30.0.0/16 via Azure 172.16.0.0/16 via FW2 VLAN X VLAN Y ⽮印の通信経路の設定はスタティック ルートか⾃動学習(BGPとOSPFなど)で与える
San Switch Network Switch Network Switch 上流 ネットワーク ストレージ ストレージ VM VM VM VM VM VM VM VM VM VM VM VM VM VM ... 上流 ネットワーク 物理サーバー 物理サーバー Network Switch Network Switch プライベートクラウド VM VM VM VM VM VM マネージドDB その他機能 レガシーな「3Tier」と呼ばれる構成 構築と拡張が難しい 現在主流になりつつあるプライベートクラウド⽅式 全般的に3Tierよりも簡単(個⼈で作る⼈もいるぐらい) ... コン テナ コン テナ コン テナ コン テナ
VM VM VM VM VM VM VM VM VDIサービス (管理された⼤量のユーザーマシン) ⼤量の社内通信 (40G以上の⾼速なLAN) ⾃社設備(オフィス、データセンター) VM VM VM エンタープライズ アプリケーション (会社の重要システム) DB バック アップ プライベートクラウド基盤 ⼤量のユーザー(社員) 社内通信 秘匿データ VM VM VM VM インターネット Firewall セキュリティ管理 Firewall セキュリティ管理 VPN 社外の ユーザー (社員)
OS サーバー仮想化 ストレージ OS OS OS OS OS OS OS HW HW HW OS OS OS OS Managed Services SAN HW HW HW OS OS OS OS Managed Services ベアメタル 2000 ~ 2010 ~ 2015 ~ 2020 ~ サーバー仮想化 クラウド 2020 ~ パブリック プライベート ハイブリット OS OS OS OS HW HW HW OS OS OS ハイブリット 2020 ~ ハイブリット
HW HW HW HW クラウド OS OS OS Managed Network Managed Storage Managed Database マネージドサービス • マシン台数の削減 • 複雑な操作を削減 コンテナ サービス開発⼒ 維持管理 変更コスト OS OS OS OS Legacy Backup etc. Legacy Backup etc. VS レガシーな開発と運⽤⽅式 新しい開発と運⽤⽅式 ビジネススピード ペット vs 家畜 (図)