AWS Cloud9でPython基礎

2022/4/6(水)に行われたAWSセミナー「Pythonの基礎から学ぶ!サーバーレス開発はじめの一歩」で学んだPython基礎部分の復習。

# 1.AWS Cloud9セットアップ
Cloud9を起動。適当に名前を付けて他はすべてデフォルト値でCloud9を起動する。

# 2.Python基礎
Pythonの以下トピックについて学ぶ。

- データ型
- 関数
- モジュール
- 引数とパラメータ

## 2-1.データ型
データ型は以下4種。

- 文字列型
- 整数型
- 辞書型
- リスト型

Cloud9の画面下部Terminalでpythonを実行できるので、`python`と打ち込んで対話モードにしておく。
```
$ python
Python 3.7.10 (default, Jun  3 2021, 00:02:01) 
[GCC 7.3.1 20180712 (Red Hat 7.3.1-13)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
```
`>>>`の先に打ち込んでいく。

### 2-1-1.文字列型（str）
二重引用符でも一重引用符でも構わない。
- 二重引用符の中で一重引用符を使いたいとき
- 一重引用符の中で二重引用符を使いたいとき

に使用する。
```
>>>str1 = "It's showtime!!"
>>>str2 = 'str形の中で"二重引用符"が使える。'
>>>print(str1)
It's showtime!!
>>>print(str2)
str形の中で"二重引用符"が使える
```
変数の中身が文字列型の場合、`+`でつなげて出力できる。
```
>>>first_name = "Trou"
>>>last_name = "Tanaka"
>>>print(last_name + first_name)
TanakaTrou
>>>print(last_name + " " + first_name)
Tanaka Trou
```

### 2-1-2.整数型（int）
整数型（integer）。
```
>>>int1 = 50
>>>sentence = "The total comes to:"
print(sentence + str(int1))
```
文字列型と整数型を同時に出力する場合、上記のように整数型を文字列型に変換する。

### 2-1-3.辞書型（dict）
辞書型（dictionary）はキー（Key）と値（Value）のペア。
APIからの応答はJSON形式で帰ってくることが多く、辞書型はよく使う。
```
>>>user1 = {"first_name" : "Jiro"}
>>>print(user1)
{'first_name': 'Jiro'}
```
値の追加。
```
>>>print(user1["first_name"])
Jiro
>>>user1["family_name"] = "Suzuki"  
>>>print(user1)
{'first_name': 'Jiro', 'family_name': 'Suzuki'}
```
値の更新。
```
>>>user1["first_name"] = "Saburo"
>>> print(user1)
{'first_name': 'Saburo', 'family_name': 'Suzuki'}
```

### 2-1-4.リスト型
カンマ区切りの値の連続。
```
>>>num = [0,1,2,3]
>>>fruit = ["apples","oranges","blueberries"]
>>>print(num)
[0, 1, 2, 3]
>>> print(fruit)
['apples', 'oranges', 'blueberries']
>>>print(fruit[1])
oranges
>>>fruit[0] = "bananas" 
>>> print(fruit)
['bananas', 'oranges', 'blueberries']
```

Cloud9でPythonの対話型モードを終了するには`Ctr+d`を押す。

## 2-2.関数
### 関数とは
処理を定義したもの。
引数を受け取って関数で処理し、戻り値を返す。

Pythonには以下関数がある。
- ユーザー定義関数：自分で定義して使う関数
- 組み込み関数：[もともと組み込まれていてすでに使える関数（print()など）](https://docs.python.org/ja/3/library/functions.html)

### 2-2-1.Cloud9で関数を作成する
Cloud9画面上部で「New File」をクリックして新しいファイルを開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/eb98ed4b-5160-8585-b38c-2841ec622ec8.png)
[File]-[Save]をクリックし、「hello_world.py」と名前をつけて保存すると、Python形式でファイルの編集ができるようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/085fb181-d06f-e83e-4f93-725f77d2bd74.png)
以下のようにファイルを編集して保存する。

