「Python の基本」に関する備忘録

この記事は以下の本に関する、自分が参考になった点をピックアップした記事です。

https://www.kadokawa.co.jp/product/322201000299/

# 型の変換
以下のコードを例に、型の変換について説明します。
```python
name = '1'

new_num = int(name)

print(new_num, type(new_num))
```

最初に'1'という文字列を変数`name`に代入します。
```python
name = '1'
```

'1'は数値のように見えますが、シングルクォートで囲まれているため文字列型です。
nameの型を数値型に変換して、新しい変数`new_num`に代入します。
```python
new_num = int(name)
```

変数`new_num`の型を確認すると、数値型になっていることがわかります。
```python
name = '1'

new_num = int(name)

print(new_num, type(new_num))
```
```:実行結果
1 <class 'int'> # 数値型
```

反対も同様で、文字列型に変換したいときは`str(name)`のように書きます。
```python
name = 1

new_num = str(name)

print(new_num, type(new_num))
```
```:実行結果
1 <class 'str'> # 文字列型
```

# 複数の文字列を出力する
`print`関数の( )の中身を,(カンマ)で区切って文字列を追加すると、それぞれの文字列がスペースで区切られて出力されます。 
```python
print('Hi', 'John')
```
```:実行結果
Hi John
```

スペースではなく「,」「、」など、別の文字列で区切りたい場合は、`sep=','`のように区切り文字を指定して print の( )内に追加すると、指定した文字列で区切って出力されます。
`sep`関数は、複数の要素を文字列で結合する際の区切り文字を指定する関数です。
```python
print('Hi', 'John', sep=',')
print('Hi', 'John', sep='.')
```
```:実行結果
Hi,John
Hi.John
```

終わりの文字列を指定することも可能です。
通常、終わりの文字は改行を意味する`\n` になっていますが、これを明示的に指定する場合は、引数(括弧内に書く値のこと)に`end='\n'`と指定します。
```python
print('Hi', 'John', sep='.', end='\n')
print('Hi', 'John', sep='.')
```
```:実行結果
Hi.John
Hi.John
```

この終わりの文字の指定を、`end=''`のように、シングルクォートの間に何も入れない空文字列にすると、2つの出力が改行されることなく、連続して出力されます。
```python
print('Hi', 'John', sep='.', end='')
print('Hi', 'John', sep='.')
```
```:実行結果
Hi.JohnHi.John
```

もし出力の最後に.(ピリオド)をつけてから改行したい場合は、`end='.\n'`と指定しましょう。
```python
print('Hi', 'John', sep='.', end='.\n')
print('Hi', 'John', sep='.')
```
```:実行結果
Hi.John.
Hi.John
```

# 数値の計算
Python を使用して数値を計算する時、四捨五入をする場合は`round`関数を使用します。
以下の場合、`pie`という変数の値を小数点以下第2位まで四捨五入する場合、`round(pie, 2)`と記述します。
```python
>>> pie = 3.14159265358979
>>> pie
3.14159265358979
>>> round(pie, 2)
3.14
```

# 数学関数を用いた計算
Pythonには、複雑な計算を行うための数学関数が用意されています。
まず、`import math`と入力することで、Pythonの`math`ライブラリを使用できるようになります。
```python
import math # math ライブラリを使用できるようにする
```

ここでは、平方根の計算を例にとっています。
たとえば、25の平方根を求めたい場合、`math.sqrt(25)`のように、`math`の後に「関数名」をドットで繋げて記述します。
その結果を`result`という変数に格納し、表示します
```python
import math

result = math.sqrt(25)
print(result)
```
```:実行結果
5.0
```

# 文字列の囲み方
文字列は、単一引用符(シングルクォート)の他に二重引用符(ダブルクォート)でも囲むことができます。
```python
print('hello')
print("hello")```
```:実行結果
hello
hello
```

ダブルクォートで囲まれた文字列の中にシングルクォートが含まれていても、問題なく表示されます。
```python
print("I don't know")
```
```:実行結果
I don't know
```

ただし、シングルクォートで囲まれた文字列の中にシングルクォートが含まれている場合、エラーが発生します。
```python
print('I don't know')```
```:実行結果
  File "/Users/y.takanashi/PycharmProjects/pythonProject/lesson.py", line 1
    print('I don't know')
                       ^
SyntaxError: unterminated string literal (detected at line 1)
```

そのため、シングルクォートの前にバックスラッシュを使用してエスケープする必要があります。
```python
print('I don\'t know')
```
```:実行結果
I don't know
```

# 文字列の途中に改行を入れる
途中で改行を入れたい場合に、`\n`のように、バックスラッシュと n を組み合わせて改行を入れたい箇所に記述します。
```python
print('Hello. \nHow are you?')
```
```:実行結果
Hello. 
How are you?
```

ただし、文字列の中に`\n`が含まれていると、意図せず改行が入ってしまうことがあります。
以下の例では、Windows のファイルパスのような文字列を出力しようとしたものの、文字列に`\n`が含まれてしまっているために、意図しない改行が入ってしまっています。
```python
print('C:\name\name')
```
```:実行結果
C:
ame
ame
```

これを回避するためには、文字列の囲みの前に`r`を記述します。
この`r`は raw(生)を省略したもので、raw データ、つまり生のデータを出力するという意味になります。
```python
print(r'C:\name\name')
```
```:実行結果
C:\name\name
```

