Python始めました。（その１）

#記事を書くきっかけ
　これまではフロントエンドをやっていましたが、バックエンドもできたらかっこいいなと思ってサーバーやデータベースにも手を出し始めました。

　pythonは機械学習やAIのイメージがあったのですが、どうやらバックエンドもできるらしいということで、習得したらお得じゃね？ということでpythonを学び始めました。

　今回は以下の動画教材を用いて勉強しました。
　　[プログラミング初心者でも安心、Python/Django入門講座](https://www.udemy.com/share/101XAa3@Twltedv7DY1Oa9ym7eF6EqGLHqncpYNk4JnGz3s0vzROQr4WI3aHAWd3-ClRgiJnhA==/)

#始める前に
　pythonの学習をするにあたってまず、公式からpythonをダウンロードしました。
　　https://www.python.org/downloads/

#基礎知識
　今回はpythonのinteractiveshellを使って基礎の基礎をやっています。ターミナルに以下のコマンドを打ち込むことで利用できます。終わる時は```exit()```で終わります。

```
$ python3.10　　//3.10はpythonのバージョン
```
　ここからは雑ですが、補足があればコマンドにコメントを加える形で説明していきます。

```Python:四則演算
>>> 1+1     # 足し算
2
>>> -100+10
-90
>>> 1-1     # 引き算
0
>>> 10-0.1
9.9
>>> 1*10    # 掛け算
10
>>> 10**2   # n乗
100
>>> 10**0
1
>>> 20/4    # 割り算
5.0
>>> 10//3   # 商だけ
3
>>> 10%3    # 余りだけ
1
>>> divmod(10,3)    # （10/3）(商, 余り)を返す
(3, 1) 
```

```Python:type確認
>>> a=1
>>> type(a)
<class 'int'>
>>> a=0.1
>>> type(a)
<class 'float'>
```

##文字列
　\```で囲うことで複数行の文字列を書けます。

```Python:複数行文字列
>>> text='''\
... Hello
... Hi
... '''
>>> print(text)
Hello
Hi
```

```Python:文字列
>>> b='hello'
>>> b*10    # 文字列10個羅列できる
'hellohellohellohellohellohellohellohellohellohello'
>>> b+=' everyone'
>>> b
'hello everyone'
>>> b*0
''
>>> len(b)    # 文字列の長さ
14
```

```Python:文字列のメソッド(format)
>>> fmt='私の名前は{}です'
>>> name='太郎'
>>> fmt.format(name)
'私の名前は太郎です'
>>> fmt.format('次郎')
'私の名前は次郎です'

>>> fmt='私の名前は{} {}です'
>>> fmt.format('佐藤','太郎')
'私の名前は佐藤 太郎です'
>>> fmt='{0}{1}{0}'
>>> fmt.format('山田','田中')
'山田田中山田'
>>> fmt='{last}{first}'
>>> fmt.format(last='Sato',first='Taro')
'SatoTaro'

>>> last='佐藤'
>>> first='太郎'
>>> f'{last}{first}'
'佐藤太郎'
```

```Python:文字列のメソッド(split/join)
>>> language='Python,Ruby,PHP,Perl'
>>> language.split(',')    # 文字列を,で分割してリスト化
['Python', 'Ruby', 'PHP', 'Perl']

>>> list=language.split(',')
>>> separator=','
>>> separator.join(list)    # ,つけてリストの要素を結合
'Python,Ruby,PHP,Perl'
>>> ','.join(list)
'Python,Ruby,PHP,Perl'
>>> ' '.join(list)
'Python Ruby PHP Perl'
>>> 
```

```Python:文字列のメソッド(replace)
>>> poem='今日はとても良い天気でした'
>>> poem.replace('今日','昨日')
'昨日はとても良い天気でした'
```

```Python:文字列のメソッド(count)
>>> text='hello,hello,hello'
>>> text.count('hello')
3
```

```Python:文字列のメソッド(startswith/endswith/in)
>>> name='佐藤太郎'

>>> name.startswith('佐藤')
True
>>> name.startswith('田中')
False

>>> name.endswith('太郎')
True
>>> name.endswith('次郎')
False
>>> 

>>> '太郎' in name
True
>>> '次郎' in name
False
```

```Python:文字列のメソッド(find/index)
>>> text='Hello world'

>>> text.find('Hello')    # 一致箇所のindex番号返す
0
>>> text.find('w')
6
>>> text.find('aaa')    # 一致しない時は-1を返す
-1

>>> text.index('Hello')
0
>>> text.index('aaa')    # 一致しない時はエラーを返す
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: substring not found
```

```Python:文字列のメソッド(strip)
>>> text='    HelloWorld    '

>>> text.strip()
'HelloWorld'
>>> text.rstrip()    # 右のスペース消す
'    HelloWorld'
>>> text.lstrip()    # 左のスペース消す
'HelloWorld    '
```

```Python:シーケンス型としての文字列操作
>>> text='あいうえお'

>>> text[0]
'あ'
>>> text[1]
'い'
>>> text[4]
'お'
>>> text[-1]
'お'

>>> text[1:4]    # [start:end]　start以上end未満
'いうえ'
>>> text[1:]
'いうえお'
>>> text[:4]    # indexは4までだが、endは含まれないので注意
'あいうえ'
>>> text[:5]
'あいうえお'
>>> text[-3:]    # 最後から数えて3つ目からstart
'うえお'

>>> text[::2]    # [start:end:step] 今回は2つ置き
'あうお'
>>> text2=text[1:4]
>>> text2[::2]
'いえ'

>>> text[::-1]    # step-1で逆順に取り出せる
'おえういあ'
>>> 
```

##リスト
　Javascriptで言うところの配列。

```Python:リスト
>>> mylist=[1,True,False,'Hello']
>>> type(mylist)
# <class 'list'>

>>> mylist=[]
>>> mylist.append('taro')    # 追加
>>> mylist
['taro']
>>> mylist[0]='hanako'    # リストは書き換え可能
>>> mylist
['hanako']

>>> mylist=[1,2,3,4,5]
>>> mylist[:2]=[-1,-2]
>>> mylist
[-1, -2, 3, 4, 5]
```

```Python:リストの組み込み関数(len/sum/max/min)
>>> numbers=[1,2,3,4,5]
>>> len(numbers)    # 長さ
5
>>> sum(numbers)    # 合計
15
>>> max(numbers)    # 最大
5
>>> min(numbers)    # 最小
1
```

```Python:リストの組み込み関数(insert/extend)
>>> numbers=[1,2,3,4,5]
>>> numbers.insert(1,1.5)    # index1番目に1.5挿入
>>> numbers
[1, 1.5, 2, 3, 4, 5]

>>> num1=[1,2,3]
>>> num2=[4,5,6]
>>> num1.extend(num2)    # リストの結合
>>> num1    # num1が更新される
[1, 2, 3, 4, 5, 6]

>>> num1=[1,2,3]
>>> num2=[4,5,6]
>>> num3=num1+num2    # num1を更新したくない場合は、num3を用意して格納
>>> num3
[1, 2, 3, 4, 5, 6]
```

```Python:リストの組み込み関数(pop/remove)
>>> numbers=[1,2,3,4,5]
>>> numbers.pop(0)    # 削除　削除した要素を返してくれる
1
>>> numbers
[2, 3, 4, 5]
>>> numbers.pop()    # ()で最後の要素削除
5
>>> numbers
[2, 3, 4]
>>> deleted=numbers.pop()
>>> deleted
4

>>> mylist=['a','i','u']
>>> mylist.remove('i')
>>> mylist
['a', 'u']
```

```Python:リストの組み込み関数(index/in)
>>> num=[1,2,3,4]
>>> num.index(3)    # 3はindex何番目？
2

>>> 1 in num
True
>>> 100 in num
False
```

```Python:リストの組み込み関数(count/join)
>>> num=[1,1,1,1,2,3,4,4,5,5,5,6]
>>> num.count(1)
4
>>> num.count(8)
0

>>> parts=['今日は','とても','良い天気']
>>> poem='\n'.join(parts)
>>> print(poem)
今日は
とても
良い天気
>>> 
```

```Python:リストの組み込み関数(sort)
>>> num=[5,3,7,4,8,1,3]
>>> num.sort()    # 昇順の場合
>>> num
[1, 3, 3, 4, 5, 7, 8]
>>> num.sort(reverse=True)    # 降順の場合 (reverse=True)指定
>>> num
[8, 7, 5, 4, 3, 3, 1]

>>> num=[5,3,7,4,8,1,3]
>>> num2=sorted(num)    # numを変更したくない場合
>>> num2
[1, 3, 3, 4, 5, 7, 8]
```

```Python:リストの注意点
>>> list1=[1,2,3]
>>> lists=[list1,list1,list1]
>>> lists
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]

