Python資格取得への道のり 6日目
・range関数
連続した数を出力する際、for文やwhile文で出力することができるが、
例えば0~9までの数字を出力するならfor文とrange関数を使用すると良い
for i in range(10):
print(i)
# → 0
# → 1
# → 2
# → 3
# → 4
# → 5
# → 6
# → 7
# → 8
# → 9
・最初の数値を指定することも可能
range(最初の数値, 最後の数値)
for i in range(2, 5):
print(i)
# → 2
# → 3
# → 4
・3個ずつ飛ばした形で出力したい
range(最初の数値, 最後の数値, いくつずつ飛ばすか)
for i in range(2, 10, 3):
print(i)
# → 2
# → 5
# → 8
・繰り返し同じ出力をする際に使用する関数=range関数
※_(アンダースコア)でも反復できる
for _ in range(10):
print('Hello')
# → Hello
# → Hello
# → Hello
# → Hello
# → Hello
# → Hello
# → Hello
# → Hello
# → Hello
# → Hello
・enumerate関数
自動的にインデックスをつけることができる
下記の例では、enumerate関数なしの場合とenumerate関数ありの場合で確認
【enumerate関数なし】の場合
i = 0
for fruits in ['apple', 'banana', 'orange']:
print(i, fruits)
i += 1
# → 0 apple
# → 1 banana
# → 2 orange
【enumerate関数あり】の場合
for i, fruits in enumerate(['apple', 'banana', 'orange']):
print(i, fruits)
# → 0 apple
# → 1 banana
# → 2 orange
・zip関数
複数のリストの最初のインデックス[0]を組み合わせて出力したい
【zip関数なし】の場合
days = ['Mon', 'Tue', 'Wed']
fruits = ['apple', 'banana', 'orange']
drinks = ['coffee', 'tea', 'beer']
for i in range(len(days)):
print(days[i], fruits[i], drinks[i])
# → Mon apple coffee
# → Tue banana tea
# → Wed orange beer
【zip関数あり】の場合
days = ['Mon', 'Tue', 'Wed']
fruits = ['apple', 'banana', 'orange']
drinks = ['coffee', 'tea', 'beer']
for day, fruit, drink in zip(days, fruits, drinks):
print(day, fruit, drink)
# → Mon apple coffee
# → Tue banana tea
# → Wed orange beer
・辞書をfor文で処理する
辞書にはitemsメソッドがあり、キーと値を同時に出力することができる
d = {'x': 100, 'y': 200}
print(d.items())
for k, v in d.items():
print(k, ':', v)
# → dict_items([('x', 100), ('y', 200)])
# → x : 100
# → y : 200
その理由として、「d.items()」は「[('x', 100), ('y', 200)]」を返している。
リストの中にタプルを定義しているため、下記となる。
for k, v in [('x', 100), ('y', 200)]
あとは、タプルのアンパッキング(上記の例では「kにはx」を「vには100」を入れている)で出力を返している。
・関数定義
関数定義には「def」を使用する
※「=」は使用しない。'( )'(パレンティス)が必要。
def say_something():
print('Hi')
say_something()
# → Hi
・型の確認と変数に代入しても使用できる
def say_something():
print('Hi')
print(type(say_something))
f = say_something
f()
# → <class 'function'>
# → Hi
・returnを返すということ
def say_something():
s = 'hi'
return s
print(say_something())
# → hi
printで出力する内容は「say_something()」であり、「say_something()」を実行すると「s」という値をreturn(返す)ということである。
さらに「s」は'hi'になるため、結果的に「say_something()」は'hi'を返し、printされる。
・関数と引数
def what_is_this(color):
print(color)
what_is_this('blue')
# → blue
「what_is_this」という関数を行う際に「blue」という引数を「color」に渡し、color(現在はblue)をprintされるため、blueが出力される。
条件分を追加し、色に応じて指定した値を返すようにプログラミングする。
関数定義を行うことで、何度も何度も同じコードを書かなくて済む
def what_is_this(color):
if color == 'red':
return 'apple'
elif color == 'yellow':
return 'banana'
else:
return 'some fruit'
print(what_is_this('blue'))
# → some fruit
print(what_is_this('red'))
# → apple
print(what_is_this('yellow'))
# → banana
・関数内での型の指定
誤って異なる型を入れてもpythonはエラーを返してくれないので注意。
def add_num(a: int, b: int) -> int:
return a + b
print(add_num('a', 'b'))
print(type(add_num(10, 20)))
# → ab
# → <class 'int'>
例えば、数値をしているのに文字を指定してもエラーとして返してくれない。
・位置引数とキーワード引数とデフォルト引数
複数の引数を持つ関数について順序が重要となる。
【位置引数】 場所によっては間違いが起こる
def menu(entree, drink, dessert):
print(entree)
print(drink)
print(dessert)
menu('pork', 'beer', 'ice')
# → pork
# → beer
# → ice
menu('pork', 'ice', 'beer')
# → pork
# → ice drinkなのにiceが入っている
# → beer dessertなのにbeerが入っている
【キーワード引数】
def menu(entree, drink, dessert):
print('entree =', entree)
print('drink =', drink)
print('dessert =', dessert)
menu(entree='pork', dessert='ice', drink='beer')
# → entree = pork
# → drink = beer
# → dessert = ice
例え、「def menu(entree, drink, dessert):」と「menu(entree='pork', dessert='ice', drink='beer')」の順序が違ったとしても出力結果は問題なく返ってくる。
【デフォルト引数】
def menu(entree='beef', drink='wine', dessert='ice'):
print('entree =', entree)
print('drink =', drink)
print('dessert =', dessert)
menu()
# → entree = beef
# → drink = wine
# → dessert = ice
関数定義の際に引数を定義指定しまうことをデフォルト引数。
これをさらに変更することもできる。
def menu(entree='beef', drink='wine', dessert='ice'):
print('entree =', entree)
print('drink =', drink)
print('dessert =', dessert)
menu(entree='chicken', drink='beer')
# → entree = chicken
# → drink = beer
# → dessert = ice
・デフォルト引数の注意点
デフォルト引数に対してはリストや辞書は使用しないこと。
例として
xとyに関して、1回1回他の値を定義して対応することで期待通りの値を返してくれる。
def test_function(x, l=[]):
l.append(x)
return l
y = [1, 2, 3]
x = 100
print(test_function(x,y))
# → [1, 2, 3, 100]
y = [4, 5, 6]
x = 200
print(test_function(x,y))
# → [4, 5, 6, 200]
しかし立て続けに関数を呼び出すことは、期待通りの値を返さないこともありプログラムのバグへと繋がる。
そのため、デフォルト引数ではリストや辞書は使用しない
def test_function(x, l=[]):
l.append(x)
return l
print(test_function(100))
print(test_function(200))
# → [100]
# → [100, 200]
解決策として
def test_function(x, l=None):
if l is None:
l = []
l.append(x)
return l
print(test_function(100))
print(test_function(200))
# → [100]
# → [200]
test_function()関数が呼び出されるたびに「l」にNoneを入れ、さらにif文で「l = []」を入れることによって新たなリストを作成できる。
リストや辞書をデフォルト引数で入れたい場合は、デフォルト引数で定義せず「None」を代入し、上記のようなif文を追加することで期待通りの出力をしてくれる
今日はここまで!
段々難しくなってきましたが、まだまだついていけます。
まずはセクション9の入門終了まではこなしていきます。
セクション5の制御フローも佳境です。ここを終えてモジュールやクラスに繋げていきます。
明日は「・位置引数のタプル化」から。