Python for Everyone

#Hardware Overview
・CPUは中央処理装置。何百万ものトランジスタを載せている。命令は一連の信号。命令はメモリから得る。
・補助記憶にpythonファイルのようなファイルを作り、そこから主記憶に読み込まれて翻訳される。キャッシュを残して主記憶の速度を早める。
・主記憶は住んでいる場所のイメージ。CPUの質問に主記憶から答える。


#pytho基本文法（初心者向け）
初心者が混乱しがちな文法をまとめました。

##a+=1とは
a+=1は「a=a+1」という意味です。
+の部分は、-,*,/,%でも使えます。

##for構文
混乱したときは、このサイトがわかりやすいです。
https://udemy.benesse.co.jp/development/python-work/python-for.html

特に注意したいのが、rangeを使うとき。
range(5)は、０〜４になってしまう。
１〜５にしたいときは、range(1,6)。
仮にrange(1,5)にすると、１〜４になる。（なぜだろう・・・。）


##try/except
例外処理の構文

```
try:
 #例外の発生しうる処理
except:
 #すべての発生した例外に対して行う処理

```

「except Exception名：」とすることで、特定の例外に対しての処理を記載することもできる。


#python基本文法(中級者向け)
プロゲートで学べる基本的な学習の範囲外となる文法をまとめました。


##商の求め方
「/」を使うと、少数になることがある。余りを使って表現する場合は「//」を使う。

```python:商の求め方
#5÷2=2.5
print(5 / 2)

#5÷2=2余り１
syou = 5 // 2
amari = 5 % 2
print(str(syou) + '余り' + str (amari))
```

##二乗の書き方

```python:二乗の書き方
print(5**2)
```

##進数変換
###16進数へ変換する hex
Pythonで10進数の値を16進数へ変換するには「hex」を使います。


```python
hex(100)
#[結果] '0x64'
```

10進数「100」→16進数「64」に変換しました。頭の「0x」は16進数という意味のプレフィックスです。


###10進数を2進数へ変換する bin・format
Pythonで10進数の値を2進数へ変換するには「bin」を使う。

```
bin(100)
#[結果] '0b1100100'
```

10進数「100」→2進数「1100100」に変換しました。頭の「0b」は2進数という意味のプレフィックスです。


またはformatを使うこともできる。

```
format(100, 'b')
#[結果] '1100100'
```
第二引数は「b」を指定。
「format」を使うと、プレフィックス「0b」がつかないので扱いやすい。

###10進数を8進数へ変換する oct・format

```8進数へ変換する
oct(100)
#[結果] '0o144'
```
Pythonで10進数の値を8進数へ変換するには「oct」を使います。
10進数「100」→8進数「144」に変換しました。頭の「0o」は8進数という意味のプレフィックスです。

参考リンク：https://pg-chain.com/python-hex-bin-oct

##printのオプション
printのオプションにはendとsepがある。

###end
オプションにendをつかうことで文字列のあとになにか文字を追加することができます。

```
print('wawawa',end='dayo')
# wawawadayo

#改行しないで続けたい場合
print('wawawa', end=' ')

#改行の場合
print('wawawa',end=' \n')
```


###sep
オプションにsepをつかうことでprintに渡した文字列の区切り文字を変更することができます。

```
print('wawawa','sasasa','dadada',sep=',')
# wawawa,sasasa,dadada
```

これらのオプションはpython3で使える。２で使うと、構文エラーになるので注意。

参考リンク：https://www.kabegiwablog.com/entry/2018/10/04/100000


#基本文法(jupyterLab)
vscodeにjupyterLabを入れることができる。
以下のリンクは、ショートカットキーまとめ。
https://qiita.com/k_maki/items/78e50a4a8a7694e7dd3a


##文字列

###formatメソッド

```python
name = 'あああ'
birthplace = '千葉'
'私は{}です。出身は{}です。'.format(name,birthplace)
```

###f-strings

```python
f'私は{name}です。出身は{birthplace}です。'
```


###改行
バックスラッシュは、オプション押しながら¥(macの場合)

```
print('ああああ\nいいいい')
```

###書式化
%を使うことで、文字のフォーマットを指定することができるため、
数字の後ろに単位を付けたり、金額を表示する際にカンマを付けたりすることもできます。
他の言語で言うところのprintfである。

```
num1 = 30
print("10進数では %d 、16進数では %x です" % (num1, num1))

>> 10進数では 30 、16進数では 1e です

````

##大文字小文字への変換
upper(lower)メソッドを使用する。

```
'hello'.upper()
>>'hello'.upper()

'WORLD'.lower()
>>'world'
```

##文字列の分割
一つの文字列を２つに分割するときは、splitメソッドを使う。

```
message.split('\n')