```py:hello_world.py
# Hello World!!を表示する関数
def hello_world():
    print('Hello World!!')
    
# 関数'hello_world'を呼ぶ
hello_world()
```

Cloud9画面下部のTerminalで`python hello_world.py`と入力し実行すると、`hello_world.py`が実行され、Pythonファイルに書かれたhello_world関数の実行結果が返ってくる。
```
$ python hello_world.py 
Hello World!!
```
### 2-2-2.戻り値を持つ関数を作成する
`hello_world.py`を以下のように変更し上書き保存する。

```py:hello_world.py
# Hello World!!を表示する関数
def hello_world():
    return 'Hello World!!'
    
# hello_world()関数を変数に代入する
greeting = hello_world()
print(greeting)
```

再度`hello_world.py`を実行すると、変数`greeting`の値が返ってくる。

## 2-3.モジュール
Pythonでは、他のファイルに書かれた関数などの定義を読み込むことができる。このファイルをモジュールという。モジュールは以下の種類がある。

- 自作モジュール
  - ユーザ自身で作成する
- 標準モジュール
  - すでにPythonに同梱されている ⇒[Python 標準ライブラリ](https://docs.python.org/ja/3/library/index.html)
- 外部モジュール
  - [The Python Package Index (PyPI)](https://pypi.org/)に登録されているモジュール。
  - [pipコマンド](https://pip.pypa.io/en/stable/)でインストールできる

### 2-3-1.自作モジュールを作って呼び出す
以下`module1.py`という新しいファイルを作成し保存する。

```py:module1.py
# こんにちは！を返す関数
def hello_world():
    return 'こんにちは！'
```

モジュールを読み込んで実行するファイルを作成する。
以下`use_module1.py`という新しいファイルを作成し保存する。

```py:use_module1.py
import module1

greeting = module1.hello_world()
print(greeting)
```

Cloud9下部のTerminalで`use_module1.py`を実行する。
```
$ python use_module1.py
こんにちは！
```

### 2-3-2.外部モジュールBoto3を利用する
外部モジュールの一つであるBoto3を利用する。
Boto3をCloud9環境にインストールする。
```
$ pip install boto3
```
`Successfully installed boto3-x.xx.xx botocore-x.xx.xx s3transfer-x.x.x`と表示されたらインストール完了。pipでインストールしたモジュールはローカルに保存される。保存場所は`pip show <モジュール名>`で確認できる。
```
$ pip show boto3
Name: boto3
Version: 1.21.37
Summary: The AWS SDK for Python
Home-page: https://github.com/boto/boto3
Author: Amazon Web Services
Author-email: None
License: Apache License 2.0
Location: /home/ec2-user/.local/lib/python3.7/site-packages
Requires: jmespath, s3transfer, botocore
Required-by:
```

#### 余談：pip freeze
`pip freeze`コマンドで、環境にインストールされたすべてのパッケージが表示できる。
コードがほかの環境で実行されるとき、同じパッケージがインストールされた環境を整えるために、`pip freeze`コマンドの実行結果を`requirements.txt`に書き出しておく。
```
$ pip freeze > requirements.txt
```
他の環境で`requirements.txt`に記載されたパッケージをすべてインストールするには以下コマンドを実行すればよい。
```
pip install -r requirements.txt
```

### 2-3-3.Amazon Translateを使う

Cloud9からPythonでAmazon Translateを使う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/228b7715-be3b-200d-a110-3a97319b715f.png)

[Boto3 Amazon Translate](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/translate.html)のドキュメントを参照する。boto3パッケージ内の「Translate」サービスを見る。「Client」セクションに、PythonでAmazon Translateを使用する方法が記載されている。今回は`translate_text()`メソッドを使用する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/23e69960-7331-36b7-7f72-ea8179408e9a.png)

`translate_text()`メソッドの項目に飛ぶと、「Request Syntax（リクエスト構文）」という項目がある。`translate_text()`メソッドはこのような構文で使えることがここからと読み取れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/92e084c1-24e6-77cc-79ca-99e8d517efff.png)

