見出し画像

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の制御フローも佳境です。ここを終えてモジュールやクラスに繋げていきます。

明日は「・位置引数のタプル化」から。



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