>>> list1.append(4)    # list1変更するとlistsの中身も全て変更される
>>> lists
[[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]]
>>> lists[0].append(5)    # lists[0]を指定したとしてもlistsの中身全て変更される
>>> lists
[[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5]]

>>> lists=[list1.copy(),list1.copy(),list1.copy()]    # copy()することでそれぞれ独立したlistになる
>>> lists[0].append(6)
>>> lists
[[1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5]]

>>> lists=[list1[:],list1[:]]    # list1を[start:end](すべての範囲)でsliceするパターン
>>> lists
[[1, 2, 3, 4], [1, 2, 3, 4]]
```


##タプル

```Python:タプル
>>> mytuple=()
>>> mytuple=tuple()    # タプル型指定する場合
>>> type(mytuple)
# <class 'tuple'>

>>> mytuple=(1,True,False,'Hello')
>>> mytuple=1,True,False,'Hello'    # 要素の羅列でもタプル型になる
>>> mytuple
(1, True, False, 'Hello')

>>> onetuple='Python',    # タプルの要素が1つの時は最後に,をつける
>>> type(onetuple)
# <class 'tuple'>
>>> onetuple='Python'    # つけ忘れると文字列になるので注意
>>> type(onetuple)
# <class 'str'>

>>> mytuple='Python','PHP','Ruby','Perl'
>>> mytuple[0]
'Python'
>>> mytuple[1:]
('PHP', 'Ruby', 'Perl')
>>> mytuple[0]='C'    # タプルは要素の変更不可
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
```

list -> let
tuple -> const
みたいな感覚。

##辞書
　Javascriptで言うところのオブジェクト。

```Python:辞書
>>> score={'math':80,'science':50}
>>> type(score)
# <class 'dict'>

