PYTHON Day4

MMM._.MMM·2025년 4월 24일

Day4

오늘은 랜덤모듈, 오프셋, list, IndesError, 중첩목록 작업에 대해서 배우고 가위바위보 미니프로젝트?를 배웁니다.

1. Randomisation(랜덤 모듈)

파이썬의 random모듈은 난수(무작위 수) 생성과 관련된 다양한 함수와 기능을 제공하는 내장 모듈입니다.
이 모듈을 사용하면 임의의 수를 생성하거나 리스트, 시퀀스 요소를 무작위로 섞거나 선택할 수 있습니다.
Python에서 기본적으로 사용하는 의수난수 생성 알고리즘에 대해서 자세히 알고싶다면 WIKIPEDIA의Mersenne Twister
에서 알아볼 수 있습니다.
파이썬 공식문서에서 rnadom모듈에 대한 정보들이 있으므로 확인할 수 있습니다.

모듈이 정확히는 뭘까요?
대부분 코드를 같은 페이지에 스크립트 스타일로 작성을 하는데요
위에서부터 아래로 모든 코드가 실행이 되죠 하지만 때때로 코드가 너무 길어집니다. 그 이유는 복잡한 것들을 생성하려고 하기 때문인데 이럴때 사람들은 코드를 각각의 모듈로 나눠서 사용합니다.

2. List

list는 여러개의 값을 하나의 변수에 순서대로 저장할 수 있는 자료형중 하나입니다. 리스트는 로 생성하며 각각의 요소는 ,로 구분합니다.
리스트에는 숫자, 문자, 불리언, 다른 리스트등 다양한 자료형을 한 리스트에 담을 수 있습니다.
그래서 list는 데이터 구조라고도 합니다.
list를 예를 든다면 한국이라는 list안에 서울, 인천, 수원, 대전, 포항, 대구, 부산등등 여러지에을 한국이라는 list안에 담은것을 의미합니다.

// list 구조
korea = ["서울", "인천", "수원"]

// list안에 다양하게 들어갈 수 있다.
seoul = ["대림", "논현", "신촌"]
deajeon = ["관저", "갈마", "봉명"]
busan = ["범일", "부암", "개금"]

korea = [seoul, deajeon, busan, 1, 10, 300, True, False]

출력:
[['대림', '논현', '신촌'], ['관저', '갈마', '봉명'], ['범일', '부암', '개금'], 1, 10, 300, True, False]

list의 특징

인덱싱

해당 리스트의 특정 데이터를 얻고 싶을 때 아래의 이미지와 같이하면됩니다.

인덱싱할때 중요한것은 인덱스는 정수, 슬라이스로 작성해야합니다.

  • 정수 인덱스:
    리스트의 특정 위치의 요소에 접근할 때 사용합니다.
예시)
list[1], list[-1]
  • 슬라이스(slicing):
    범위를 지정해서 여러요소를 한번에 가져올때 사용합니다.
예시)
list[1:5], list[:-1], list[::2]
  • list안의 list속 특정 데이터 가져오는 방법
    중첩인덱스를 사용하면 됩니다.
예시)
korea = [seoul, deajeon, busan, 1, 10, 300, True, False]
print(korea[2][0])
출력:
범일

작동방식은 korea라는 list의 2번째인 busan을 가져오고 busan이라는 list안에 0번째인 범을을 가져옵니다.

list(append)

append를 사용해서 list의 끝에 데이터를 추가하는 방법입니다.

seoul = ["대림", "논현", "신촌"]
deajeon = ["관저", "갈마", "봉명"]
busan = ["범일", "부암", "개금"]

korea = [seoul, deajeon, busan, 1, 10, 300, True, False]

korea.append(0)

출력:
[['대림', '논현', '신촌'], ['관저', '갈마', '봉명'], ['범일', '부암', '개금'], 1, 10, 300, True, False, 0]

list(데이터 변경)

list안에 있는 특정 데이터를 변경하는 방법입니다.
간단하게 특정데이터와 변경할려는 데이터가 같다고 속이는 것이라고 생각하면됩니다.

seoul = ["대림", "논현", "신촌"]
deajeon = ["관저", "갈마", "봉명"]
busan = ["범일", "부암", "개금"]

korea = [seoul, deajeon, busan, 1, 10, 300, True, False]

korea[3] = 12345

출력:
[['대림', '논현', '신촌'], ['관저', '갈마', '봉명'], ['범일', '부암', '개금'], 12345, 10, 300, True, False]
/// 1 => 12345로 바뀜

