2019年4-5月ふりかえり(KPT)

今の会社に入社して以来機械エンジニアとして業務に勤しんできました。
一方で昨年秋頃から少しずつIoTやらデータ分析の話題が自分ゴトとなりました。
私はそちらの方向ではまったくの専門外で、
ゼロから学んで実務レベルになることが今の自分の大きな課題です。

そんな中4月から5月にかけて考えてきたこと・行動してきたことを振り返りたいと思います。

ふりかえり

基本情報技術者試験(FE)を受験

4月にFEを受験しました。
準備した内容では2月ぐらいから主に通勤時間2時間をつかって午前対策をやり、
本番2週間前ぐらいになって、午後の過去問を2,3年分やった感じです。
結果としては

  • 午前の部:80.00点(ストラテジ90% マネジメント90% テクノロジ74%)
  • 午後の部:66.00点

と午後はかなりぎりぎりの点数ですが、運良く合格です。

ただし、合格するのが目的ではなく、
自分の知識や能力を客観的に見たいと思って受験したので、
午前の分野別得点でみても午後の結果を見ても、
テクノロジ系が私の弱点だと明確に知ることができて良かったです。

特に試験本番中感じたのでは、プログラミング言語に対する読解力が低いなーということでした。何が書いてあるのかいまいち理解できないっていうもどかしさ。

なので
- もっと主体的にプログラミングで問題解決をする経験を積もう
- その中でアルゴリズムや言語の書き方を習得しよう
- 人が書いたコードを読む訓練をしよう

というのをその後の目標としました。

はてなブログはじめました

アウトプットの場が欲しいと思って、ブログをはじめました。
5月からこのブログはじめて、結局意欲的に更新できたのは数日。
あとは下書きばかりで書ききれなかった記事が溜まってます。
とはいえ、かなり基本的な内容で誰の役に立つかわからない記事でも、
いざ書こうとすると調べたり考えたりするもので、自己満記事も悪くないなと。

ふとしたときに書きたくなるのでやっぱり始めたことは良かったと思っていて、
いかに自分にアウトプットを続けさせるかの仕組みづくりが必要かなと考えています。

AtCoderはじめました

これもまたはじめましたシリーズなのですが、
プログラミング能力が低くてスキルアップしたいと思っていたので、
リアルタイムで参加するプログラミングのコンテストに参加しはじめました。
今回私が参加しはじめたのはAtCoderです。

atcoder.jp

初心者でも始められるようにと解説された良サイトも多く、
私にとっては参加障害が低く、やってみようと思えました。

はじめて参加したのが、5/19のABC126で、
(トラブルでレートがつかない回とはいえ)大撃沈しました。
続くABC127でも、A〜Bは解けるもCで計算時間が長すぎて撃沈。
歯が立たなくて悔しいなーと思った反面、
時間内で自分で書いたコードが通ったとき、嬉しくて興奮しました。

リアルタイムだからこその緊張感と高揚感があるなー、と。

スキル上げて、もっと問題解けるようになりたいなと思えました。 この辺のことは忘備録としても記事にしたいな。

コードを書くスキルアップのためにと始めたAtCoderですが、
基礎レベルのコード書きの定着と、他の人がかいたコードで勉強できるという面で、
いまのところ効果は大きいなと感じています。

Keep

  • AtCoderのABCは(家族が許す限り)継続してまずは「茶色」目指す
  • ブログ連載でかがげた会話bot作成

Problem

  • 業務が佳境のため帰りが22時過ぎデフォ...自分の時間がほぼない...
  • それなのにやりたいことは無限に増えて行く...
  • 帰りが遅いことから最近体重が+5kg...いよいよやばい

Try

  • 行動指針をたててやること絞る。優先順位をつける。

  • AtCoderで過去問の星取表をつくって学習すすめる

AtCoder Problems
ここで自分がどのくらい解き進めたかの学習具合が見える。

AtCoder青になるまでの軌跡 - 30歳で競プロに目覚めた霊長類のブログ
このくらい徹底的に継続できることに本当に尊敬する。

  • スクワットしよう

nanana、リストの内包表記を学ぶ(Python学習記録-5日目-)

■まえおき

下記の記事でPython学び直してやるぞーと宣言しました。 nanana-dot.hatenablog.com

今回は前回のリストのときに触れられなかった「リストの内包表記」を学びたいと思います。

■今日の学び

  • リストの内包表記の書式
  • 内包表記の利点

■内包表記ってなんだ

