Paiza Python入門編7: 関数を理解しよう

PaizaでPython3が完全無料なのでまとめました。

<a href="https://paiza.jp/works/python3/primer">Paiza Python3入門編</a>

##01:関数について学習しよう

```lesson.py
#printもtextも関数

#関数が値をを使った処理を行うことができる　
#その値を「引数」という 下記のprintの場合は"hello world"
#関数の中で処理した結果を「戻り値」として返されて変数などに代入することができる
print("hello world")

#inputであればキーボードから入力された値の文字列が「戻り値」となり変数にに代入できる
text=input()

```
<strong>関数の働き</strong><br>
・長いコードを分割して整理→見通しが良くなる<br>
・コードに名前をつけられる<br>
・コードを何度でも呼び出せる→再利用できる<br>
・コードを組み合わせられる<br>

##02:関数を作ろう

```lesson.py

# 関数を作る
#def=definition
def say_hello():
    print("hello world")
say_hello()

```

```text.txt
hello world
```

```lesson.py
# 関数を作る
#自分で関数を作ることができる
#def=definition
def say_hello():
    print("hello world")
say_hello()
say_hello()

```

```text.txt

hello world
hello world
```

##演習

1.関数を呼び出してみよう

```lesson.py
def say_hello():
    print("hello paiza")

# この下に関数呼び出しを記述する
say_hello()
```

```
hello paiza
```

2.関数を作成してみよう

```lesson.py

def say_hello():
    # この下に関数内の処理を記述する
    print("hello python")

say_hello()

```


##03:引数と戻り値を追加しよう

```lesson.py

前回のおさらい
def say_hello():
    print("hello world")
    
say_hello()


def sum():
    print(10+20)

sum()

#常に10+20を計算する関数があってもあまり役に立たない


#関数呼び出しに引数があると関数定義の(x)変数に渡される
#変数(x)を変えることで変化する関数を作る
def sum(x):
#def sum(変数):
    print( x + 20)

sum(30)

#2つの引数を持った関数
    print(x + y)
sum(3,2)

# 引数と戻り値を追加する

def sum(x,y):
    #関数定義に戻りとを設定する
    return x + y

#nu1変数に(return x + yが)格納される
num1=sum(3,4)
print(num1)
num1=sum(300,400)
print(num1)

```


##演習

1.掛け算関数を呼び出してみよう

```lesson.py
def multiply(x, y):
    return x * y

# この下に関数呼び出しを記述する
ans =multiply(3,4)
print(ans)

```

2.掛け算を作成してみよう

```lesson.py

# 掛け算関数を作成してみよう

def multiply(x, y):
    # この下に処理を記述する
    return x*y

print(multiply(3, 4))
print(multiply(5, 7))
print(multiply(12, 34))

```

3.九九の表を作成してみよう

```lesson.py

# 九九の表を作成してみよう

def multiply(x, y):
    return x * y

for step in range(1,10):
    for num in range(1, 10):
        print(multiply(step, num), end="")
        if num < 9:
            print(", ", end="")
    print("")
```

##04:スコープを理解しよう

```lesson.py


'''
#おさらい

def sum(x,y):
    return x + y

num = sum (3,2)
print(num)

'''

#今までも関数を呼び出す時に変数を使っていた
def sum(x,y):
    return x + y
    
a=10
b=30

num sum(a,b)
print(num)



#定義前に変しい書いても大丈夫
a=10
b=20
def sum(x,y):
    return x + y
    


num sum(a,b)
print(num)

```

```lesson.py
#たくさんの変数決めてしまい、間違えて重複しそうになっても、正常に動作しそうだが、
#変数の有効範囲が決まっていて「スコープ」と呼ぶ

a=10
b=20

def sum(x,y):
    a=3
    print("hello" + str(a))
    return x + y

num = sum(a,b)

print(num)


hello3
30

#スコープが中と外で別れているので
#問題なく値が出力される
#外側のa変数と内側のa変数は別物として扱われる
```

```lesson.py

ローカル変数とグローバル変数がある
ローカル変数・・・スコープあり
グローバル変数・・・どこでも利用できる


#messageがグローバル変数
message="paiza"
a=10
b=20

def sum(x,y):
    a=3
    
    #グローバル変数を変更する時は注意が必要
    #グローバル変数は関数の中からは参照だけ許可されていて、
    #代入や変更はこのままでは許可されない
    #変更する際はglobal messageを使う
    #global message
    #message +=  "paiza"
    print("hello" + str(a))
    return x + y

num = sum(a,b)

print(num)
#グローバル変数は関数定義の中でも外でも共通で使える
#関数定義で同じ名前の変数に値を代入しても自動的に別のローカル変数になり
#グローバル変数に影響を及ぼさない
print(message+ " " + str(a))
```

##演習

間違い探し

 ```lesson.py
 
 msg = "hello"

def say_hello():
    global msg
    msg += " "
    msg += "paiza"
    print(msg)

say_hello()

``` 

#05:RPGの攻撃シーンを作ろう
```lesson.py

# RPGの攻撃シーン

import random

def attack(enemy):
    print("勇者は"+ enemy + "を攻撃した")
enemies = ["スライム","モンスター","ドラゴン"]

for enemy in enemies:
    #print("勇者は"+ enemy + "を攻撃した")
    attack(enemy)
    
    #defのenemy変数とforのenemy変数はスコープが違っている
    
```



