Python boot camp by Dr.Angela day10

#Function with Output
自分で定義した関数からの出力はどうやってgetするのか？という話。下記のようにreturnでどういう値をoutputとして出力するか定義、return 〇〇には定数でも変数でもどちらでも指定可能。

```python3
def my_function():
  return 300/3
my_function()

def my_function2():
  a = int(input("Which number do you like? "))
  b = int(input("How old are you? "))  
  return a/b
my_function2()
#上記はいずれもmy_function(),my_function2()という関数の出力をprintしているわけではないので、呼び出しても質問以外
#返ってこない。出力内容を見たいのなら以下のようにprint()で挟む。

def my_function3():
  a = int(input("Which number do you like? "))
  b = int(input("How old are you? "))  
  return a/b
print(my_function3())

#出力内容
How old are you? 25
Which number do you like? 5
5.0

def translate_name(firstname,surname):
  f = firstname.title()           #title()は先頭文字のみ大文字にしてくれるモジュール
  s = surname.title()
  return f"{f} {s}"              
print(translate_name("haNakO","YAmAda"))

#出力結果
Hanako Yamada
```
こんなこともできる。元のプログラムをなるべくいじらずに、lastname,firstname変数に何を入れるかだけいじることで実現可能。

```python3:translator1.py
def translate_name(lastname,firstname):
  l=lastname.title()
  f=firstname.title()
  return f"{l} {f}"

print(translate_name(input("What is your first name? "),input("What is your last name? ")))

#出力結果
What is your first name? haNako
What is your last name? YamADA
Hanako Yamada
```
上記の場合、何もinputしなかったら、出力結果には何も表示されないが、プログラムがどうなっているのか目視できた方がバグ修正などしやすいので、きちんと文章が出力されるようにしておくべき。

```python3:translator2.py
def translate_name(lastname,firstname):
  if lastname == "" or firstname == "":
    return f"Invalid inputs..." 
  l=lastname.title()
  f=firstname.title()
  return f"{l} {f}"        #ちなみに、returnでその関数を抜けるので、return以降に
  print("terrible")        #なにか処理を書いても無視される！

print(translate_name(input("What is your first name? "),input("What is your last name? ")))

#出力結果_なにもinputしなかった場合
What is your first name? 
What is your last name? 
Invalid inputs...
```

#Docstring 
関数の説明を格納してくれる「""" ～ """」で囲う文字列のこと。コメントアウト「#」と異なり、自分で作成した関数my_function()でも、組み込み関数helpで索引から引くことが可能。お～めっちゃ便利！詳細はこちら→ https://blog.pyq.jp/entry/Python_kaiketsu_191114


```python3
def my_function():
...     """ my_funciton()はワイが作成した次世代暗号化プログラムです"""
...

>>>help(my_function)
Help on function foo in module __main__:

my_function()
    my_function()はワイが作成した次世代暗号化プログラムです
```

##Mission>> Calulator program


```python3:art.py
logo = """
 _____________________
|  _________________  |
| | Pythonista   0. | |  .----------------.  .----------------.  .----------------.  .----------------. 
| |_________________| | | .--------------. || .--------------. || .--------------. || .--------------. |
|  ___ ___ ___   ___  | | |     ______   | || |      __      | || |   _____      | || |     ______   | |
| | 7 | 8 | 9 | | + | | | |   .' ___  |  | || |     /  \     | || |  |_   _|     | || |   .' ___  |  | |
| |___|___|___| |___| | | |  / .'   \_|  | || |    / /\ \    | || |    | |       | || |  / .'   \_|  | |
| | 4 | 5 | 6 | | - | | | |  | |         | || |   / ____ \   | || |    | |   _   | || |  | |         | |
| |___|___|___| |___| | | |  \ `.___.'\  | || | _/ /    \ \_ | || |   _| |__/ |  | || |  \ `.___.'\  | |
| | 1 | 2 | 3 | | x | | | |   `._____.'  | || ||____|  |____|| || |  |________|  | || |   `._____.'  | |
| |___|___|___| |___| | | |              | || |              | || |              | || |              | |
| | . | 0 | = | | / | | | '--------------' || '--------------' || '--------------' || '--------------' |
| |___|___|___| |___| |  '----------------'  '----------------'  '----------------'  '----------------' 
|_____________________|
"""
```

```python3:cal0.py
from art import logo
print(logo)

def cal(a,b,c):
  if b == "+":
    return a + c
  elif b == "-":
    return a - c
  elif b == "*":
    return a * c
  elif b == "/":
    return a / b
  else:
    return "Invalid operation"

f = float(input("Input the first number>> "))
o = input("Input the opetation>> ")
s = float(input("Input the second number>> "))
result = cal(f,o,s)
print(result)

while not input("Again?[yes/no] ") == "no":
  f = result                           #ここらへんo,sは省略できるかと思ったけどできなかった
  o = input("Input the operation>> ")  #whileの中は前回のo,sは持ってこれないのか...?
  s = float(input("Input the second number>> ")) 
  print(cal(f,o,s))
else:
  pass

#出力結果
Input the first number>> 3.9
Input the opetation>> *
Input the second number>> 3
11.7
Again?[yes/no] 
Input the operation>> +
Input the second number>> 10
21.7
```

```python:cal1.py
#while not以降からこっちでもOK
AGAIN = True            #True/False:この書き方は覚えておくこと！
while AGAIN:
 f = result
 o = input("Input the operation>> ")
 s = fl
 print(cal(f,o,s))
 if input("Again? [yes/no] ") == "yes":
   f == answer
 else:
   AGAIN = False
```
dictionaryを用いると、以下のように記述される。

```python3:cal2.py
from art import logo
print(logo)

def add(a,b):
  return a + b
def minus(a,b):
  return a - b
def multiple(a,b):
  return a * b
def division(a,b):
  return a / b

operation = {
  "+": add,
  "-": minus,
  "*": multiple,
  "/": division,
}

f = float(input("Input the first number>> "))
s = float(input("Input the second number>> "))
for i in operation:
  print(i)
o = input("Select operation here>> ")

calculator = operation[o]
answer = calculator(f,s)
print(f"{f} {o} {s} = {answer}")
```
ここで、printでもいいようなところをあえてreturnでコードする意味について考えてみる。
###★returnを用いるメリット
・前回の結果を用いて次の処理を行いたいとき、有用！
※returnが使えない(=printのみ使用する)と、いちいち前回の結果を変数として持ってこないといけないので汎用性に乏しくなる