新しいリストをつくるときに、
繰り返し処理をして、それらの値を要素とするリストを作りたい場合があります。
たとえば、いくつかの値が入っているリストに対してそれらの3乗した値をリストにしようとしたとき、
通常の書き方では以下のようになると思います。

#元々のリスト
l = [2,3,5,7,11]
cube = []
#forで繰り返し処理
for x in l:
    cube.append(x**3)
cube
#出力
[8, 27, 125, 343, 1331]

しかし、Pythonでは次のような、リストの内包表記と呼ばれる書式があります。

[処理 for 変数 in イテレート可能なオブジェクト]

これをつかって、さきほどの3乗のリストをつくるコードは

#元々のリスト
l = [2,3,5,7,11]
#リストの内包表記
cube = [x**3 for x in l]

とたった1行で書くことができます。 なんかちょっとpythonっぽくていいですね。

リストの内包表記にはforだけではなく、ifも使えます。
ある値の約数を返すようなコードを書いてみます。 約数は、自分と1を含め割り切れる値ですので、次のように書けるでしょう。

#21の約数をリストにするコード
val =21
[x for x in range(1,val) if val % x == 0]

#出力
[1,3,7]

となります。

内包表記は記述が簡潔になり、可読性があがるという利点以外にも、 コードのサイズのコンパクト化や処理速度の向上といった利点もあるようです。

forやifが重なり見辛いと思ったら、内包表記にしてみるにも今日からできるようになりました。

さて、次回は「辞書型」についてまとめます。


本日の学習時間:1時間
累計の学習時間:9時間


nanana、リスト型・タプル型を学ぶ(Python学習記録-4日目-)

■まえおき

下記の記事でPython学び直してやるぞーと宣言しました。 nanana-dot.hatenablog.com

今回はデータ型の中でも、「リスト型」や「タプル型」といった種類の型について理解を深めたいと思います。

■今日の学び

  • 「リスト」と「タプル」のような複数要素をインデックスで指定できるものシーケンス型という
  • リスト型に使える組み込みメソッド・組み込み関数を使いこなす

■リスト型・タプル型の特徴

前の記事でPythonが扱う代表的なデータ型に関してまとめました。

nanana-dot.hatenablog.com

そのなかにリスト型とタプル型というのがあります。
今回はこれらのデータ型に関して整理して、Pythonがもつ操作の魅力をみていくこととしましょう。

リスト型やタプル型は複数のデータをひとつのまとまりとして扱うの利用できます。
たとえば、リスト型やタプル型というのは次のような形をしています。

#リスト型は[ ]で定義する  
numList = [1,2,3,4,5]
strList = ['a', 'b' ,'c', 'd', 'e']  

#タプル型は( )で定義する  
numtuple = (1,2,3,4,5)
strtuple = ('a', 'b' ,'c', 'd', 'e')

リスト型やタプル型のように複数の要素をもっていて、
それぞれの要素が順番に番号付したインデックスで指摘できるようなデータ型を、
Pythonではシーケンス型と分類します。
文字列も各文字がそれぞれ文字列を作る要素となり、インデックスで指定できますので、 文字列型もシーケンス型のひとつです。

まずはシーケンス型の扱いの基本として、
各要素を表すインデックスをつかって、要素の指定をしてみましょう。

s = '1,2,3,4,5'
s[0]  #sの第1要素を出力  
s[-1] #sの最後尾要素を出力  
s[4:] #s[インデックス:]でインデックスから末尾まで  
s[:3] #s[:インデックス]で先頭からインデックス-1まで  
s[2:4:]#s[インデック:インデックス]で指定した範囲の要素  
s[1:6:2]#s[インデック:インデックス:ステップ]で指定した要素数ごと  

というよう書くと、
このコードの出力は次のようになります。

'1'  
'5'  
'3,4,5'  
'1,2'  
'2,3'  
'234'

''s[インデックス:]'' のようにシーケンス型の特定の要素を取り出す操作を
スライスとかスラッシングと言います。
上の例では文字列でやりましたが、リスト型やタプル型でも同様のことができます。

リスト型とタプル型の違い「ミュータブル」

リスト型とタプル型は値をまとめて扱うという点では一見似ているかもしれません。
しかし、両者には決定的な違いがあります。
それはリスト型は「一度入れた値でも何度でも値を更新することができる」一方で、
タプル型は「一度入れた値は書き換えることができない」という特徴があります。
リスト型のような、一度セットした中身を書き換えられることを「ミュータブル(mutable)」と言います。

