[Udemy]「Python 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイルを学び、実践的なアプリ開発の準備をする」で学んだこと

#はじめに
2019/2/25に￥1,400で購入した[Udemy](https://www.udemy.com/)の以下の講座で学んだことを記録する。
[Python 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイルを学び、実践的なアプリ開発の準備をする](https://www.udemy.com/python-beginner/)

**記録の目的は以下の通り**

1. メモを取ることで学習のモチベーションを上げる
2. 学んだこと（忘れたこと）を思い出せるようにする
3. Qiitaを使って見る
4. Markdown表記になれる

**記録すること**

* 受講した講座のタイトル
* ハンズオンで行った事
* 学んだこと
* 感想


さしあたり時系列で記録をとるが、後から見やすいように編集をするかも知れない。
まずは最後までやり遂げることを目指す。

#2019/2/25
###受講した講座のタイトル
・ここから開始しましょう。
01. はじめに
02. アメリカ本社のUdemyオフィスに遊びに行ってきました
03. 講義の話すスピードを変更したい場合
・Python環境の設定
06. WindowsにPythonをインストールする
07. WindowsにPycharmをインストールをする
・Pythonの基本
08. 変数宣言
09. まずはprintで出力
10. 数値
11. 文字列
12. 文字列のインデックスとスライス
13. 文字のメソッド
14. 文字の代入
15. f-strings
###ハンズオンで行った事
指示通り、Anaconda、Pycharmをインストールして環境を整えた。
コマンドを実際に打ち込んで結果を確認した。

###学んだこと
```python
#変数の宣言は不要

#type関数：型の確認
print(num,type(num))

#セパレート記号の指定
print('Hi','Mike',sep=',')
#\（バックスラッシュ）で'をエスケープ
print('I dont\'t know')
#\nで改行ただしrを付けると改行しない
print(r'C:\name\name')
#"""で囲むと自動改行。行末の\は結果の表示では改行されない
print("#####")
print("""\
line1
line2
line3\
""")
print("#####")

#pythonをpをjに置き換える
word = 'python'
word = 'j' + word[1:]

#m文字のメソッドいろいろ
s = 'My name is Mike, Hi Mike'
print(s.find('Mike'))
print(s.count('Mike'))
print(s.replace('Mike','Nancy'))

##tarminalにて
#代入
'My name is {0} {1}'.format('jun','sakai')
'My name is {name} {family}'.format(name='jun',family='sakai')

#f-stringsを使った新しい記述
x, y, z = 1, 2, 3
print(f'a is {x},{y},{z}')
a is 1,2,3

```

###感想
「はじめに」で、講師の酒井 潤さんのことや、Udemy社のこと、シリコンバレーの雰囲気などを知ることが出来き、モチベーションが上がった。こういうのは好き。かしこまった感じはなく、これなら続けらそうな予感がする。[Hour of Code](https://hourofcode.com/jp/learn)には、学習を始める前に見る、エールを贈ってくれる為のショートムービーが沢山準備されているのだけれど、そんな感じ。

講義のペースは結構早く感じるが、解説がとても丁寧でわかりやすい。1.25倍での再生速度のせいか、キー入力が追いつかずたまに一時停止する。

Pycharmは便利そうだけど使い続けるには高いので、VSCodeを使って見たかった。そのうち可能なら切り替えようと思う。Pycharmの無償期間で受講を終える自身がない...

#2019/2/27
###受講した講座のタイトル
・データー構造
16. リスト型
17. リストの操作
18. リストのメソッド
19. リストのコピー
20. リストの使い所
21. タプル型
22. タプルのアンパッキング
23. タプルの使い所
24. 辞書型
25. 辞書型のメソッド
26. 辞書のコピー
27. 辞書の使い所
28. 集合型
29. 集合のメソッド
30. 集合の使い所
・制御フローとコード構造
31. コメント
32. １行が長くなる時
###ハンズオンで行った事
6割くらいは実際にコードを入力して結果を確認した

###学んだこと
```python
#リスト、ネスト可能、書き換えも可能
s = ['a','b','c','d','e','f','g']
s[0] = 'x'
print(s[0])
x
#ブランクを代入すると削除される
s[2:5] = []
print(s)
['x', 'b', 'f', 'g']

#リストのメソッド
n = [1, 2, 3, 4, 5, 6, 7, 8]
n.append(100)
n.insert(1,50)
print(n)
[1, 50, 2, 3, 4, 5, 6, 7, 8, 100]
n.pop()
n.pop(1)
print(n)
[1, 2, 3, 4, 5, 6, 7, 8]

r = [1,2,3,4,5,1,2,3]
print(r.index(3))
2
print(r.count(3))
2

#sort,revers
r.sort()
[1, 1, 2, 2, 3, 3, 4, 5]
print(r)
r.sort(reverse=True)
print(r)
[5, 4, 3, 3, 2, 2, 1, 1]
#split,join
s = 'My name is Mike'
to_split = s.split(' ')
print(to_split)
['My', 'name', 'is', 'Mike']
x = ' '.join(to_split)
print(x)
My name is Mike
#リストのコピーの注意普通にコピーすると参照渡しになる。
#リストbをaにコピーするときに以下の通りcopyメソッドを使うと値渡しになる。
a = b.copy

#リストは[]とタプルは（）
#タプルは値の変更や追加ができない。
#タプルの案パッキング、同じ要領でかっこを省略したmin,maxの例のような代入が行える
t = (1, 2, 3)
x, y, z = t
print(x, y, z)
1 2 3
min,max = 0, 100
#以下の記述で1行で値の入れ替えが可能
min,max =max,min

#辞書型は｛｝key:valueの形式で値をもつ
#メソッドにはほかに,get,pop,del,clearなどもある
d = {'x' : 10,'y':20}
print(d)
print(d.keys())
print(d.values())
{'x': 10, 'y': 20}
dict_keys(['x', 'y'])
dict_values([10, 20])

d2 = {'x': 1000, 'j': 500}
d.update(d2)
print(d)
{'x': 1000, 'y': 20, 'j': 500}

#集合型というものもあり、keyは無い、重複した値は一つ。
#-,&,|などの集合の掲載ができる
#リスト型から集合型に型変換すると重複が排除されグループ化された値が取得できる
a= {1,2,3,3,4,4,4,5,6}
print(a)
{1, 2, 3, 4, 5, 6}

#1行のコメント
"""
複数行のコメント
複数行のコメントコメント
"""

#1行が長くなる時は\でつなく。1行は80文字が作法。（）で囲ってもOK
s = 'aaaaaaaaaaaaa'\
    +'bbbbbbbbbbbb'
print(s)
aaaaaaaaaaaaabbbbbbbbbbbb
s = ('aaaaaaaaaaaaa'
     'bbbbbbbbbbbb')


```
###感想
目まぐるしい。ここまで演習や復習なし。説明はとてもわかりやすい。こまごまとしたポイントや注意事項もとても役に立つ。ただ、詰め込みすぎでつらい。せっかく覚えたのに記憶に残っているのか心配。

#2019/3/4
###受講した講座のタイトル
・制御フローとコード構造
33. if文
34. デバッガーを使って確認してみる
35. 論理演算子
36. InとNotの使い所
37. 値が入っていない判定をするテクニック
38. Noneを判定する場合
39. while文とcontinue文とbreak文
40. while else文
###ハンズオンで行った事
デバックの仕方
・デバックポイント（赤い丸）を指定する
・画面右上の虫マークを実行
・step in　または　step overでstep実行

コメントアウト（ Ctrl + / ）

###学んだこと
```python
#if文　インデントで構造を表現する
x = 0
if x < 0:
     print('negative')
elif x == 0:
     print('0')
else:
     print('positive')

#論理演算子
#aがbが等しい：a == b
#aとbが異なる：a != b

#inとnotについて数値ではnotの利用は推奨しない
if not a == b:
#ではなく
if a != b:

if not a > b:
#ではなく
if a < b:

#ブーリアン型の場合はnotが便利
is_ok = True

if is_ok:
#これでいい
if is_ok == True:
#とはしなくていい
#なので
if is_ok != True:
#ではなく
if not is_ok:
#のほうがスマート

#inの使い方
y = [1,2,3]
x = 1

if x in y:
     print('in')
in

#なにがTrueでなにがFalseか？
is_ok = True

if is_ok:
     print('OK!')
else:
     print('No!')

#Trueになるもの
#　1を含む何らかの値、文字でも、数値でも。ただし0は除く
#Falseになる場合
#　0か、値が空っぽ、null

#isの使い方
print(1 == True)
print(1 is True)
True
False

#isはnoneかどうかの比較の時に使うことが多い
if is_empty is none:

#while文
count = 0
while count < 5:
     print(count)
     count += 1 #count = count + 1こうは書かない

#while文の続き（breakとcontinueとelse）
#breakはwhileループを抜ける
#continueは次のループにスキップする
#elseはbreakで抜けなかったら最後に実行される
count = 0
while True:
     if count >= 5:
          break
     
     if count ==2:
          count += 1
         continue
     
     print(count)
     count += 1
else:
     print('done')
```

###感想
さっそく数日空いてしまった。少しずつでも毎日進めないと、覚えたことを忘れてしまうので反省。相変わらず説明が分かりやすい。

#2019/3/4
###受講した講座のタイトル
・制御フローとコード構造
41. input関数
42. for文とbreak文とcontinue文
43. for else文
44. range関数
45. enumerate関数
46. zip関数

###ハンズオンで行った事
すべて動きを確認した。

###学んだこと
```python
#input Whileと一緒によく使う
while True:
     word = input('Enter:')
     if num == ok:
          break
     print('next')

#以下のwhile文とfor文は同じ結果になる。
#イテレーター（反復子）の利用にforは便利
some_list = [1,2,3,4,5]
# i = 0
# while i < len(some_list):
#      print(some_list[i])
#      i += 1
for i in some_list:
     print(i)

#for文でもbreakもcontinueも利用できる
for s in 'abcde':
     if s == 'b':
          continue
     if s == 'c':
          break
     print(s)
#for elseは、while elseと同じで、breakで止まらず最後まで行ったら、elseを実行
for fruit in ['apple','banana','orange']:
     if fruit =='banana':
          print('stop eating')
          break
     print(fruit)
else:
     print('I ate all!')

#range関数は以下のように簡単に10回の繰り返しを記述できる
for i in range(10):
     print(i,'hello')
#変数ｉをループの中で使う必要がないければ_を利用すると、コードがスマートになる。
for _ in range(10):
     print('hello')
#enamurate関数（エナミュレイト）で簡単に発番できる
for i,fruit in enumerate (['apple','banana','orange']):
     print(i,fruit)
0 apple
1 banana
2 orange

#zip関数でまとめて表示。コードが見やすい。以下の出力結果は同じ
days = ['Mon','Tue','Wed']
fruits = ['apple','banana','orange']
drinks = ['coffee','tea','beer']

# for i in range(len(days)):
#      print(days[i],fruits[i],drinks[i])

for day,fruit,drink in zip(days,fruits,drinks):
     print(day,fruit,drink)

Mon apple coffee
Tue banana tea
Wed orange beer


```
###感想
少しだけでも毎日続けるように頑張った。相変わらずわかりやすいし楽しいけど、ここまで復習や演習はなし。身についているか不安。

#2019/3/9
###受講した講座のタイトル
・制御フローとコード構造
47. 辞書をfor文で処理をする
48. 関数定義
49. 関数の引数と返り値の宣言
50. 位置引数とキーワード引数とデフォルト引数
51. デフォルト引数で気をつけること
52. 位置引数のタプル化
53. キーワード引数の辞書化
54. Docstringsとは
55. 関数内関数
56. クロージャー
57. デコレーター
###ハンズオンで行った事
一通り、タイプしてコードを事項した

###学んだこと
```python
#辞書をforで利用する。このつかいかたはよく使う
d = { 'x':100,'y' :200}
for k,v in d.items():
     print(k,v)
x 100
y 200

#関数定義（defはdefinitionの略）
#関数は、呼び出すコードよりも上部に記載すること
#以下のresultのように返り値を取得する
def say_someting():
     print('hi')
say_someting()
hi

#以下のように引数と戻り値を指定する
def wat_is_this(color):
     if color == 'red':
          return 'tomato'
     elif color == 'green':
          return 'green peppper'
     else:
          return "I don't Kno"

result =wat_is_this('green')
print(result)

#引数は複数指定することができる。
def menu(entree,drink,dessert):
     print(entree)
     print(drink)
     print(dessert)
menu('beef','beer','ice')

#ただし、引数が複数あると並び順が間違う可能性があるので、キーワードの指定も可能
menu(entree='beef',drink='beer',dessert='ice')

#デフォルト引数の指定も可能、引数があればデフォルトの値が上書きされる
#バグになる可能性があるので、デフォルト引数に空のリストや辞書を定義しないこと
def menu(entree='beef',drink='wine',dessert='ice'):

#引数はタプルにまとめることができる、その場合引数の前に*を、*argsという表現をよく使う
def say_something(word,*args):
     print(word)
     for arg in args:
          print(arg)
say_something('hi','Mike','Nance')
hi
Mike
Nance

#引数を辞書化するばあいは、**を前に使う、**kwargsという表現をよく使う
def menu(**kwargs):
     print(kwargs)
     for k,v in kwargs.items():
          print(k,v)
menu(entree='beef',drink='coffee')
{'entree': 'beef', 'drink': 'coffee'}
entree beef
drink coffee

#以下のように**をつけて辞書を引数に渡すことも可能。コードが見やすいのでよく使う。
d = {
     'entree':'beef',
     'drink':'ice coffee',
     'dessert':'ice'
}
menu(**d)

#docstringとは
#例えば関数を作るときにコメントの作法がある。以下の感じ。
def example_func(param1,param2):
     """ Example function with types documented in the docstring.
     
     Args:
          param1(int):The first parameter.
          param2(str):The second parameter.
          
     Returns:
          bool:The return value.True for success,False otherwise.
      """
     print(param1)
     print(param2)
     return True

#上記のようにdocstringを記述しておくと、以下のようにヘルプで参照可能になる
#以下はどちらでも結果は同じ
help(example_func)
example_func.__doc__

#関数内関数（インナー関数）
#関数の中で関数を定義すると、その関数は、関数の中だけで機能する

#クロージャー...省略引数に実行をしてない関数内関数をわたす...

#デコレーター...こちらも省略
#要するに以下のような記述で関数をデコレート可能
#なお、デコレーターは@で記述すrが、複数行記述可能、その場合順番に注意すること
def print_info(func):
     def wrapper(*args,**kwargs):
          print('start')
          result = func(*args,**kwargs)
          print('end')
          return result
     return wrapper

@print_info
def add_num(a,b):
     return a+b

r = add_num(10,20)
print(r)

```
###感想
難しくなってきた。先行き不安。

#2019/3/11
###受講した講座のタイトル
・制御フローとコード構造
58. ラムダ
59. ジェネレーター
60. リスト内包表記
61. 辞書包括表記
62. 集合内包表記
63. ジェネレーター内包表記
64. 名前空間とスコープ
65. 例外処理
66. 独自例外の作成
###ハンズオンで行った事
今回は説明が多く、コードの入力は5割くらいだった
###学んだこと
```python
#ラムダとは無名関数？
#returnを書かずにかける。2行くらいのシンプルな関数はラムダを使える。
#functionを引数とする場合に活用できる
l = ['Mon','tue','wed']
def change_words(words, func):
    for word in words:
        print(func(word))

def sample_func(word):
    return word.capitalize()

change_words(l,sample_func)

#上記のコードはラムダを使うと、以下の1行となりsample_funcの定義は不要
change_words(l,lambda word: word.capitalize())

#ジェネレーターはイテレーターの一つ
#産出するという意味のyieldをつかう難しいので省略
def greeting():
    yield  'Good moring'
    yield  'Good afternoon'
    yield  'Good night'
g = greeting()
print(next(g))
print(next(g))
print(next(g))

#リスト内包表記とはリストの中にコードを書いてスマートなコードにできる。
#以下はタプルの値をリストに入れている
t = (1,2,3,4,5)
r =[]
for i in t:
    r.append(i)
#以下は上記と同じ動きになる
r = [i for i in t]
#さらに以下のように書くことも可能
r = [i for i in t if i % 2 == 0]

#辞書包括表記はリスト内包表と大体同じ
w = ['mon','tue','wed']
f = ['coffee','milk','water']

d = {}
for x,y in zip(w,f):
    d[x]=y
#上記のforループの部分を以下の1行で省略可能
d = {x:y for x,y in zip(w,f)}

#集合内包表記もリスト内包表記と同じ
s = set()
for i in range(10):
    s.add(i)
#上記のforループが以下の1行で省略可能
s={i for i in range(10)}

#名前空間とスコープ
#関数の中の変数はローカル変数という
#それに対して関数の外の変数はグローバル変数
#以下の関数で辞書で値をの取得が可能
locals()
globals()

#例外処理　try　&　exceptでエラーでもプログラムを止めない
#elseはエラーにならかなった時だけ実行される
#finalyはエラーになってもならなくとも、必ず実行される
l =[1,2,3]
i  = 5
try:
    l[i]
except IndexError as ex:
    print("Don't worry:{}".format(ex))
except Exception as ex
    print("Other:{}".format(ex))
else:
    print('done')
finally:
    print('clean up')

#raiseを使うと独自例外を作成可能
```
###感想
難しい。復習や演習なくずーと新しいことを学び続ける。
これでまだ22%とはつらい。でも1,400円は破格。

#2019/2/xx
###受講した講座のタイトル
###ハンズオンで行った事
###学んだこと
```python
```
###感想