検索ガイド -Search Guide-

単語と単語を空白で区切ることで AND 検索になります。
例: python デコレータ ('python' と 'デコレータ' 両方を含む記事を検索します)
単語の前に '-' を付けることで NOT 検索になります。
例: python -デコレータ ('python' は含むが 'デコレータ' は含まない記事を検索します)
" (ダブルクオート) で語句を囲むことで 完全一致検索になります。
例: "python data" 実装 ('python data' と '実装' 両方を含む記事を検索します。'python data 実装' の検索とは異なります。)
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
>>
effective_python

【 Effective Python, 2nd Edition 】アンパックのちょっとした使い方 - 1: 一時変数を使わずにスワップする、2: インデックス番号を用いないでネストしている iterable の要素を取り出す - 投稿一覧へ戻る

Published 2020年6月10日16:03 by mootaro23

SUPPORT UKRAINE

- Your indifference to the act of cruelty can thrive rogue nations like Russia -

1: 次のようなリストをアルファベット順に並べ替えるとします( sort() を使っちゃダメですよ)。


friends = ['Hana', 'Yuka', 'Nana', 'Saki']



Python に馴染みが薄い方は、次のように一時変数を利用して入れ替えを行うと思います。


def bubble_sort(a):
for _ in range(len(a)):
for i in range(1, len(a)):
if a[i] < a[i - 1]:
temp = a[i]
a[i] = a[i - 1]
a[i - 1] = temp

bubble_sort(friends)
print(friends) # ['Hana', 'Nana', 'Saki', 'Yuka']



しかしアンパックを利用することで、一時変数を利用することなく2つの値をスワップさせることが可能です。


def bubble_sort2(a):
for _ in range(len(a)):
for i in range(1, len(a)):
if a[i] < a[i - 1]:
a[i - 1], a[i] = a[i], a[i - 1]

bubble_sort2(friends)
print(friends) # ['Hana', 'Nana', 'Saki', 'Yuka']



このアンパックを利用した値のスワップでは、
アンパック代入式の右辺 (a[i], a[i - 1]) が先に評価されて内部で自動的に作られる一時変数にセットされ、
続いて左辺の変数へ代入が行われます。そして最後に使用された一時変数は、そっと、消去されます。


2: ネストしている iterable からの要素の取り出しにアンパックを利用することで、コードがインデックス番号だらけになることを防ぐことができ、スッキリします。


次のようなタプルのリストを出力します。


grades = [('Nana', 90), ('Saki', 92), ('Yuka', 82)]



丁寧に記述すると次のようになるでしょうか。


for i in range(len(grades)):
item = grades[i]
name = item[0]
grade = item[1]

print(f"#{i + 1}: {name} は {grade} 点。")

#1: Nana は 90 点。
#2: Saki は 92 点。
#3: Yuka は 82 点。




でも、enumerate() の助けを借りながらアンパックを利用することで、インデックス番号を1つも記述せずに済んじゃいます。


for num, (name, grade) in enumerate(grades, 1):
print(f"#{num}: {name} は {grade} 点。")

#1: Nana は 90 点。
#2: Saki は 92 点。
#3: Yuka は 82 点。