>>['こんにちは。', '私はロボットです。']
```


##文字列の結合
joinを使う。

```ipynb
messages = message.split('\n')
''.join(messages)

>>'こんにちは。 私はロボットです。'
```
''に入っているStringで結合する。


##空白除去
strip : 文字列の先頭及び末尾部分を除去したコピーを返却する
rstrip : 文字列の末尾部分を除去したコピーを返却する

```
message = '　ああああ　'
print(message.strip())
>>'ああああ'

print(message.rstrip())
>>'　ああああ'
#先頭の空白は残ったまま
```

##文字列の置換
replaceをつかう。

```
message = '今日は晴れですね'
message.replace('晴れ', '雨')
>>今日は雨ですね
```


##文字列検索
findを使うと、前から何文字目かを出力する

```
message = '今日は晴れですね'
message.find('晴れ')
>>3
```
0から数えて3番目に「晴」がある。


##型変換
strやintでカッコ書き。辞書型でもできる。

```
x = 1
str(x)
>>'1'

x = dict(name:aaaa, birth:bbb) 
x = {'name':'john', 'birth':'USA'}　#辞書型の定義方法はこれでもOK
str(x)
>>"{'name': 'john', 'birth': 'USA'}"
```


##包含関係
TrueかFalseで結果を教えてくれる。

```
a, b = "sba", "gasba"
#aの文字列がbの中に入っているか（boolen）
a in b
>>True
```

##リスト
定義方法は以下。

```
numbers = [0,13,8,-4,9,1]

#0から数えて前から1番目の値
numbers[1]

#リストの末尾に追加する
numbers.append(5)

#特定の値を追加(0番目の値に５を追加)
numbers.insert(0,5)

#一番最後の値の前に-3
numbers.insert(-1, -3)

#特定の値を削除
numbers.remove(5)

#リストの入っていない値は削除エラーが出る
numbers.remove(-1)
>>ValueError: list.remove(x): x not in list

#場所指定の場合
#１番目の値を削除
numbers.pop(1)
```

###フィルター
filterメソッドを使う。
先にフィルターの役割を担う関数を定義する必要がある。

```
#偶数ならTrue、奇数ならFalseと判定
def isEven(number):
  if number %2 ==0:
    print(f'This number ,{number} is even!', )
    return True
  else:
    print(f'This number ,{number} is odd!', )
    return False
# returnのTrue/Falseがフィルターの役割になる

#２は偶数なのでTureが出力
isEven(2)
>>This number ,2 is even!
>>True


#フィルターの役割を担う関数・何に対してフィルターをかけるかを引数に書ける
filter(isEven, numbers)
>> <filter at ~~~>

#リストに入っている値一つ一つを表示する
list(filter(isEven, numbers))
>>This number ,0 is even!
>>This number ,-4 is even!
>>This number ,9 is odd!
>>This number ,1 is odd!
>>This number ,-3 is odd!
>>This number ,-3 is odd!
>>This number ,5 is odd!
[0, -4]
```

###引数の値がリストの何番目に入っているか
indexを使う。

```
numbers.index(-4)
>>1
```

###ソート
sortが昇順、引数にreverse=Trueを入れると降順になる。

```
#昇順
numbers.sort()
numbers
>>[-4, -3, -3, 0, 1, 5, 9]

#降順
numbers.sort(reverse=True)
numbers
>>[9, 5, 1, 0, -3, -3, -4]
```

##辞書

###要素の削除
特定の要素を削除する場合はpopを使う。
すべてを削除する場合はclearを使う。

```
#辞書型の定義
dictionary = {
  'A':"aaa",
  'B':"bbb",
  'C':"ccc"
}
dictionary
>>{'A': 'aaa', 'B': 'bbb', 'C': 'ccc'}

#Aを削除
dictionary.pop('A')
>>'aaa'

dictionary
>>{'B': 'bbb', 'C': 'ccc'}

#すべてを削除
dictionary.clear()

dictonary
>>{}


###情報の取得
keysやvalueｓを使う。


```
dictionary = {
  'A':"aaa",
  'B':"bbb",
  'C':"ccc"
}
dictionary

#keyをすべて出力
dictionary.keys()
>>dict_keys(['A','B','])

#valueをすべて出力
dictionary.values()
>>dict_values(['aaa', 'bbb', 'ccc'])

#ある値が辞書にあるか
'bbb' in dictionary.values()
>>True

#itemsはforのあとの値を当てはめる
for key, value in dictionary.items():
  print(f'{key}には{value}が入っています。')
>>Aにはaaaが入っています。
>>Bにはbbbが入っています。
>>Cにはcccが入っています。
```

##辞書内の要素検索
getを使う
辞書にない値を検索してもエラーが起きない。

```
dictionary.get('C')
>>'ccc'
```


##if文

###if文を使って条件分岐