「Parameters」セクションを見ると、「[REQUIRED]（必須）」パラメータが3つあることが読み取れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/328332b1-6d1c-bfdc-5271-13df2b3c4df3.png)
今回は以下パラメータを使う。
- Text (string) --[REQUIRED]
- SourceLanguageCode (string) --[REQUIRED]
- TargetLanguageCode (string) --[REQUIRED]

`SourceLanguageCode` と `TargetLanguageCode` にどんな値を入れるかは[Supported languages and language codes(サポートされている言語とコード)](https://docs.aws.amazon.com/translate/latest/dg/what-is.html)を確認する。
今回は英語（en）⇒日本語（ja）に翻訳する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/884256b8-c141-f5e2-59f9-9b66baaa0021.png)

新規で以下`intro_to_boto3.py`というファイルを作成する。

```py:intro_to_boto3.py
# boto3パッケージを使うように指定する
import boto3

# boto3パッケージ内のどのサービスを使用するか指定する
client = boto3.client('translate')

# honyaku関数の宣言
def honyaku():
    
    # translate_text()メソッド項目の「Request Syntax（リクエスト構文）」を参考に、パラメータを指定する
    response = client.translate_text(
        Text='I want to be able to use Python!', # 翻訳したい英文を入力する
        SourceLanguageCode='en', # 元の言語コード
        TargetLanguageCode='ja'  # 翻訳した後の言語コード
        )
    # honyaku()関数はここまで
    
    # honyaku()関数の中にある変数 response の内容を出力 
    print(response)

# honyaku()関数の呼び出し
honyaku()
```

