1. Basic Usages

이전 장에서도 배웠듯이 파이썬에도 if, for, while이 있다. 특히 파이썬은 자료구조형과 밀접하게 연계되어 자료구조에 들어있는 자료들에 대해 쉽게 반복문을 실행할 수 있다. 제어문의 기본 용법과 편리하게 쓸 수 있는 다양한 문법들을 배워보자. if, for, while의 기본 용법은 다음과 같다.

if condition1:
	statements_when_condition1_is_true
elif condition2:
	statements_when_condition2_is_true
else:
	statements_when_no_condition_is_true

for elem in something_iterable:
	statements_to_process_elem

while condition:
	statements_while_condition_is_true

마블과 DC의 영웅들아니고 돈벌이 캐릭터if, for, while의 기본 용법을 배워보자.

marvel_heroes = ["iron man", "thor", "hulk", "spider man", "black widow", "capt. america", "capt. marvel"]
dc_heroes = ["batman", "superman", "aquaman", "wonder woman", "harley quinn"]
all_heros = marvel_heroes + dc_heroes

myhero = "batman"
if myhero in marvel_heroes:
    print(f"{myhero}: Avengers are super cool!")
elif myhero in dc_heroes:
    print(f"{myhero}: We save martha...")
else:
    print(f"{myhero}: We are villains!!")

print("list of marvel heroes")
for hero in marvel_heroes:
    print(f"    {hero}")

print("list of dc heroes")
for i in range(len(dc_heroes)):
    print(f"{i})  {dc_heroes[i]}")

i = 0
print("DC's male heroes ends with 'man'")
while i < len(dc_heroes) and dc_heroes[i].endswith('man'):
    print(f"    {dc_heroes[i]}")
    i += 1

2. 반복문 제어: continue, break

반복문을 돌리다 보면 조건에 따라 중간에 처리를 건너뛰고 싶거나 그만두고 반복문을 종료하고 싶을 때가 있다. continue는 반복문에서 continue 이후의 과정을 건너뛰고 다음 loop으로 넘어가는 것이고, break는 반복문 자체를 끝낸다.

print("list of marvel heroes")
for hero in marvel_heroes:
    if hero.startswith("spider"):
        print("    Peter Parker by Tobey Maguire was not a kid: \"With great power comes great responsibility.\"")
        continue
    if hero.startswith("capt"):
        print("    One captain is enough. let me stop here")
        break
    print(f"    {hero} is cool")

name = None
print("Press 'q' to quit")
while name != 'q':
    print("type dc hero's name")
    name = input()
    if name == 'q':
        break
    if name not in dc_heroes:
        print(f"{name} is not dc hero")
        continue
    index = dc_heroes.index(name)
    print(f"{name}'s index =", index)

3. for 응용: enumerate, zip

파이썬에서는 while보다 for문의 활용법이 다양하다. 대표적으로 enumerate, zip이 있다. enumeratefor문에서 리스트를 반복할 시 원소 뿐만 아니라 인덱스도 받을 수 있는 반복 객체를 만들어 준다. zip은 두 개의 리스트를 묶어서 각 리스트의 원소가 하나씩 합쳐진 튜플의 반복 객체를 만들어준다. 이들을 리스트로 변환해보면 무엇을 주는지 명확히 볼 수 있다.

print("\nwhat does enumerate return?", enumerate(marvel_heroes))
print(list(enumerate(marvel_heroes)))
print("what does zip return?", zip(marvel_heroes, dc_heroes))
print(list(zip(marvel_heroes, dc_heroes)))
print("print only first 3 heroes with index")
for index, name in enumerate(marvel_heroes):
    if index >= 3:
        break
    print("marvel hero:", index, name)

print("print pairs of marvel and dc heroes")
for mv, dc in zip(marvel_heroes, dc_heroes):
    print("{} vs {}".format(mv, dc))

print("\nprint only 3 pairs of marvel and dc heroes")
for ind, (mv, dc) in enumerate(zip(marvel_heroes, dc_heroes)):
    if ind >= 3:
        break
    if ind % 2 == 1:
        print("{0} vs {1}: {0} win!".format(mv, dc))
    else:
        print("{0} vs {1}: {1} win!".format(mv, dc))

4. List Comprehension

리스트를 다루다 보면 다른 리스트에 기반해서 새로운 리스트를 만들거나 기존 리스트에서 필요한 것만 걸러서 새로운 리스트를 만들고 싶을 때가 있다. 일단 위에서 배운 내용을 토대로 이를 구현해보자.

print("\ncreate a new list from the existing list")
super_heroes = []
for hero in marvel_heroes:
    super_heroes.append(hero + "_super")
print("super heroes", super_heroes)

print("\nextract a subset of the existing list")
man_heroes = []
for hero in marvel_heroes:
    if hero.endswith("man"):
        man_heroes.append(hero)
print("man heroes:", man_heroes)

파이썬에는 리스트를 선언하는 [] 안에 for문을 넣어 저 두 개의 for문을 한 줄로 처리하는 방법이 있는데 이를 list comprehesion이라고 한다.

# [process item for item in list]
print("\ncreate a new list by list comprehension")
super_heroes = [hero + "_super" for hero in marvel_heroes]
print("super heroes", super_heroes)

print("\nextract a subset by conditioned list comprehension")
man_heroes = [hero for hero in marvel_heroes if hero.endswith("man")]
print("man heroes:", man_heroes)

print("\nsquare of integers")
int_square = [i ** 2 for i in range(10)]
print(int_square)

list comprehension은 앞에 간단한 처리과정을 넣어서 다양하게 쓰일 수 있고 다중 for문이 들어갈 수도 있다. 이러한 기능을 list만 쓸 수 있는 건 아니고 dictionaryset에도 적용될 수 있다.

print("\ndictionary comprehension")
abilities = ["suit", "Mjölnir", "physical power", "spider web"]
heroes = {name: power for name, power in zip(marvel_heroes, abilities)}
print("hero's ability", heroes)