毎日ちょっとPython ~ 4日目 ~

今日は関数についてです

関数の定義

def 関数名:
    #関数の内容を書く

という感じです。
実際にとっても簡単に書くと、

def hello():
    print('Howdy!')
    print('Howdy!!!')
    print('Hello there.')
hello()
hello()
hello()

で、実行結果はこんな感じ。

Howdy!
Howdy!!!
Hello there.
Howdy!
Howdy!!!
Hello there.
Howdy!
Howdy!!!
Hello there.

パラメータを持たせる

def hello(name):
    print('hello ' + name)
hello('SK3')
hello('すけさん')

まぁそんなにやりかたはかわらない。

戻り値とreturn文

returnで返します。
めんどくさい関数を作りました。

import random

def get_answer(answer_number):
   if answer_number == 1:
       return '確かにそうだ'
   elif answer_number == 2:
       return '間違いなくそうだ'
   elif answer_number == 3:
       return 'はい'
   elif answer_number == 4:
       return 'なんとも。もう一度やってみて'
   elif answer_number == 5:
       return '後でもう一度聞いて'
   elif answer_number == 6:
       return '集中してもういちどきいてみて'
   elif answer_number == 7:
       return '私の答えはノーです'
   elif answer_number == 8:
       return '見通しはそれほど良くない'
   elif answer_number == 9:
       return 'とても疑わしい'

r = random.randint(1,9)
fortune = get_answer(r)
print(fortune)

None値

Noneという値がある。
ほかのプログラミング言語だと null , nil , undefined

キーワード引数とprint()関数

キーワード引数はキーワードを指定することによって引数を識別する。
キーワード引数は、不要なら指定しなくてもよいオプション引数によく用いられます。

たとえば、 print() 関数には end と sep というオプション引数があり、それぞれ、通常の引数を表示した後に表示する文字列や、引数の間に表示する文字列を指定することができる。

例えば、

print('hello')
print('world')
print('hello',end='')
print('world')

みたいな感じで、endというキーワード引数に空文字を入れると文末の改行がなくなります。

hello
world
helloworld

区切り文字を指定する場合は、sepを使います。

print('dogs','cats','mice')
print('dogs','cats','mice',sep=',')

というように、sepに「,」を渡すことで以下の用の名結果にすることができます。

dogs cats mice
dogs,cats,mice

ローカルスコープとグローバルスコープ

1. ローカル変数はグローバルスコープからは使えない
2. ローカルスコープではほかのローカルスコープの変数を使えない
3. グローバル変数はローカルスコープから読むことができる

同じ名前のローカル変数とグローバル変数はどうなるんでしょうかね。

def spam():
   eggs = 'spam local'
   print(eggs)
def bacon():
   eggs = 'bacon local'
   print(eggs)
   spam()
   print(eggs)

eggs = 'global'
bacon()
print(eggs)

こんな感じの結果になります

bacon local
spam local
bacon local
global

複雑だから変数名はわけようね。スコープの説明をするのにはよさそう。

global文

関数の中からグローバル変数を変更したいときは、global文を使います。

def spam():
    global eggs
    eggs = 'spam'

eggs = 'global'
spam()
print(eggs)

結果は「spam」になります。

例外処理

例として、「ゼロによる除算」エラーの起こるでかきます。

def spam(divide_by):
   return 42 / divide_by

print(spam(2))
print(spam(12))
print(spam(0))
print(spam(1))

こんな感じの実行結果になります。

21.0
3.5
Traceback (most recent call last):
File "D:/Python/zeroDivide.py", line 6, in <module>
print(spam(0))
File "D:/Python/zeroDivide.py", line 2, in spam
return 42 / divide_by
ZeroDivisionError: division by zero(ゼロによる除算エラー:ゼロで除算した

0で割ろうとすると起こるエラーです。これにtryとexcept文で処理をすることができます。つまり、エラーが起きたけど、それ以降のプログラムが止まらないように記述を追加します。

def spam(divide_by):
   try:
       return 42 / divide_by
   except ZeroDivisionError:
       print('エラー:不正な引数です。')

print(spam(2))
print(spam(12))
print(spam(0))
print(spam(1))

こんな感じの結果になります

21.0
3.5
エラー:不正な引数です。
None
42.0

短いプログラム:数当てゲーム

# 数当てゲーム
import random
secret_number = random.randint(1,20)
print('1から20までの数を当ててください')

# 6回聞く
for guesses_taken in range(1,7):
   print('数を入力してください。')
   guess = int(input())

   if guess < secret_number:
       print('小さいです')
   elif guess > secret_number:
       print('おおきいです。')
   else:
       break #あたり

if guess == secret_number:
   print('あたり!' + str(guesses_taken) + '回で当たりました')
else:
   print('残念。正解は' + str(secret_number) + 'でした')

これ、数字以外を入力したときにエラーが出てしまうので直したほうがいいかも。したほうがいいかな...

最後に

面白いけど、まだPythonっぽくないな

この記事が気に入ったらサポートをしてみませんか?