下記のようなお寿司のネタをリスト型で書くとします。

sushiNeta = ['マグロ', 'カツオ', 'タイ', 'タコ', 'サーモン', 'エビ']

ここでに、「エビ」ではなく「ボタンエビ」に変更したいと思った時は、

sushiNeta[5] =  'ボタンエビ'
print(sushiNeta)

とすればたしかにエビがボタンエビになったリストに変更することができる。

#出力
['マグロ', 'カツオ', 'タイ', 'タコ', 'サーモン', 'ボタンエビ']

一方で同じようにネタをタプル型で書いてみて、同様のことを使用しようとすると、

sushiNeta = ('マグロ', 'カツオ', 'タイ', 'タコ', 'サーモン', 'エビ')
newsushiNeta = sushiNeta + ('イカ')
print(newsushiNeta)

と書いて実行すると、

#出力
['マグロ', 'カツオ', 'タイ', 'タコ', 'サーモン', 'ボタンエビ']

とエラーが出てしまい、タプルの中の値を書き換えることができません。 でも要素の一部を書き換えることができないというのはタプルだけではなく、
文字列も同じですよね。

リスト型がけっこう自由な感じで、タプル型はわりとかちっと硬いイメージを持ちました。

リスト型のメソッド

リスト型の処理で、forとの組み合わせで繰り返し処理するような場面で使われることがあります。 前回の記事でfor文の書き方の一例をとりあげました。

nanana-dot.hatenablog.com

しかし、rangeをつかうだけじゃなく、つぎのようにリスト型を利用することもできます。

for sushiOrder in   ['マグロ', 'カツオ', 'タイ']
print(sushiOrder)

このようなに処理を繰り返すたびに、
「sushiOrder」にはリスト型の要素が1つずつ順番に格納されていきます。
最終的にはリスト型のすべての要素に対して処理をすることができるというわけです。

最後にリストの操作のためにつかえる関数やメソッドをいくつか見てみようと思います。
リストに要素をくわえたいときはappendメソッドを使います。

sushi =  ['マグロ', 'カツオ', 'タイ']  
gunkan = ['ねぎとろ', 'かにみそ', 'いくら']
sushi.append(gunkan)
print(sushi)

とすると、出力は

 ['マグロ', 'カツオ', 'タイ', 'ねぎとろ', 'かにみそ', 'いくら'] 

となります。

他にもリストの中に特定の値がいくつ含まれているかはcountメソッドで知ることができて便利です。 たとえば、お寿司の注文履歴が書かれたリストがあったとき、
「マグロ」が何回注文されたか知りたければ、

sushiOrder = ['マグロ', 'サーモン', 'イカ', 'マグロ', 'ホタテ', 'マグロ']
sushiOrder.count('マグロ')
  #出力
3

となります。

次回はこの記事で触れられなかった「リストの内包表記」を触れたいと思います。


本日の学習時間:2時間
累計の学習時間:8時間


nanana、条件分岐処理を学ぶ(Python学習記録-3日目-)

■まえおき

下記の記事でPython学び直してやるぞーと宣言しました。 nanana-dot.hatenablog.com

前回に引き続いて、「繰り返し処理」と「条件分岐処理」の、
ふたつの処理に関して整理しながら遊んでみたいと思います。

■今日の学び

  • 条件分岐を処理する「if...else」と複数条件処理の「if...elif」

■お寿司注文ロボット2号

前回の記事では、 ひたすらfor文とwhile文を使って、ひたすらサーモンを注文するブログラムを作りました。

しかし、サーモン以外も食べたいので、 今回はサーモンではないネタも注文するお寿司注文ロボット2号をつくりました。 これがこちらです。

#サンプルコード
#100回注文するなかで、注文数に応じて、注文数が15の倍数で「大トロ」、5の倍数で「タコ」、3の倍数で「生エビ」が注文できて、それ以外は「サーモン」を頼む
for cntOrder in range (1,101):
    print(cntOrder)
    if cntOrder % 15 ==0:
        print('大トロください!')
    elif cntOrder % 5 ==0:
        print('タコください')
    elif cntOrder % 3 ==0:
        print('生エビください')
    else:
        print('サーモンください')
#出力
1
サーモンください
2
サーモンください
3
生エビください
4
サーモンください
5
タコください
6
生エビください
7
サーモンください
8
サーモンください
9
生エビください
10
タコください
11
サーモンください
12
生エビください
13
サーモンください
14
サーモンください
15
大トロください!
16
サーモンください
17
サーモンください
18
生エビください
19
サーモンください
20
タコください 
...
(以下、省略)

