Bardに助けてもらいながらpythonのコードをかいてみた

# はじめに
Bardが使えるようになった記念で、Bardにpythonコードの練習につきあってもらった。

# お題を出してもらう
## プロンプト文

```
Ｉ want to practice python programming, so please give me some simple programming problems.
```

出力結果が消えちゃってたので再度質問したら結果変わっちゃったけど、雰囲気だけ。
ちなみにこのときに「Create a function that adds two numbers together」っていうプログラムをお題にしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/98051a7b-5877-a436-b105-d5f6fb73ff74.png)

# プログラムを書く
## プロンプト文

```
write a sample proguram. Create a function that adds two numbers together.
```

この時紹介してもらったコードはコチラ

```Python
def add_two_num(num1, num2):
    return int(num1)+int(num2)

if __name__ == "__main__":
    num1 = input('input a num1: ')
    num2 = input('input a num2: ')
    print(add_two_num(num1, num2))
```

# 改良してもらう
２回入力するのは面倒、、なので、１行で書けるようにしたいと思ったので
入力例と出力例を伝えて改良をお願いした。
↑↑の質問の回答もらった後、立て続けに質問すれば
いちいちどんなコードを改良してほしいのかは説明しなくて済むのがコツ。

## プロンプト文

```
modify the program to match the input and output example. 

input example: input num1 & num2 ex:10,20
10,20

output example: 30
```

修正してもらったコードがこちら

```
def add_two_num(num1, num2):
    """
    this function adds two numbers together.
    Args:
        num1(int): the first number to add
        num2(int): the second number to add
    returns:
        int: the sum of the two numbers
    """
    return int(num1)+int(num2)

if __name__ == "__main__":
    nums = input('input num1,num2 ex:10,20\n')
    num1, num2 = nums.split(',')
    print(add_two_num(num1, num2))
```

# エラー処理を追加してもらう
数値以外の場合はエラーが出るようにしてほしかったのでお願いした

## プロンプト文

```
add input checking process. 

"""
nums = input("input num1, num2 ex:10,20\n") 
num1, num2 = nums.split(',')
"""
```

結果はコチラ

```
def add_two_num(num1, num2):
    """
    this function adds two numbers together.
    Args:
        num1(int): the first number to add
        num2(int): the second number to add
    returns:
        int: the sum of the two numbers
    """
    return int(num1)+int(num2)

if __name__ == "__main__":
    print(add_two_num(num1, num2))
    while True:
        try:
            nums = input("input num1, num2\n")
            n1, n2 = nums.split(',')
            n1 = int(n1)
            n2 = int(n2)
            break
        except ValueError:
            print("Please enter two valid integers separated by a comma.")

    print(add_two_numbers(n1, n2))
```

# テストコードを書いてもらう
だいぶいい感じになったのでテストコードを書いてもらった

## プロンプト文
どストレートにお願いした

```
Write the test code.
def add_two_numbers(num1, num2):.
    """
    This function adds two numbers together.

    Args: add_two_numbers(num1, num2): The first number to add.
        num1 (int): The first number to add.
        Args: num1 (int): The first number to add. num2 (int): The second number to add.

    Returns: int: The sum of the two numbers.
        int: The sum of the two numbers.
    """
    return num1+num2

if __name__ == "__main__":

    while True:: try
        try:.
            nums = input("input num1, num2\n")
            n1, n2 = nums.split(',')
            n1 = int(n1)
            n2 = int(n2)
            break
        except ValueError: print("Please enter two valid integers")
            print("Please enter two valid integers separated by a comma.")

    print(add_two_numbers(n1, n2))
```

回答はコチラ（ここから画像残ってたのでそのまま貼る）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/c46b9285-47b4-19c1-aac2-63063517b3a9.png)

教わったテストコードは"test_add_two_numbers.py"って名前にして、"add_two_numbers.py"と同じ階層に作成。
で、テスト実施。

```
python -m unittest test_add_two_numbers.py
```

# 異常系のテストケースを考えてもらう
よくみると提案してもらったコードはすべて正常系だったので異常系も考えてもらった

## プロンプト文

```
please write the test code for the anormaly system in add_two_numbers.py

add_two_numbers.py"""
def add_two_numbers(num1, num2):
    return num1+num2

if __name__ == "__main__":

    while True:
        try:
            nums = input("input num1, num2\n")
            n1, n2 = nums.split(',')
            n1 = int(n1)
            n2 = int(n2)
            break
        except ValueError:
            print("Please enter two valid integers separated by a comma.")

    print(add_two_numbers(n1, n2))
```

結果はコチラ。どさくさに正常系のテストが書き変わっちゃった…
あと、コードが長くなってきたので画像貼り付けられなかったのでコード転記した。