>>> score={}
>>> score=dict()
>>> score['math']=80    # score['key名']=value
>>> score
{'math': 80}
>>> score['math']
80
```

```Python:辞書の組み込み関数(get)
>>> score={}
>>> science=score.get('science','no data')    # key=scienceのvalueを格納。無ければno data格納
>>> science
'no data'
>>> score['science']=80
>>> science=score.get('science','no data')
>>> science
80

>>> math=score.get('math')
>>> print(math)    # 無いものはNone
None
```

```Python:辞書の組み込み関数(update/pop/in/len/setdefault/keys()/values()/items())
>>> member={'guitar':'Sato','base':'Kato'}
>>> new={'drum':'Ito','vocal':'Eto'}
>>> member.update(new)
>>> member
{'guitar': 'Sato', 'base': 'Kato', 'drum': 'Ito', 'vocal': 'Eto'}

>>> new={'guitar':'Kudo'}
>>> member.update(new)    # すでにキーがある場合、valueが更新される
>>> member
{'guitar': 'Kudo', 'base': 'Kato', 'drum': 'Ito', 'vocal': 'Eto'}

>>> deleted=member.pop('base')    # 削除するkeyのvalueを格納
>>> deleted
'Kato'
>>> member
{'guitar': 'Kudo', 'drum': 'Ito', 'vocal': 'Eto'}

>>> 'drum' in member    # key名ある場合はTrue
True
>>> 'Kudo' in member    # valueを指定するとFalseになる
False

>>> len(member)
3

>>> guitar=member.setdefault('guitar','Endo')
>>> guitar    # key名ある場合はそのvalue持ってくる
'Kudo'
>>> base=member.setdefault('base','Endo')
>>> base    # キー名無い場合は第二引数をvalueとする
'Endo'
>>> member
{'guitar': 'Kudo', 'drum': 'Ito', 'vocal': 'Eto', 'base': 'Endo'}

>>> member.keys()    # memberにある要素のkey名持ってくる
dict_keys(['guitar', 'drum', 'vocal', 'base'])
>>> member.values()    # memberにある要素のvalue持ってくる
dict_values(['Kudo', 'Ito', 'Eto', 'Endo'])
>>> member.items()    # memberにある要素のkey名とvalue持ってくる
dict_items([('guitar', 'Kudo'), ('drum', 'Ito'), ('vocal', 'Eto'), ('base', 'Endo')])
```

##セット
```Python:セット
>>> myset={1,2,3}
>>> type(myset)
# <class 'set'>

>>> myset=set()    # 空のset作る場合は必ずset()
>>> mylist=[1,2,3]
>>> myset=set(mylist)
>>> myset
{1, 2, 3}

>>> mylist=[1,1,1,1,2,2,2,3,3,4,5,6]
>>> myset=set(mylist)    # 同じ値は1つにされる
>>> myset
{1, 2, 3, 4, 5, 6}

>>> myset={1,2,3}
>>> myset.add(4)
>>> myset
{1, 2, 3, 4}
>>> myset.remove(1)
>>> myset
{2, 3, 4}
>>> 2 in myset
True
>>> len(myset)
3
```

##集合
```Python
>>> mutable={'list','dict','set'}
>>> imutable={'str','number','tuple'}
>>> seq={'list','tuple','str'}

>>> mutable&seq    # 積集合(mutable/seqどちらにも属する)
{'list'}
>>> mutable.intersection(seq)    # 積集合(intersection) パターン２
{'list'}


>>> mutable | seq    # 和集合(mutable/seqどちらか一方に属する(どちらにも属するものも含む))
{'str', 'list', 'tuple', 'dict', 'set'}
>>> mutable.union(seq)    # 和集合(union) パターン２
{'str', 'list', 'tuple', 'dict', 'set'}


>>> mutable ^ seq    # 排他的論理和集合(mutable/seqどちらか一方にのみ属する(どちらにも属するものは含まない))
{'str', 'dict', 'tuple', 'set'}
>>> mutable.symmetric_difference(seq)    # 排他的論理和集合(symmetric_difference) パターン２
{'str', 'dict', 'tuple', 'set'}


>>> imutable - seq    # 差集合(imutableだがseqに属さない)
{'number'}
>>> imutable.difference(seq)    # 差集合(difference) パターン２
{'number'}
```

#まとめ
　Javascriptと似てるような似てないような...という感じでした。笑
　その２では.pyファイルでコードを書いたif文や、ファイルの読み書きなどについてまとめようと思います。