# 複数行にわたる文字列の出力
複数行にわたる文字列を出力したい場合は、`"""`のように二重引用符(ダブルクォート)3つで囲み、その間に文字列を記述します。
こうすると、改行したい箇所に`\n`でわざわざ指定する必要がなく、記述したところに改行されて出力されます。
```python
print('line1\nline2\nline3')

print("""
line1
line2
line3
""")
```
```:実行結果
line1
line2
line3

line1
line2
line3
```

`"""`で囲んだ出力の前後に`print`の処理を入れてみると、間に空白行が入っていることがわかります。
```python
print('##########')
print("""
line1
line2
line3
""")
print('##########')
```
```:実行結果
##########

line1
line2
line3

##########
```

これは、`"""`を記述した行も1行としてカウントされているためです。
空白行を入れたくない場合は、以下のように`"""`の後ろに書く必要があります。
```python
print('##########')
print("""line1
line2
line3""")
print('##########')
```
```:実行結果
##########
line1
line2
line3
##########
```

もっと読みやすい書き方もあります。
最初の`"""`の直後や、最後の`"""`の手前の行の最後に`\`を入れると、空白行が表示されずに、かつ読みやすい書き方になります。
このような行の最後のバックスラッシュは、次の行にそのまま続くという意味です。
```python
print('##########')
print("""\
line1
line2
line3\
""")
print('##########')
```
```:実行結果
##########
line1
line2
line3
##########
```

# 文字列を連結する
文字列を、演算子を使って連続で表示するということもできます。
`*`を使って、掛け算のように文字列の回数を指定すると、その回数を繰り返し表示できます。
```python
print('Hi.' * 3)
```
```:実行結果
Hi.Hi.Hi.
```

`+`を使って文字列を連結することもできます。
```python
print('Hi.' * 3 + 'John.')
```
```:実行結果
Hi.Hi.Hi.John.
```

ソースコードに書いた文字列や数値のことを`リテラル`と言います。
文字列のリテラル同士をつなげる際は、`+`でつなげることもできますし、`+`を省略して並べることも可能です。
```python
print('Py' + 'thon')
print('Py''thon')
```
```:実行結果
Python
Python
```

ただし、文字列を変数に格納した場合は、その変数とリテラルを`+`なしでつなげることはできません。
変数に格納されてた文字列をリテラルとつなげる場合は、`+`を使います。
```python
prefix = 'Py'
print(prefix 'thon')
```
```:実行結果
  File "/Users/y.takanashi/PycharmProjects/pythonProject/lesson.py", line 2
    print(prefix  'thon')
                  ^^^^^^
SyntaxError: invalid syntax
```
```python
prefix = 'Py'
print(prefix + 'thon')
```
```:実行結果
Python
```

# 文字列のスライス
Python には「**スライス**」という機能があります。
これは、2つのインデックスを指定することで、その間の要素を取り出すというものです。

例えば、文字列の0番目から2番目の文字を表示する場合は以下のように指定します。
```python
word = 'python'
print(word[0:2])
```
```:実行結果
py
```

2番目から4番目までの文字を表示する際には、`word[2:5]`と指定します。
```python
word = 'python'
print(word[2:5])
```
```:実行結果
tho
```

また、はじまりや終わりのインデックスの指定は省略できます。
はじまりのインデックスを省略すると、最初の文字から取得します。
つまり、0を指定したときと同じです。
```python
word = 'python'
print(word[0：2])
print(word[:2])
```
```:実行結果
py
py
```

終わりのインデックスを省略すると、はじまりのインデックスの文字から最後までを表示してくれます。
```python
word = 'python'
print(word[2:])
```
```:実行結果
thon
```

スライスする際に、はじまりと終わりのインデックスをどちらも省略して`[:]`のみ入力すると、文字列全体を取得できます。
```python
word = 'python'
print(word[:])
```
```:実行結果
python
```

ちなみに、文字列のインデックスを指定して、一部の文字を書き換えることはできません。
Python の文字列は、内容を変更できないデータ(イミュータブルなデータ）だからです。
```python
word = 'python'
word[0] = 'j'
print(word)
```
```:実行結果
Traceback (most recent call last):
  File "/Users/y.takanashi/PycharmProjects/pythonProject/lesson.py", line 2, in <module>
    word[0] = 'j'
    ~~~~^^^
TypeError: 'str' object does not support item assignment
```

文字列の一部を変更したい場合は、`スライス`や`+`による連結を駆使して新しい文字列を作り、それを変数に入れましょう。
```python
word = 'python'
word[0] = 'j' + word[1:]
print(word)
```
```:実行結果
jython
```

# 文字列のメソッドを使う
PyCharm で文字列の変数を作成し、その変数名の後に.(ドットまたはピリオド)をつけると、一覧が表示されます。
これはメソッドの一覧です。
![スクリーンショット 2024-03-28 20.30.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/1a568524-71d6-6ab2-9cd8-b96b72388a2c.png)

表示されるメソッドの一覧から、`startwith`という文字列のメソッドを選んで使ってみましょう。
これは対象の文字列が( ) の中に指定した文字列ではじまっているかを調べられるメソッドです。
指定した文字がはじまっていれば結果は`True`、そうでない場合は`False`となります。
このメソッドの結果を`is_start`という変数に格納し、`print`関数で表示してみます。
```python
s = 'My name is John.'
is_start = s.startswith('My')
print(is_start)
```
```:実行結果
jython
```