# Python - Function(1) 上課用
###### tags: `Python講義`
## 1 絵を描いてください(no function)

:::spoiler
```python=
# 1
for i in range(3):
for k in range(i*2+1):
print("* ", end = "")
print()
for i in range(4):
for k in range(i*2+1):
print("* ", end = "")
print()
for i in range(5):
for k in range(i*2+1):
print("* ", end = "")
print()
# 2
for i in range(3):
print("* "*(i*2+1), end = "")
print()
for i in range(4):
print("* "*(i*2+1), end = "")
print()
for i in range(5):
print("* "*(i*2+1), end = "")
print()
# 3
for i in range(1, 6, 2):
print("* " * i)
for i in range(1, 8, 2):
print("* " * i)
for i in range(1, 10, 2):
print("* " * i)
:::
## 引数と戻り値が無い関数
一緒に開発するのは簡単
:::spoiler
```python=
def fun1():
for i in range(3):
for k in range(i*2+1):
print("* ", end = "")
print()
def fun2():
for i in range(4):
for k in range(i*2+1):
print("* ", end = "")
print()
def fun3():
for i in range(5):
for k in range(i*2+1):
print("* ", end = "")
print()
fun1()
fun2()
fun3()
```
:::
## 引数のある関数
元のプログラムを見て、類似点と相違点を見つけてください
* 相違点:

:::spoiler
```python=
n = 3
for i in range(n):
for k in range(i*2+1):
print("* ", end = "")
print()
n = 4
for i in range(n):
for k in range(i*2+1):
print("* ", end = "")
print()
n = 5
for i in range(n):
for k in range(i*2+1):
print("* ", end = "")
print()
```
:::
同じ部分を関数に変換し、変数をパラメーターに変換します
:::spoiler
```python=
def fun(n):
for i in range(n):
for k in range(i*2+1):
print("* ", end = "")
print()
fun(3)
fun(4)
fun(5)
```
:::
for ver.
:::spoiler
```python=
def fun(n):
for i in range(n):
for k in range(i*2+1):
print("* ", end = "")
print()
for i in range(3, 6):
fun(i)
```
:::
## 引数を指定する
入力がない場合はエラーが発生します
エラーを回避するためにパラメーターを指定します(ポカヨケ)
```python=
def repeat_msg(msg, repeat):
print(msg * repeat)
repeat_msg('Hello ')
```

## 自動お酒販売ロボット

###

```python
def osake_is_ok(age):
if age >= 20 :
print("osake OK")
else:
print("osake NO")
age = int(input("age: "))
print("Age: {}".format(age))
osake_is_ok(age)
#osake_is_ok() # error
```
```python
def osake_is_ok(a = 20):
print("Age:{}".format(a))
if a >= 20 :
print("osake OK")
else:
print("osake NO")
osake_is_ok(25)
osake_is_ok(19)
osake_is_ok()
```
```python
def osake_is_ok(a = 0):
print("Age:{}".format(a))
if a >= 20 and a!= 0:
print("osake OK")
else:
print("osake NO")
osake_is_ok(25)
osake_is_ok(19)
osake_is_ok()
```
## 戻り値のある関数
```python
def re_add(a, b):
sum = a + b
return sum
a = int(input("a = "))
b = int(input("b = "))
ab_sum = re_add(a, b)
print("{} + {} = {}".format(a, b, ab_sum))
```
### bool
```python=
def osake_is_ok(age):
if age >= 20 :
return True
else:
return False
def osake_is_ok_2(age):
flag = False
if age >= 20 :
flag = True
return flag
age = 20
print("Age: {}".format(age))
if osake_is_ok(age) :
print("osake OK")
else:
print("osake NO")
if osake_is_ok_2(age) :
print("osake OK")
else:
print("osake NO")
```
## 『ローカル変数』と『グローバル変数』
この2つの定義の違いをプログラムで示しましょう。次のプログラムは、グローバル変数「x」とローカル変数「y」を定義したものです。
```python=
def print_y():
y = 100 # ローカル変数
print("y:", y)
x = 50 # グローバル変数
print("x:", x)
print_y()
```
『ローカル変数』と『グローバル変数』 というものの違いは何かというと、定義する場所なのです。

『ローカル』と『グローバル』、この2つの変数の違いは、ものすっごい大事です。
### 引数のある関数
関数以外の変数を使用する場合は、パラメーターとして渡す必要があります
```python
def fun():
s = sum(range(1, n+1))
return s
n = int(input("n:"))
print("1 ~ {}: {}".format(n, fun()))
```

```python
def fun():
n = 10 # xxx
s = sum(range(1, n+1))
return s
n = int(input("n:"))
print("1 ~ {}: {}".format(n, fun()))
```

```python
def fun(n):
s = sum(range(1, n+1))
return s
n = int(input("n:"))
print("1 ~ {}: {}".format(n, fun(n)))
```
## 関数内の関数を使用する
次の機能が存在するプログラムを作成してください。(なるべく機能毎に関数にすること)
- 機能1:ユーザーに数値を入力させ、指定した段数のみを表示できるようにすること
- 機能2:九九掛け算表の全てを表示させること
「3.End」は、「End」と表示し終了すること
```
1.九九を 1 行だけ表示する 2.九九表 3.End
Please select function(機能を選択してください): 2
1*1= 1 2*1= 2 3*1= 3 4*1= 4 5*1= 5 6*1= 6 7*1= 7 8*1= 8 9*1= 9
1*2= 2 2*2= 4 3*2= 6 4*2= 8 5*2=10 6*2=12 7*2=14 8*2=16 9*2=18
1*3= 3 2*3= 6 3*3= 9 4*3=12 5*3=15 6*3=18 7*3=21 8*3=24 9*3=27
1*4= 4 2*4= 8 3*4=12 4*4=16 5*4=20 6*4=24 7*4=28 8*4=32 9*4=36
1*5= 5 2*5=10 3*5=15 4*5=20 5*5=25 6*5=30 7*5=35 8*5=40 9*5=45
1*6= 6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 7*6=42 8*6=48 9*6=54
1*7= 7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 8*7=56 9*7=63
1*8= 8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 9*8=72
1*9= 9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
1.九九を 1 行だけ表示する 2.九九表 3.End
Please select function(機能を選択してください): 1
生成する数の九九を入力してください: 7
1*7= 7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 8*7=56 9*7=63
1.九九を 1 行だけ表示する 2.九九表 3.End
Please select function(機能を選択してください): 1
生成する数の九九を入力してください: 3
1*3= 3 2*3= 6 3*3= 9 4*3=12 5*3=15 6*3=18 7*3=21 8*3=24 9*3=27
1.九九を 1 行だけ表示する 2.九九表 3.End
Please select function(機能を選択してください): 3
End
```
### 機能: 九九表を表示する

:::spoiler
```python
def all_99():
for i in range(1, 10):
for j in range(1, 10):
print("{}*{}={:>2}".format(i, j, i*j), end = " ")
print()
all_99()
```
:::
### 機能:九九を 1 行だけ表示する

:::spoiler
```python
def row_99(n):
for i in range(1, 10):
print("{}*{}={:>2}".format(n, i, i*n), end = " ")
print()
n = int(input("Input n: "))
row_99(n)
:::
#### 九九表 - function
```python=
row_99(1)
row_99(2)
row_99(3)
row_99(4)
row_99(5)
row_99(6)
row_99(7)
row_99(8)
row_99(9)
```
#### 九九表 - for
```python=
def all_99():
for i in range(1, 10):
row_99(i)
print()
all_99()
```
:::spoiler
```python
# function
def row_99(n):
for i in range(1, 10):
print("{}*{}={:>2}".format(n, i, i*n), end = " ")
print()
def all_99():
for i in range(1, 10):
row_99(i)
print()
# main
while True:
print("1.九九を 1 行だけ表示する 2.九九表 3.End")
select = int(input("Please select function(機能を選択してください): "))
if select == 1:
n = int(input("生成する数の九九を入力してください: "))
row_99(n)
elif select == 2:
all_99()
elif select == 3:
print("End")
break
```
:::
### ex 的延伸
```python=
def message(count):
s = ""
if count == 0:
s = "I'm still among you. Game have just begun."
elif count == 1:
s = "How much blood will you shed to stay alive?"
elif count == 2:
s = "Game over.\n--Trapped--"
return s
def fun(s):
s = "*** " + s + " ***"
return s
answer = "pig"
count = 0
print("「Live or die, make your choice.」")
while count < 3:
guess = input("Take a guess : ")
if guess == answer:
print("You must meet death in order to be reborn. Congratulations")
break
string = fun(message(count))
print(string)
count+=1
```