```
num = -1

if num > 0:
  print('正の値です') 
elif num == 0:
  print('0です')
else:
  print('負の値です')
```

###論理演算子を使って複数条件の指定
andやorを使う

```
a = -1

if a >= 0 and 10 > a and a % 2 == 0:
  print('一桁の偶数です')
elif a < 0 and a % 2 != 0:
  print('負の奇数です')
else:
  print('整数です') 

>>負の奇数です
```

##for文
###リストの要素を表示
for文で値を取り出そう。

```
names = ['John', 'Kevin', 'Louis']

for name in names:
  print(name)

```

###range関数

```
for num in range(0,10):
  print(num)
```

###強制終了させる
breakを使ってループを抜ける

```
#break
for num in range(0,10):
  print(num)
  if num ==6:
    break
>>0
1
2
3
4
5
6
```

###ループの中で特定の処理を実行
continueする

```
for num in range(0,10):
  if num ==3:
    continue
  print(num)
```

###複数のリストを同時に処理
zip関数に入れる。

```
lasts = ['加藤','佐藤','田中']
firsts = ['雄一','拓哉','太郎']

for last, first in zip(lasts,firsts):
  print(last + first)

>>加藤雄一
>>佐藤拓哉
>>田中太郎

```

###要素と同時にインデックス情報の取得
enumerateを使う

```
for i, last in enumerate(lasts):
  print(i, last)

>>0 加藤
>>１　佐藤
>>2 田中
```

###内包表記
一行で書くこと。リストの[]の中に記載する

```
nums =[]

#普通のfor
for i in range(5):
  nums.append(2 * i)

nums
>>[0,2,4,6,8]

#内包表記
numbers = [2 * i for i in range(5)]
```

##例外処理
###0で割ったときの例外処理
0での割り算のエラーを対処するときはtry/exceptを使う

```
num = 0
print(f'計算結果：{10 / num}')
>>ZeroDivisionError: division by zero

#0で割ったときの例外処理
try:
  num = 0
  print(f'計算結果：{10 / num}')
except:
  print('エラー')
>>エラー
```

###具体的なエラー内容を出力
exceptの後ろにエラー名を書く。

```
num = 0
try:
  print(f'計算結果：{10 / num}')
except ZeroDivisionError as e:
  print(e)
>>division by zero
```

###通常終了時の処理
exceptを通らなかった場合のelseに記載

```
def devide(a, b):
  try:
    print(f'計算結果：{a/b}')
  except ZeroDivisionError as e:
    print(e)
  except TypeError as e:
    print(e)
  else:
    print('正常に終了しました')
```


###例外も含めた終了時に行う処理
finallyを使う

```
def devide(a, b):
  try:
    print(f'計算結果：{a/b}')
  except ZeroDivisionError as e:
    print(e)
  except TypeError as e:
    print(e)
  else:
    print('正常に終了しました')
  finally:
    print('すべての処理が終了しました')
```


###例外をスルーする
exceptで例外を記述後、passを記載。

```
def devide(a, b):
  try:
    print(f'計算結果：{a/b}')
  except ZeroDivisionError as e:
    print(e)
  except TypeError as e:
    pass
  else:
    print('正常に終了しました')
  finally:
    print('すべての処理が終了しました')
```

##ファイルを開く
openメソッドを使用する
open('word.txt',mode)
1つめのパラメータは開きたいファイル名
2つ目のパラメータは、読み込みなのか書き込みなのか、モードを選択。
読み込みなら'r'など。。。

ファイルのテキストを表示する
基本的にはfor文で各行をprintする
```
#ユーザがファイル名を入力
fname = input("Enter file name: ")

#ファイルを開く
fh = open(fname,'r')

#各行をprintする。
#改行があるテキストだと、単純にprint（i）とすると、行間に改行が二重で入ってしまうため、rstripを使う
for i in fh:
 print(i.rstrip())
```



#よくあるエラー集

##SyntaxError:Non-ASCII character
printやinputで日本語を表示させようとすると文字化けで出るエラー。
下記のコードをline1に記載する。

```python
# -*- coding: utf-8 -*-
print('日本語')
```

##SyntaxError:invalid syntax
SyntaxErrorというエラーはプログラムがPythonの文法として正しくないときに発生するエラーで、日本語にすると構文エラーです。 
このエラーが出た時には書き方が間違っている箇所がないか探してみましょう。

よくあるミスは以下の通り。
>・Pythonのコマンドや関数の名前を打ち間違えていないか？
>・カッコを閉じ忘れていないか？
>・半角スペースの箇所が、全角になっていないか？
>・for文, if文, 関数などの「:」を書き忘れていないか？
>・''（シングルクォーテーション）や""（ダブルクォーテーション）を忘れていないか？

参考文献：https://blog.pyq.jp/entry/Python_kaiketsu_200310