(かの有名なFizzBuzz問題もこんな感じで解けますね)

基本的な文法

条件をつけることで、単調な処理から複雑な処理ができるようするのが「条件分岐処理」です。
まずは、条件を1つだけ付ける場合の構文は以下のようになります。

if 条件:
    条件がTrueのときに実行される処理 a
else:
    条件がFalseのときに実行される処理 b

例としては、

num = int(input(''))
if num % 7 == 0:
    print('7の倍数です')
else:
    print('7の倍数ではありません')

出力は

20190504
7の倍数ではありません

となります。 一方で複数の条件分岐したい場合もあるかと思います。
そんなときは下記のように書くと、複数の条件分岐ができます。

if 条件A:
    条件AがTrueのときに実行される処理a
elif 条件B:
    条件AがFalseかつ条件BがTrueのときに実行される処理 b
else:
    上記条件がFalseのときに実行される処理 c

これをつかった例として、こんな感じにかけます。

num = int(input(''))
if num % 7 == 0:
    print('7の倍数です')
elif num % 3 ==0:
    print('3の倍数です')
else:
    print('3の倍数でも7の倍数ではありません')

出力は

20190504
3の倍数です

となります。

ところで条件の部分でさりげなくでてきた「==」ですが、
「x == y」でxとyが等しい時にTrueを返す、「比較演算子」のひとつです。
比較演算子は他にも

  • x != y →xがyに等しくない時にTrueを返す。
  • x in y →xという要素がyにあるときにTrueを返す。シーケンス(文字列、リストなど)の比較に使う。
  • x <(>) y → xとyの大小比較で、不等号がなりたつときにTrueを返す。
  • x >(<)= y → xとyが等しい時も含めて、不等号がなりたつときにTrueを返す。不等号は等号の左側に書く。

といった種類があります。

今日はここまでです。 明日は「リストとタプル」についてです。


本日の学習時間:2時間
累計の学習時間:6時間


nanana、繰り返し処理を学ぶ(Python学習記録-2日目-)

■まえおき

下記の記事でPython学び直してやるぞーと宣言しました。 nanana-dot.hatenablog.com

今回と次回に分けて、「繰り返し処理」と「条件分岐処理」の、
ふたつの処理に関して整理しながら遊んでみたいと思います。

■今日の学び

  • 決まった回数の繰り返しを処理する「for」
  • 条件が満たされるまで繰り返しを処理する「while」

■お寿司注文ロボット1号

いきなりですが、私はお寿司が大好きです。
お寿司が好きすぎて、毎日お寿司ウェルカムです。それぐらい好き。
だけどあるとき、声が出なくなって注文ができなくなってしまったので、
ロボットをつくって代わりにお寿司を注文してもらうことにしました。
というなんとも電波な設定で話を進めて行きます。

お寿司のネタを注文するプログラムを、
「繰り返し」を使って書いてみたいと思います。

これがこちらです。

#サンプルコード
#好きな数だけサーモンが注文できる
numSamon = input('お客さん、好きな数だけ食ってくだせぇ!>')
chumon = 0
while chumon<int(numSamon):
    print('サーモンください')
    chumon += 1  
40  
サーモンください  
サーモンください  
サーモンください  
...
(以下、省略)

そもそもなぜ「繰り返し」と「条件分岐」なのか

そもそもプログラミングで実現したいことってなんでしょうか。 コンピューターは魔法の道具ではありません。
身の回りの問題には原理的には人の手で処理できるけど、
時間的制限や様々な理由から実現性がない問題が山ほどあります。
それらの問題を解決するためにコンピューターの力を借りて「処理」してもらうことが、
プログラミングで実現することじゃないかなと私は思います。

コンピューターにお願いしてやってほしいことを順番にプログラムする方法を、 「順次処理」といいます。
しかし、ちょっと複雑にしただけで、順次処理だけでは手間だったり、 そもそもできない処理もあるでしょう。
そこで登場するのが「繰り返し処理(ループ処理)」「条件分岐処理」です。
どのようにしてプログラミングで処理していくかを考えることを「フロー制御」といい、
Pythonだけじゃなくてどのプログラム言語を学ぶにしても基本中の基本の構造だと言えるでしょう。 「フロー」というのは「流れ」のことですので、
コンピューターがどの手順で処理して行くのかという流れを私たちが示してあげる必要があるわけです。