```lesson.py

#ランダムの値に合わせてクリティカルヒットを作ろう
import random

def attack(enemy):
    print("勇者は"+ enemy + "を攻撃した")
    hit =random.randint(1,10)
    #6以下の時に、普通にダメージ、そのほかはクリティカルヒット
    if hit <6:
        print(enemy + "に、" +str(hit) + "のダメージを与えた")
    else:
        print("クリティカルヒット!" + enemy+ "に100ダメージ与えた!")
enemies = ["スライム","モンスター","ドラゴン"]

for enemy in enemies:
    #print("勇者は"+ enemy + "を攻撃した")
    attack(enemy)
    
    #defのenemy変数とforのenemy変数はスコープが違っている
```

##演習

```lesson.py

def attack(person):
    print(person + "はスライムを攻撃した")

def output_ememy_hp(enemy_hp):
    print("敵のHPは残り" + str(enemy_hp) + "です")

enemy_hp = int(input())
team = {"勇者" : 200, "戦士" : 150, "魔法使い" : 100}

for person, power in team.items():
    attack(person)
    # 以下に、敵の体力を減少させるコードを書く
    enemy_hp -= power
    output_ememy_hp(enemy_hp)

出力

```
##06:引数のデフォルト値

```lesson.py

# 引数のデフォルト値
#引数を省略した場合に使えるデフォルト値

def introduce(name):
    print("私は"+name+"です")
    
introduce("勇者")

'''

出力
私は勇者です
```

```lesson.py
#特別な役割を持った人の時だけ引数をもらって
#それを使用し、引数なしの時は自動的に「村人」になる
#デフォルト値を使えば、それができる

#引数のデフォルト値が指定できるようになっていて、
#引数を省略して関数を呼び出すと、そのデフォルト値が使用される

#引数に村人を渡す
def introduce(name = "村人"):
    print("私は" + name+ "です。")

introduce("勇者")    
introduce()

出力
私は勇者です

私は村人です

```


```lesson.py

#デフォルト値を使うと、引数を省略省略した場合に自動的に
#初期値を指定することができる
#ただ、デフォルト値を引数に設定した関数があって、
#そこに新たに引数を追加したい場合位には注意が必要

def introduce(name = "村人",greeting):
    print("私は" + name+ "です。"+greeting)

introduce("勇者","こんにちは")    
introduce("こんにちは")


#上記を行うとエラーになる

#デフォルト値を設定したい引数はデフォルト値のない引数の後に書かないといけない
#なのでgreetingとnameを入れ替える

def introduce(greeting,name = "村人"):
    print("私は" + name+ "です。"+greeting)

introduce("勇者","こんにちは")    
introduce("こんにちは")

私はこんにちはです。勇者
私は村人です。こんにちは

```

```lesson.py
#可変長引数
#引数を受け取るが、どのくらいの引数の数か分からない時に使う
#試しにあいさつの内容を固定して、複数の人があいさつをするようにする

#関数の引数をnameから*(アスタリスク)namesに変えてデフォルト値の"村人"を削除"
def introduce(greeting,*names):
    #繰り返し処理を行う
    for name in names:
        print("私は" + name+ "です。"+greeting)

#(こんにちは→greeting,勇者、村人、兵士→*names)に入れられた
introduce("こんにちは","勇者","村人","兵士")

```

```lesson.py
#可変長引数-辞書
　　　＃**pepleに変更
def introduce(**peple):
    #繰り返し処理を行う name , greeting,inpep;e.imes()に変更
    for name,greeting in peple.items():
        print("私は" + name+ "です。"+greeting)
    print(peple)

#(こんにちは→greeting,勇者、村人、兵士→*names)に入れられた
introduce(hero="初めまして",villager="こんにちは",soldier ="よろしくお願い位します")

出力
私はhereです。初めまして
私はvillagerです。こんにちは
私はsoldierです。よろしくお願い位します
{'here': '初めまして', 'villager': 'こんにちは', 'soldier': 'よろしくお願い位します'}

```

##演習

1.引数のデフォルト値

```lesson.py

def say_hello(target = "paiza"):
    print("hello " + target)

# この下に関数呼び出しを記述する
say_hello()

```

2.RPGの戦闘シーン

```lesson.py
# enemiesを*enemiesにする
def battle(*enemies):
	for enemy in enemies:
		print("戦士は" + enemy + "と戦った")

battle("スライム", "モンスター", "ドラゴン")

```

##07:キーワード引数を理解しよう

```lesson.py

# キーワード引数

#引数を省略した場合は関数 
#greeting変数に「hello」,target変数に「world」が
#出力される
def say_hello(greeting = "hello",target="world"):
    print(greeting + " " + target)

#hello world
say_hello()

#greetingにこんにちは、taegetに皆さんが入っている状態
say_hello("こんにちは","皆さん")

#引数にデフォルト値をしようすると、呼び出す際の引数を省略できる
#greeting変数に入っていて、target変数は省略されている
#よってgood morning worldと出力される
say_hello("good morning")

#引数にラベルをつける「キーワード引数」というものがある
#ラベルをつけるので、代入ではないことに注意、一時的なもの
say_hello(greeting="こんにちは",target="皆さん")

#引数の順番を変えることもできる
say_hello(target="ネコ先生",greeting="おはようございます")

#「キーワード変数」にデフォルト値があれば、その引数を省略することも可能
say_hello(target="ネコ先生")
say_hello(greeting="おはようございます")

出力
hello world
こんにちは 皆さん
good morning world
こんにちは 皆さん
おはようございます ネコ先生
hello ネコ先生
おはようございます world
```

##演習

1.キーワード引数 その1

```lesson.py

期待する出力値
私は村人です

def introduce(name = "私は", role = "村人"):
    print(name + role + "です")

# この下に、必要な処理を記述する
introduce()

```

2.キーワード引数 その2

```lesson.py

私は戦士です

def introduce(name = "私は", role = "村人"):
    print(name + role + "です")

# この下に、必要な処理を記述する
introduce(role="戦士")

```