데이터 자료 구조에 대해서 더 알고 싶다면파이썬 공식문서에서 확인할 수 있습니다.
파이썬 공식문서를 확인하면 위 글에 있는 변경하거나 추가하는 기능 외에도 다양한 기능들이 있기에 한번씩 읽어보는걸 추천드립니다.
파이썬도 그렇지만 다른 언어든 개발관련지깃은 끝이 없습니다.
모든 기능들을 외운다기보다는 한번씩보고 필요할 때 생각이 날 정도만 하는 것이 좋다고 봅니다.

Code Challenge

friends list안에 있는 이름들을 랜덤으로 출력할 수 있게하시오

import random

friends = ["Alice", "Bob", "Charlie", "David", "Eve"]

#1 random choice를 사용해서 이름을 랜덤으로 출력하는 방법
print(random.choice(friends))
#2 randint를 사용해서 범위설정으로 이름을 랜덤으로 출력하는 방법
print(friends[random.randint(0, 4)])

randint를 사용하는 것보다는 choice를 사용하는게 깔끔하고 쉽지만
사용을 choice와 randint는 어떻게 사용하느냐의 차이인것 같습니다.

둘의 기능은 비슷해도 차이는 있으니

IndexError

목록을 가지고 작업할 때 가장 흔한 오류는 IndexError입니다.

IndexError의 간단한 예시)
friends = ["Alice", "Bob", "Charlie", "David", "Eve"]
print(len(friends))
list의 목록(아이템)의 개수는 5개라고 뜸

print(friend[5])

IndexError 발생

위 예시와 같이 진행을 했을 때 IndexError가 발생하는 이유는 간단합니다.
friend의 list안의 아이템은 5이지만 프로그래밍(또는 개발자) 관점에서는 0부터 시작을 합니다. 5(포함)이상으로는 존재하지 않는 위치의 아이템을 불러올려는 것이기에 IndexError가 발생하는 것입니다.

Rock Scissors Paper Project

강의영상에서는 간단하게 진행하는 가위바위보게임 인데 코드?기능?을 약간 추가했습니다.
for문 추가해서 게임을 최대 100번까지 연속으로 할수 있게 진행을 했으며 for문을 사용했기에 중간에 사용자가 그만하고 싶을때 탈출을 할수있게 한판 끝이 날때마다 더 할것인지 물어보고 입력받는 기능을 추가했습니다.
그리고 POINT를 추가해서 약간의 재미?요소를 추가했습니다. +한번이라도 지면 거기서 게임 끝 ㅎㅎ

import random

rock_art = ("""
        _______
      ---' ____)
            (_____)
            (_____)
            (____)
      ---.__(___)
        """)

scissors_art = ("""
        _______
      ---' ____)____
                ______)
             __________)
            (____)
     ---.__(___)
""")

paper_art = ("""
          _____
      ---' ____)____
                ______)
                _______)
             _______)
    ---.__________)
""")

ascii_arts = [rock_art, scissors_art, paper_art]
game = ["rock", "scissors", "paper"]

print("Welcome to the Rock, Paper, Scissors Game!\n만약 당신이 한번이라도 진다면 점수는 다 사라집니다.")

point = 0

for _ in range(100):
    user = input("What do you choose? Type 0 for rock, 1 for scissors, 2 for paper\n")

    if user not in ["0", "1", "2"]:
        print("잘못된 입력입니다. 0, 1, 2 중에서 선택하세요.")
        continue

    # 인덱스 값으로 변환
    user_idx = int(user)
    computer_idx = random.randint(0, 2)

    # 사용자, 컴퓨터의 가위바위보 결과물 출력
    print(f"\nYou chose:\n{ascii_arts[user_idx]}")  # ascii_arts에서 user_idx = 인덱스 값
    print(f"Computer chose:\n{ascii_arts[computer_idx]}")   # ascii_arts에서 computer_idx = 인덱스 값

    # 인덱싱 값이 같을시
    if user_idx == computer_idx:
        print("무승부!\n")
        continue
    if (user_idx - computer_idx) % 3 == 1:
        point += 1
        print(f"You Win!\n+1 POINT\n당신의 점수: {point} POINT!")
        answer = input("한판 더 하시겠습니까? (Y/N): ")
        # 한번 더 할지 사용자에게 물어봄 Y가 아닐시 게임 종료
        if answer.upper() != "Y":
            print(f"게임 종료!\n최종 점수: {point} POINT!")
            break
        else:
            continue
    else:
        point = 0
        print(f"You Lose....\n{point} POINT...\nbye..")
        print("게임이 종료됩니다.")
        break

6.7%완....

profile
아....평화롭게 오카네모찌 되고JOB다...

0개의 댓글