2강에서는 positional argument가 1개만 주어졌다면, 이제는 2개 이상의 positional arguments도 등장했다. 이런 경우 nargs='+' 로 지정해주면 1개 이상의 값을 불러와서 list로 만들어주기 때문에 편리하게 사용이 가능했다. --sorted와 같은 boolean flag을 이용해서 해당 list을 정렬할 것인지를 결정하는 방법도 수행했다. 기본적인 python 문법에 대한 이해가 있다면 책 내용을 보지 않고도 해답을 찾을 수 있었다.

필요한 개념들

  • list slicing
  • positional arguments 에서 nargs 사용법
  • if, elif, else

tmi. C++을 공부하다가 간만에 python을 잡았더니 습관적으로 else if 을 사용하게 된다ㅋㅋ 문제 없어보이는데 빨간줄이 가있길래 봤더니 elif로 사용해야 문제가 사라지더라. 참… 언어 왔다갔다리는 참 헷갈리…

추가적으로 책에서 설명하는 개념들

python list와 관련해서 더하고, 빼고, 바꾸는 method들에 대해 소개한다.

  1. 더하기 list.append() list.extend() list.insert()
  2. 슬라이싱 slicing list[a:b]
  3. 찾기 list.index(x)
  4. 제거하기 list.pop() list.remove()
  5. 정렬하기 list.sort() list.reverse() sorted(list) reversed(list)

코드 공유

picnic.py

#!/usr/bin/env python3
"""
Author : junha <junha@localhost>
Date   : 2024-02-20
Purpose: Rock the Casbah
"""

import argparse


# --------------------------------------------------
def get_args():
    """Get command-line arguments"""

    parser = argparse.ArgumentParser(
        description='Rock the Casbah',
        formatter_class=argparse.ArgumentDefaultsHelpFormatter)

    parser.add_argument('foods',
                        metavar='str',
                        nargs='+',
                        help='A positional argument')

    parser.add_argument('-s',
                        '--sorted',
                        help='Sort the items',
                        action='store_true')

    return parser.parse_args()


# --------------------------------------------------
def main():
    """Make a jazz noise here"""

    picnic = get_args()
    picnic_sort = picnic.sorted
    picnic_foods = picnic.foods

    if picnic_sort:
        picnic_foods = sorted(picnic_foods)

    """number of foods 1, 2, and more!"""
    if len(picnic_foods) == 1:
        print(f'You are bringing {picnic_foods[-1]}.')
    elif len(picnic_foods) == 2:
        print(f'You are bringing {picnic_foods[0]} and {picnic_foods[1]}.')
    else:
        print(f'You are bringing ' + ', '.join(picnic_foods[:-1]) + f', and {picnic_foods[-1]}' '.')

# --------------------------------------------------
if __name__ == '__main__':
    main()

예시 답안에서 배울 점

나의 경우 3개 이상의 음식을 다룰 때에는 print(f'You are bringing ' + ', '.join(picnic_foods[:-1]) + f', and {picnic_foods[-1]}' '.') 처럼 다루었는데, 답안에서는 마지막 항목을 items[-1] = 'and ' + items[-1]로 처리한 뒤에 join을 써버리더라. 이런 깔끔한 풀이 기억해둬야지!