基本的な文法

まずは「繰り返し処理」です。
Pythonでは繰り返し処理をする構文として2パターンあります。
繰り返す回数Nが事前に決まっている場合と、繰り返す回数Nが不定に場合です。

繰り返す回数Nが事前に決まっている場合は「for」が有効です。
基本的な「for文」の書き方としては次のようになります。

for カウンター変数 in range(繰り返す回数N): #「:」を忘れずに
    繰り返す処理 #この部分を「ループブロック」といったりする

例としては、

for chumon in range(10):
    print('サーモンください')

出力は

サーモンください  
サーモンください  
サーモンください  
サーモンください  
サーモンください  
...
(以下、省略)  

と10貫分のサーモンの注文することができます。

一方で、繰り返す回数が決まってない繰り返し処理もあり、
特定の条件を満たすまで繰り返しを続ける処理を「待ちループ処理」とよんだりします。
この場合さきほどのfor文ではなく、「while」が有効です。
基本的な「whike文」の書き方としては次のようになります。

while 条件式: 
    繰り返す処理

例としては、

chumon = 0
while chumon<11:
    print('サーモンください')
    chumon += 1  

出力は

サーモンください  
サーモンください  
サーモンください  
サーモンください  
サーモンください  
...
(以下、省略)  

とまたもや10貫分のサーモンの注文することができます。
for文は決まった回数がプログラムされていたら常にその回数しか繰り返されませんが、
while文なら注文したいサーモンの数をその日の気分で変えることができます。
それでできたのが上記のコードです。

明日は「条件分岐」についてです。


本日の学習時間:2時間
累計の学習時間:4時間


nanana、データ型を学ぶ(Python学習記録-1日目-)

■まえおき

下記の記事でPython学び直してやるぞーと宣言しました。 nanana-dot.hatenablog.com

インプットしても、自分の言葉でアウトプットしなければ、
いつになっても自分で使いこなすことはできないだろうと思い、始めた試みです。

■今日の学び

  • オブジェクトの基本要素「リテラル」とリテラルを分類するデータ型(組み込み型).
  • データ型があるところに「メソッド」あり
  • 特定のオブジェクトにつける名札としての「変数」.

■データ型とメソッド

Pythonでプログラミングをはじめるに、あたりそもそもソースコードってどんな要素から構成されているんだろうという話からはじめます。

ここではソースコードは、

から成り立っているとします。
この中でも特に重要なのが、「リテラル」です。 リテラルは簡単に言ってしまえば、ソースコードに書かれる生の値です。 数値なら「2」や「3.5」がリテラルですし、文字なら「Hello」もリテラルです。 それぞれの値ごとにリテラルには種類があり、最終的にはリテラルを扱う「データ型(組み込み型)」という考え方に行き着きます。 すべてにリテラルには、対応する「データ型」が存在するということがミソかな。 ソースコードで扱う要素はすべて素性が分かっているから、ソースコードとして機能するのです。

たくさんあるリテラルを分類し、データ型にまとめたという気持ちがわかるともうそこはオブジェクト指向の入り口なのかなと。

下に代表的なデータ型と対応するリテラルをまとめてみました。

データ型 扱うリテラル リテラルの例
数値型(int型) 整数リテラル 3,200,0x10
数値型(float型) 浮動点小数リテラル 2.71828
数値型(complex型) 複素数リテラル 2+3j
文字列型(str型) 文字列リテラル 'abc' , 'こんにちは'
ブール型(bool型) 真偽リテラル True, False のみ
バイト型(bytes型) バイトリテラル b'abc'
リスト型(list型) リストリテラル [1,2,3], ['a', 'b', 'c']
タプル型(tuple型) タプルリテラル (1,2,3), ('a', 'b', 'c')
集合型(set型) 集合リテラル {1,2,3}
辞書型(dict型) 辞書リテラル {'spam':'スパム', 'ham':'ハム'}

そしてこれらデータ型というのは、
ソースコード中でもよく登場し、データを操作が多く行われます。
そのため、これらデータ型を操作するための「メソッド」と呼ばれる、
操作があらかじめPythonの中には用意されています。
このメソッドがPythonを「シンプル」で「簡単」たる言語にしている理由かと思います。

メソッドはたくさんあるのですが、詳しくはここをみてみると、こんなに用意されているのかとなります。
個人的には、文字操作多いなと感じました。 組み込み関数 — Python 3.7.3 ドキュメント

