今さら聞けないPython - Pythonの基礎

こちらのウェビナーで説明した内容の抜粋です。最初のセクションの「Pythonの基礎」とエディタの便利機能をカバーしています。

https://pages.databricks.com/202303-APJ-VE-Fundamental-Series-Python.html

全体構成は以下の通りです。
- [今さら聞けないPython \- Pythonの基礎](https://qiita.com/taka_yayoi/items/bb96e1be88959902cb17)
- [今さら聞けないPython \- pandasを用いたデータ分析](https://qiita.com/taka_yayoi/items/3bb88b204f47bdf091eb)
- [今さら聞けないPython \- scikit\-learnを用いた機械学習](https://qiita.com/taka_yayoi/items/08d3166714b53b9acc7b)
- [今さら聞けないPython \- Sparkのご紹介](https://qiita.com/taka_yayoi/items/5415db284b96c7c60d44)

ウェビナーで使用したノートブックはこちらにあります。

https://github.com/taka-yayoi/public_repo_2/tree/master/python_webinar

スライドはこちら。

<script defer class="speakerdeck-embed" data-id="90ee5f08b56042889bf50a0e4c5ea236" data-ratio="1.7777777777777777" src="//speakerdeck.com/assets/embed.js"></script>

本記事でカバーしているノートブックはこちらです。

https://github.com/taka-yayoi/public_repo_2/blob/master/python_webinar/1.%20Python%E3%81%AE%E5%9F%BA%E7%A4%8E.py

# Pythonの基礎

Pythonの歴史や背景は置いておいて早速実践に行きましょう。実行環境は[Databricksレイクハウスプラットフォーム](https://www.databricks.com/jp)を使います。

:::note
**個人的な感想**
- 言語構造自体は他の言語(R/Perl/PHPなど)と大差ないと思います。
- インデントによるブロック記述が可視性を高めてくれて助かります。
- pandasのデータフレームを知ったら配列を用いた複雑なコーディングには戻れません。
- 何よりも豊富なライブラリが魅力的。
:::

- 数値 & 文字列
- 変数
- Print関数
- リスト
- Forループ
- 関数
- 条件文
- 型と型チェック

## 1) 数値: Pythonを計算機として使ってみましょう!

```py:Python
1+1 
```
```
Out[1]: 2
```

## 2) 文字列

```py:Python
'アイスクリーム'
```
```
Out[2]: 'アイスクリーム'
```

`+`で文字列を結合できます。

```py:Python
'アイスクリーム' + 'は楽園です'
```
```
Out[3]: 'アイスクリームは楽園です'
```

## 3) 変数

シェイクスピアは言いました: 「バラはどんな名前で呼ばれても、同じように甘く香るのに」と。Pythonにおける変数はシンプルに値を保持します。(合理性のある範囲で)好きな名前で呼び出すことができます！

```py:Python
best_food = 'アイスクリーム'
best_food
```
```
Out[5]: 'アイスクリーム'
```

## 4) Print関数

DatabricksやJupyterノートブックでは、評価したセルの最後の行が自動でプリントアウトされます。

しかし、`print`関数を用いることで他のコンポーネントのプリントアウトを強制することができます。

```py:Python
print("やあ、一番好きな食べ物を教えてくれる？")
print(best_food)
```
```
やあ、一番好きな食べ物を教えてくれる？
アイスクリーム
```

また、プリントする内容をより明示的なものにすることができます。print関数の中に変数を追加することができます。また、同様に任意の文字列の中に変数を埋め込むこともできます。

```py:Python
print(f"{best_food}が地球で一番の食べ物です。")
```
```
アイスクリームが地球で一番の食べ物です。
```

## 5) リスト

皆さんが今朝食べた朝食のリストを作成してみましょう。

```py:Python
breakfast_list = ["パンケーキ", "卵", "ワッフル"]
```

リストに`牛乳`を追加して、リストを表示します。

```py:Python
breakfast_list.append("牛乳")
breakfast_list
```
```
Out[9]: ['パンケーキ', '卵', 'ワッフル', '牛乳']
```

リストの最初にある朝食の要素を取り出しましょう。

**注意:** Pythonでは全てが0ベースのインデックスとなりますので、最初の要素は0の場所に存在します。

```py:Python
breakfast_list[0]
```
```
Out[10]: 'パンケーキ'
```

リストから最後の朝食アイテムを取り出しましょう。いわゆるシンタックスシュガーで、`-1`の添え字で最後の要素にアクセスすることができます。

```py:Python
breakfast_list[-1]
```
```
Out[11]: '牛乳'
```

2つ目以降のアイテムが必要な場合にはどうすればいいのでしょうか？最初の添え字の後に`:`のみを記述します。`:`の後に添え字を記述すれば範囲指定となります。

```py:Python
breakfast_list[1:]
```
```
Out[12]: ['卵', 'ワッフル', '牛乳']
```

## 6) 条件文

時には、すべてのコードではなく、特定の条件に基づいて特定の行のみを実行したいと言うケースがあります。`if`、`elif`、`else`文を用いてこのような制御を行うことができます。

ここでは食べ物の複数形を表示したいものとします(`best_food`を他のものに変えてみてください)！ これを実現するは、単語の末尾に 's' がない場合にのみ、文字列の末尾に 's' を追加する必要があります。

```py:Python
best_food = "chocolate"

if best_food.endswith("s"):
  print(best_food)
else:
  print(best_food + "s")
```

chocolateの末尾には's'が無いので、's'が追加された状態で表示されます。
```
chocolates
```

以下のセルの `best_food` を変更して、3つの異なるアウトプットを確認してみてください。値に応じて表示される内容が変化します。

```py:Python
best_food = "アイスクリーム"
#best_food = ""
#best_food = "大福"
ice_cream_count = 1000

if best_food == "アイスクリーム":
  print(f"アイスクリームが {ice_cream_count} 個欲しいです。")
elif best_food == "":
  print("好きな食べ物を教えてください")
else:
  print("本当ですか？アイスクリームは好きではありませんか？")
```
```
アイスクリームが 1000 個欲しいです。
```

変数が等しいかどうかは `==` (等しい) あるいは `!=` (異なる) でチェックすることができます。

```py:Python
best_food == "アイスクリーム"
```
```
Out[15]: True
```

## 7) Forループ

今朝食べた朝食をすべてプリントしたい場合はどうしたらいいのでしょうか？

ループは順序に沿って、コードブロックを繰り返す手段です。("for-loop")

```py:Python
for food in breakfast_list:
  print(food)
```
```
パンケーキ
卵
ワッフル
牛乳
```

それぞれの単語に何文字含まれているのかをカウントしたい場合にはどうしたらいいのでしょうか？

```py:Python
for food in breakfast_list:
  print(f"{food} は {len(food)} 文字です。")
```
```
パンケーキ は 5 文字です。
卵 は 1 文字です。
ワッフル は 4 文字です。
牛乳 は 2 文字です。
```

## 8) 関数

上のコードは`breakfast_list`に対してのみ動作しますが、関数を作成することで別のリストに対応するように一般化することができます！`関数`は`def`キーワードの後に関数名、括弧無いに任意のパラメーター、そしてコロンを記述することで作成することができます。

```py:Python
# 一般的な構文
# def function_name(parameter_name):
#   関数が呼び出されるたびに実行されるコードブロック

# 関数の定義
def print_length(breakfast_list):
  for food in breakfast_list:
    print(f"{food} は {len(food)} 文字です。")

# print_lengthにリストを引き渡すことで関数を実行します
print_length(breakfast_list)
```
```
パンケーキ は 5 文字です。
卵 は 1 文字です。
ワッフル は 4 文字です。
牛乳 は 2 文字です。
```

## 9) 複数の引数を持つ関数

2つの値を加算する関数を定義してみましょう。

```py:Python
ice_cream_count = 1000
chocolate_count = 500

def count_fav_food(ice_cream, chocolate):
  return ice_cream + chocolate

count_fav_food(ice_cream_count, chocolate_count)
```
```
Out[19]: 1500
```

常に`chocolate`が500になることを知っている場合はどうでしょうか？デフォルト値を設定することができます！

```py:Python
def count_fav_food(ice_cream, chocolate=500):
  return ice_cream + chocolate

count_fav_food(ice_cream_count)
```
```
Out[20]: 1500
```

どのくらいチョコレートが好きなのかを定量化するために、チョコレートのパーセンテージを計算したいとしたらどうでしょうか？

```py:Python
def chocolate_percentage(ice_cream, chocolate):
  percentage = chocolate / (ice_cream + chocolate) * 100
  return round(percentage, 2)

percent = chocolate_percentage(ice_cream_count, chocolate_count)
print(f"私は {percent}% の確率でチョコレートが好きです。")
```
```
私は 33.33% の確率でチョコレートが好きです。
```

関数のパラメーターを忘れた場合には、`help()`を呼び出すことができます。

```py:Python
help(count_fav_food)
```
```
Help on function count_fav_food in module __main__:

count_fav_food(ice_cream, chocolate=500)
```


## 10) 型と型チェック

ここまでで数多くの変数を定義してきました。変数の型を忘れてしまった場合にはどうすればいいでしょうか？心配しないでください。いつでもチェックすることができます！

定義した変数は以下の通りです:

1. `percent`
1. `best_food`
1. `breakfast_list`

```py:Python
type(percent)
```
```
Out[23]: float
```

```py:Python
type(best_food)
```
```
Out[24]: str
```

```py:Python
type(breakfast_list)
```
```
Out[25]: list
```

型のまとめです:
1. `int` はPythonにおける数値の型です。整数値であり、小数を含まない数値全体となります。
1. `float` はPythonにおける数値の型です。基本的に小数を持つ値となります。 
1. `String` は、食べ物の`"チョコレート"`のように文字のシーケンスとなります。単語に限らず任意の文字列のシーケンスとなります。`"Hello123"` や `"123"` も文字列となります。これらは引用符で囲まれます。
1. `Boolean` は Ture か False の値を取ります。

そして、Databricksでは[変数エクスプローラ(Variable explorer)](https://qiita.com/taka_yayoi/items/b38fb466aeb0d23b805b)を用いることで、よりクイックに変数の型を確認することができます。
![Screenshot 2023-03-28 at 14.40.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f2362211-7f2a-8549-4a46-38ae108e43e0.png)


# DatabricksでPythonの開発を行う際の便利機能

Databricksのノートブックエディタでは、VSCodeで使用されているMonacoがサポートされており、オートコンプリートやPythonのフォーマッティング、マルチカーソルなどの[便利機能](https://qiita.com/taka_yayoi/items/266cf8f2d8891ce4f6ec)を活用することができます。以下のノートブックでウォークスルーしています。

https://github.com/taka-yayoi/public_repo_2/blob/master/python_webinar/Databricks%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8BPython%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E3%81%AE%E6%96%B0%E6%A9%9F%E8%83%BD.py

![autocomplete](https://github.com/RafiKurlansik/notebook2/blob/main/assets/autocomplete2.gif?raw=true)

<img src="https://github.com/RafiKurlansik/notebook2/blob/main/assets/blackformatter2.gif?raw=true" width="500"/>

[今さら聞けないPython \- pandasを用いたデータ分析](https://qiita.com/taka_yayoi/items/3bb88b204f47bdf091eb)に続きます。

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)