```
import unittest

from add_two_numbers import add_two_numbers


class TestAddTwoNumbers(unittest.TestCase):

    def test_add_two_numbers_with_valid_input(self):
        # Create two valid numbers.
        num1 = 1
        num2 = 2

        # Add the two numbers together.
        expected_sum = num1 + num2

        # Call the `add_two_numbers()` function.
        actual_sum = add_two_numbers(num1, num2)

        # Assert that the actual sum is equal to the expected sum.
        self.assertEqual(actual_sum, expected_sum)

    def test_add_two_numbers_with_invalid_input(self):
        # Create an invalid number.
        num1 = "a"

        # Call the `add_two_numbers()` function.
        with self.assertRaises(TypeError):
            add_two_numbers(num1, 2)

    def test_add_two_numbers_with_empty_input(self):
        # Create an empty input.
        nums = ""

        # Call the `add_two_numbers()` function.
        with self.assertRaises(ValueError):
            add_two_numbers(nums)


if __name__ == "__main__":
    unittest.main()
```

# 単体テストで失敗したケースを受けて、コードを修正してもらう
↑↑のtest_add_two_numbers_with_empty_inputが失敗した。入力内容が空のときにコードが対応していないのが原因。
ここまでくるとBardに全乗っかりで修正案を出してもらう。

## プロンプト文

```
Modify add_two_numbers.py by referring to the output results

output results""
@hogehoge ➜ /workspaces/python_practice/add_two_number (main) $ python -m unittest test_add_two_number.py 
E..
======================================================================
ERROR: test_add_two_numbers_with_empty_input (test_add_two_number.TestAddTwoNumbers)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/workspaces/python_practice/add_two_number/test_add_two_number.py", line 57, in test_add_two_numbers_with_empty_input
    add_two_numbers(nums)
TypeError: add_two_numbers() missing 1 required positional argument: 'num2'

----------------------------------------------------------------------
Ran 3 tests in 0.001s

FAILED (errors=1)
@hogehoge ➜ /workspaces/python_practice/add_two_number (main) $ 
"""

test_two_numbers.py"""
import unittest

from add_two_numbers import add_two_numbers


class TestAddTwoNumbers(unittest.TestCase):

    def test_add_two_numbers(self):
        self.assertEqual(add_two_numbers(1, 2), 3)
        self.assertEqual(add_two_numbers(-1, -2), -3)
        self.assertEqual(add_two_numbers(0, 0), 0)


if __name__ == "__main__":
    unittest.main()

import unittest

from add_two_numbers import add_two_numbers


class TestAddTwoNumbers(unittest.TestCase):

    def test_add_two_numbers_with_valid_input(self):
        # Create two valid numbers.
        num1 = 1
        num2 = 2

        # Add the two numbers together.
        expected_sum = num1 + num2

        # Call the `add_two_numbers()` function.
        actual_sum = add_two_numbers(num1, num2)

        # Assert that the actual sum is equal to the expected sum.
        self.assertEqual(actual_sum, expected_sum)

        # Various other cases
        self.assertEqual(add_two_numbers(1, 2), 3)
        self.assertEqual(add_two_numbers(-1, -2), -3)
        self.assertEqual(add_two_numbers(0, 0), 0)

    def test_add_two_numbers_with_invalid_input(self):
        # Create an invalid number.
        num1 = "a"

        # Call the `add_two_numbers()` function.
        with self.assertRaises(TypeError):
            add_two_numbers(num1, 2)

    def test_add_two_numbers_with_empty_input(self):
        # Create an empty input.
        nums = ""

        # Call the `add_two_numbers()` function.
        with self.assertRaises(ValueError):
            add_two_numbers(nums)


if __name__ == "__main__":
    unittest.main()
"""

add_two_numbers.py"""
def add_two_numbers(num1, num2):
    return num1+num2

if __name__ == "__main__":

    while True:
        try:
            nums = input("input num1, num2\n")
            n1, n2 = nums.split(',')
            n1 = int(n1)
            n2 = int(n2)
            break
        except ValueError:
            print("Please enter two valid integers separated by a comma.")

    print(add_two_numbers(n1, n2))
"""
```

回答がこちら。
こんな長文を受け入れるBardハンパないな、って思いました。
ちなみにこれが今回の最終形になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/c30c0c29-a405-3ca8-ecb4-cf2baf60a778.png)

# おわりに
Bardのお試しも兼ねたpythonコードの練習は一旦おわり。
自分の印象は、Bardは、ChatGPT+Bing AIみたいな感じで、英語しかダメっていうところ以外はかなりイケてる。
でも、今後のことを考えるとほぼ英語でプログラム書いてるようなもんだから、英語で質問するようにした方がいいんだろうなって思うようになりました。