■変数は「名札タグ」と考える

いままで変数ってなにかの入れ物だと思っていました。 ただ今回学習して、変数は「名札タグ」のようなものだと考えを改めました。

リテラルはコンピューター上のメモリに一時的に記録されます。 こうして操作する対象になったデータを「オブジェクト」と呼び、 オブジェクトが存在するメモリアドレスを調べる関数 id() で調べられます。 下のような簡単な実験で、
あくまでもオブジェクトの存在があって、それを変数で「参照」しているだけなのだとわかります。

#リテラルをメモリに一時保存.変数xで「参照」.
>>>x = 100
>>> id(x)                 
>>> 4454805664 
#上でつくったリテラル「100」を変数yでも「参照」
>>> y = x  
>>> id(y)
#xと同じメモリアドレスとなる
>>> 4454805664  

#一方で別のリテラルをつくってyで参照
>>> y = 200  
>>> id(y)
#リテラルが異なるのでメモリアドレスも異なる
>>> 4454806304  

こうすると少しだけオブジェクトってやつが分かった気になるもんです。

明日は「プログラムの制御」に関してです。


本日の学習時間:2時間
累計の学習時間:2時間


Pythonを基本中の基本から復習する(抱負宣言)

■突然連載がしてみたくなった

ルーティンワークって大切だなって思うんですよ。
改元した今、改めて2019年1月から自分の活動をみたときに、
「圧倒的に学んだことに対するアウトプットないな...」と反省しました。

去年の秋ぐらいから本業をやる傍らで独学でプログラミングを学んでいますが、
まだへっぽこのままから抜け出せてないのが現状です。

よっしゃ、冒険に出よう!と思ったのに、
最初の街からでてずっとスライムばかり囲まれていたのではあまり面白くありません。

ただし勉学の世界ではメタルスライムは出てきません。
やっぱりコツコツ基礎を身につけた人だけが楽しめる世界があるもんです。

そこで自分のスキル定着と学習記録も兼ねて、
Pythonの初歩からはじめて、最後は会話ボット作成までを連載することにしました。

大きな流れとしては下記に沿って進めていこうと思います。

Pythonプログラミングパーフェクトマスター (Perfect Master)

Pythonプログラミングパーフェクトマスター (Perfect Master)

キャッチーな言葉が表紙にあってワクワクしながら買った当時の私がいます。
上記本、私に取っては少し構成がごちゃっとした印象があって読みやすくはなかったのですが、
後半の会話ボット作ろうの部分が面白いと思っているのでそこを参考にさせていただくつもりです。

Pythonの本当の初歩の初歩、って部分に関しては、あれやこれを参考にしつつ、
自分の言葉で整理していけたら良いなと考えています。

下記の公式ドキュメントも、公式を参照するクセづけの一環としても、理解の助けとしても活用します。
docs.python.org

辞書的な参考書としては

みんなのPython 第4版

みんなのPython 第4版

もお世話になります。他にも私の手元にはないですが、本屋でチラ見した感じ、

Python 1年生 体験してわかる!会話でまなべる!プログラミングのしくみ

Python 1年生 体験してわかる!会話でまなべる!プログラミングのしくみ

いちばんやさしいPythonの教本 人気講師が教える基礎からサーバサイド開発まで (「いちばんやさしい教本」シリーズ)

いちばんやさしいPythonの教本 人気講師が教える基礎からサーバサイド開発まで (「いちばんやさしい教本」シリーズ)

も初心者向きでまずは1冊最後まで読み切るのに向いていそうです。 もし万が一、私のようなお仲間がいたらぜひ参考にしてみてください。

■全体像

下記のように、いくつかテーマにわけて整理しながら記事作成していきます。
まずは基本から、

  • 変数と組み込みのデータ型
  • プログラムの制御(条件分岐、繰り返し)
  • データ構造詳細(リスト、タプル、集合、辞書)
  • 関数
  • クラスとクラスの継承

あたりをまとめて、後半は「会話ボットの作成」を目標に、

といったことをやろうかなと企んでます。
会話ボットとの会話の自由度をあげるために、
辞書を改良していくというのが後半の大きな流れになるかな。

■目標とか進捗管理とか

【最低毎週1記事】

どんなしょぼい内容でもとにかく書ききってみることが目標です。

無理せず。 自分の弱点です、続けることができない!
なので3日でも続いたら本当に自分を褒めてあげたいです笑