Cloud9画面下部のTerminalで`intro_to_boto3.py`を実行すると、以下出力が得られる。
```
$ python intro_to_boto3.py 
{'TranslatedText': 'Pythonを使えるようになりたい！', 'SourceLanguageCode': 'en', 'TargetLanguageCode': 'ja', 'ResponseMetadata': {'RequestId': '197b19a8-5d4a-4855-9ef6-07933269a686', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amzn-requestid': '197b19a8-5d4a-4855-9ef6-07933269a686', 'cache-control': 'no-cache', 'content-type': 'application/x-amz-json-1.1', 'content-length': '115', 'date': 'Sun, 10 Apr 2022 10:35:49 GMT'}, 'RetryAttempts': 0}}
```
[Response Syntax（応答構文）](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/translate.html#Translate.Client.translate_text)を参照すると、`client.translate_text()`がdict型（辞書型）でデータを返すことがわかる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/c2125882-737b-7ce7-7515-a110eac45300.png)
出力の`'TranslatedText': 'Pythonを使えるようになりたい！'`の部分が、翻訳されて帰ってきた日本語。

## 2-4.引数とパラメータ
### 引数・パラメータの定義
関数は以下のように定義されるが、（）内で定義された値をパラメータという。
`Variable`がパラメータにあたる。

```py:関数の例
def function_name(Variable):
```

実際に関数に渡す値を引数と呼ぶ。上記関数を呼び出す際`function_name(5)`などの値で呼び出すが、この`5`が引数にあたる。

### 2-4-1.位置引数
Cloud9で以下の`positional_arguments.py`ファイルを作成し保存する。

```py:positional_arguments.py
# boto3パッケージを使うように指定する
import boto3

# honyaku関数の宣言
def honyaku(text, source_language_code, target_language_code): #位置引数をここで定義
    # boto3パッケージ内のどのサービスを使用するか指定する
    client = boto3.client('translate') #関数宣言前に書いてもいいし、関数内に書いてもいいらしい
    # translate_text()メソッド項目の「Request Syntax（リクエスト構文）」を参考に、パラメータを指定する
    response = client.translate_text(
        Text=text, # 位置引数text
        SourceLanguageCode=source_language_code, # 位置引数source_language_code
        TargetLanguageCode=target_language_code  # 位置引数target_language_code
        )
    # honyaku()関数はここまで
    
    # honyaku()関数の中にある変数 response の内容を出力 
    print(response)

# honyaku()関数の呼び出し
honyaku('I want to be able to use Python!', 'en', 'ja') # 指定した順序で引数の値を書く
```

`positional_arguments.py`を実行すると、以下結果が得られる。

```
$ python positional_arguments.py 
{'TranslatedText': 'Pythonを使えるようになりたい！', 'SourceLanguageCode': 'en', 'TargetLanguageCode': 'ja', 'ResponseMetadata': {'RequestId': '5aef7251-7242-4675-a52d-6b70ea01053c', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amzn-requestid': '5aef7251-7242-4675-a52d-6b70ea01053c', 'cache-control': 'no-cache', 'content-type': 'application/x-amz-json-1.1', 'content-length': '115', 'date': 'Sun, 10 Apr 2022 11:38:33 GMT'}, 'RetryAttempts': 0}}
```

関数宣言の際、
`def honyaku(text, source_language_code, target_language_code):`
で定義した順番通りに、最後の関数呼び出しで
`honyaku('I want to be able to use Python!', 'en', 'ja')`
と指定している。以下のようにパラメータと引数が対応して、翻訳結果が返ってきている。
- `text='I want to be able to use Python!'`
- `source_language_code='en'`
- `target_language_code='ja'`

### 2-4-2.キーワード引数
キーワード引数は、関数に渡される名前と値のペアのことを指す。
位置引数で渡された値の順序が間違っているとエラーや予期しない動作が発生してしまうが、キーワード引数は任意の順序で渡すことができる。

`positional_arguments.py`を、キーワード引数を使って呼び出す。
`positional_arguments.py`を以下のように変更する。

```py:positional_arguments.py
import boto3

def honyaku(text, source_language_code, target_language_code):

    client = boto3.client('translate') 

    response = client.translate_text(
        Text=text, 
        SourceLanguageCode=source_language_code, 
        TargetLanguageCode=target_language_code  
        )

    print(response)
    
# キーワード引数を使ってhonyaku関数を呼び出す
honyaku(text='I want to be able to use Python!', source_language_code='en', target_language_code='ja') 
```

`positional_arguments.py`を実行すると、以下結果が得られる。

```
$ python positional_arguments.py 
{'TranslatedText': 'Pythonを使えるようになりたい！', 'SourceLanguageCode': 'en', 'TargetLanguageCode': 'ja', 'ResponseMetadata': {'RequestId': '657ad6d4-1577-44f6-a62c-585df11b391e', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amzn-requestid': '657ad6d4-1577-44f6-a62c-585df11b391e', 'cache-control': 'no-cache', 'content-type': 'application/x-amz-json-1.1', 'content-length': '115', 'date': 'Sun, 10 Apr 2022 11:51:10 GMT'}, 'RetryAttempts': 0}}
```

# 参考

https://docs.python.org/ja/3/library/functions.html

[AWS Cloud9でPython基礎](https://qiita.com/emiki/items/65eb26492be5315d929d)
[AWS Cloud9でPython基礎～ファイルの読み書き](https://qiita.com/emiki/items/f93bddb4a1fd76b102b5)
[AWS LambdaでPython基礎](https://qiita.com/emiki/items/5daa0e31b8a8fa7c680a)
[AWS Cloud9でPython基礎～Amazon S3を利用する](https://qiita.com/emiki/items/7433971c9f1ee03dd9ea)
[AWS Cloud9でPython基礎～Amazon S3とAmazon Translateを利用する](https://qiita.com/emiki/items/b95fad815d9f8e360dd0)
[AWS LambdaでPython基礎～Amazon S3とAmazon Translateを利用する](https://qiita.com/emiki/items/0f9bbddd6f4cd475f12b)