Python 초급 학습 과제: 변수, 조건문, 반복문 마스터하기

1. 컴파일 언어와 인터프리터 언어의 차이점

컴퓨터는 고급 프로그래밍 언어를 직접 이해하지 못하고, 오직 기계어만을 실행할 수 있습니다. 따라서 고급 언어로 작성된 프로그램을 실행하려면 이를 기계어로 변환하는 과정이 필수적이며, 이 변환 방식에 따라 크게 두 가지로 나뉩니다.

컴파일 언어 (Compiled Language)

컴파일러(Compiler)라는 특별한 도구를 사용하여, 소스 코드 전체를 한 번에 해당 플랫폼의 기계어로 번역합니다. 번역된 결과는 실행 가능한 파일(예: Windows의 .exe) 형태로 생성됩니다.

핵심 특징:

  • 실행 전에 전체 코드를 기계어로 미리 변환하므로, 이후 실행 시 추가 변환 작업 없이 바로 실행됩니다.
  • 실행 속도가 매우 빠릅니다. (한 번 번역된 결과를 반복 사용)
  • 특정 운영체제나 하드웨어에 종속적이어서, 다른 플랫폼으로의 이식이 어렵습니다.
  • 대표적인 언어: C, C++, Go, Rust, Swift

인터프리터 언어 (Interpreted Language)

인터프리터(Interpreter)라는 도구가 소스 코드를 한 줄씩 읽어 즉시 기계어로 번역하고 실행합니다.

핵심 특징:

  • 실행할 때마다 코드를 한 줄씩 번역하고 실행하므로, 컴파일 언어보다 실행 속도가 느립니다.
  • 해당 플랫폼에 맞는 인터프리터만 있으면 어디서든 동일한 코드를 실행할 수 있어 이식성이 뛰어납니다.
  • 별도의 컴파일 과정 없이 바로 실행 가능하여 개발 및 테스트가 빠릅니다.
  • 대표적인 언어: Python, JavaScript, Ruby, PHP, Perl

2. Python 스크립트 실행 방법

Python 코드를 실행하는 방법은 두 가지입니다.

인터프리터 대화형 모드

터미널(또는 명령 프롬프트)에서 python 또는 python3 명령어를 입력하면 대화형 셸이 실행됩니다. 이 상태에서 코드를 한 줄씩 입력하면 즉시 결과를 확인할 수 있습니다.


# Windows / macOS / Linux
python
# 또는
python3

참고: 위 명령어를 실행하면 >>> 프롬프트가 나타납니다.

스크립트 파일 실행

코드를 .py 확장자로 저장한 후, 터미널에서 파일 이름을 인자로 전달하여 실행합니다.


# hello.py 파일 내용
print("안녕하세요, Python!")

# 실행 명령어
python hello.py

3. 주석 처리 방법

코드에 설명을 추가하거나 특정 코드를 실행에서 제외할 때 사용합니다.

  • 한 줄 주석: # 기호를 사용하며, 해당 줄의 # 이후 내용은 모두 무시됩니다.
    # 이 줄은 주석입니다.
    print("실행됩니다.") # 이 부분도 주석입니다.
  • 여러 줄 주석: 작은따옴표 3개(''') 또는 큰따옴표 3개(""")로 감싸서 사용합니다. 둘 간의 기능적 차이는 없습니다.
    '''
    이것은
    여러 줄
    주석입니다.
    """
    이것도
    여러 줄
    주석입니다.
    """

4. 불리언(Boolean) 타입의 값

Python에서 참(True)과 거짓(False)을 나타내는 데이터 타입입니다. 조건문 등에서 매우 중요하게 사용됩니다. 다음 값들은 bool() 함수로 평가했을 때 False를 반환하며, 이를 제외한 모든 값은 True로 간주됩니다.

  • False
  • None
  • 숫자 0 (정수, 실수 등 모든 형태의 0)
  • 빈 문자열: ""
  • 빈 리스트: []
  • 빈 튜플: ()
  • 빈 딕셔너리: {}
  • 빈 세트: set()

5. 변수 명명 규칙

변수 이름을 지을 때는 다음 규칙을 반드시 따라야 합니다.

  • 첫 글자는 반드시 문자(영문, _)로 시작해야 하며, 숫자로 시작할 수 없습니다.
  • 이름은 영문자, 숫자, 밑줄(_)만 사용할 수 있습니다. (공백이나 특수문자 사용 불가)
  • Python의 예약어(Keywords)는 변수 이름으로 사용할 수 없습니다. (예: if, for, class, import 등)
  • 대소문자를 구분하므로 myVarmyvar는 서로 다른 변수입니다.

권장하는 네이밍 컨벤션:

  • 모듈 및 패키지: 소문자, 단어 사이는 밑줄 (my_module)
  • 클래스: 각 단어의 첫 글자를 대문자로 (PascalCase, MyClass)
  • 일반 변수 및 함수: 소문자, 단어 사이는 밑줄 (snake_case, my_variable)
  • 상수: 모든 글자를 대문자, 단어 사이는 밑줄 (MAX_COUNT)
  • 내부(Internal) 변수: 밑줄 하나로 시작 (_internal_var)
  • 클래스 내부에서 외부 접근을 제한하려는 변수: 밑줄 두 개로 시작 (__private_var)
  • 특수 메서드(매직 메서드): 밑줄 두 개로 시작하고 끝남 (__init__). 사용자 정의시 이 형태는 피해야 합니다.

6. 변수의 메모리 주소 확인

id() 내장 함수를 사용하면 변수가 가리키는 객체의 고유한 메모리 주소(정수)를 반환받을 수 있습니다.

x = 10
print(id(x))  # 예: 140735276387728

7. 사용자 로그인 구현 (3회 재시도)

사용자로부터 이름과 비밀번호를 입력받아, 미리 정의된 사용자 목록과 비교합니다. 3번의 기회가 주어집니다.

import time

valid_users = ['seven', 'alex']
correct_password = '123'

attempts = 0
max_attempts = 3

while attempts < max_attempts:
    attempts += 1
    username = input("사용자 이름을 입력하세요: ")
    password = input("비밀번호를 입력하세요: ")

    if username in valid_users and password == correct_password:
        print("로그인 성공!")
        break
    else:
        if attempts == max_attempts:
            print("3회 실패했습니다. 프로그램을 종료합니다.")
            time.sleep(1)
        else:
            print(f"로그인 실패. 남은 기회: {max_attempts - attempts}번")

8. 반복문 연습 문제

다음 세 가지 문제를 while 반복문을 사용하여 해결하는 코드입니다.

# 1. 2-3+4-5+6...+100 의 합계 계산
def calculate_alternating_sum():
    total = 0
    number = 2
    while number <= 100:
        if number % 2 == 0:  # 짝수면 더함
            total += number
        else:                 # 홀수면 뺌
            total -= number
        number += 1
    return total

print(f"계산 결과: {calculate_alternating_sum()}")

# 2. 1부터 100까지의 모든 홀수 출력
def print_odd_numbers():
    number = 1
    odd_numbers = []
    while number <= 100:
        if number % 2 != 0:
            odd_numbers.append(number)
        number += 1
    print(f"홀수 리스트: {odd_numbers}")

print_odd_numbers()

# 3. 1부터 100까지의 모든 짝수 출력
def print_even_numbers():
    number = 1
    even_numbers = []
    while number <= 100:
        if number % 2 == 0:
            even_numbers.append(number)
        number += 1
    print(f"짝수 리스트: {even_numbers}")

print_even_numbers()

9. 고급 사용자 관리 시스템 (등록, 로그인, 계정 잠금)

텍스트 파일을 이용하여 사용자 정보를 저장하고, 로그인 실패 3회 시 계정을 잠그는 시스템입니다. 새 사용자 등록 기능도 포함됩니다.

import time

WHITE_LIST_FILE = "valid_users.txt"
BLACK_LIST_FILE = "locked_users.txt"

def load_users():
    """파일에서 사용자 정보를 로드하여 리스트로 반환합니다."""
    users = []
    try:
        with open(WHITE_LIST_FILE, 'r') as file:
            for line in file:
                line = line.strip()
                if ':' in line:
                    name, pwd = line.split(':', 1)
                    users.append({'name': name, 'password': pwd})
    except FileNotFoundError:
        pass  # 파일이 없으면 빈 리스트 반환
    return users

def load_locked_users():
    """잠긴 사용자 목록을 파일에서 로드합니다."""
    locked = []
    try:
        with open(BLACK_LIST_FILE, 'r') as file:
            for line in file:
                locked.append(line.strip())
    except FileNotFoundError:
        pass
    return locked

def register_user(users):
    """새 사용자를 등록하고 파일에 저장합니다."""
    for _ in range(3):
        new_name = input("생성할 사용자 이름: ")
        if new_name in [u['name'] for u in users]:
            print("이미 존재하는 사용자입니다.")
            continue
        pwd1 = input("비밀번호: ")
        pwd2 = input("비밀번호 확인: ")
        if pwd1 == pwd2:
            with open(WHITE_LIST_FILE, 'a') as file:
                file.write(f"{new_name}:{pwd1}\n")
            print("사용자 등록이 완료되었습니다!")
            return
        else:
            print("비밀번호가 일치하지 않습니다.")
    print("등록 시도 횟수를 초과했습니다.")
    exit()

def login_user(users, locked_users):
    """사용자 로그인 로직을 처리합니다."""
    for _ in range(6):
        name = input("사용자 이름: ")
        password = input("비밀번호: ")

        if name in locked_users:
            print("이 계정은 잠겼습니다. 관리자에게 문의하세요.")
            exit()

        found_user = next((u for u in users if u['name'] == name), None)
        if found_user:
            if found_user['password'] == password:
                print("로그인 성공!")
                print("=" * 30)
                print("환영합니다!")
                print("=" * 30)
                return
            else:
                print("비밀번호가 틀렸습니다.")
                user_fails = sum(1 for a in range(3) if name == found_user['name'])
                if user_fails >= 2:  # 예시 로직: 특정 사용자만 카운트하여 잠금
                    with open(BLACK_LIST_FILE, 'a') as file:
                        file.write(f"{name}\n")
                    print("3회 실패로 계정이 잠겼습니다.")
                    exit()
        else:
            print("존재하지 않는 사용자입니다.")
    print("로그인 시도 횟수를 초과했습니다.")
    exit()

def main():
    users = load_users()
    locked_users = load_locked_users()

    while True:
        action = input("1. 등록\n2. 로그인\n선택: ")
        if action == '1':
            register_user(users)
            users = load_users() # 업데이트된 사용자 목록 다시 로드
        elif action == '2':
            login_user(users, locked_users)
            break
        else:
            print("잘못된 입력입니다.")

if __name__ == "__main__":
    main()

태그: python 컴파일언어 인터프리터언어 변수명명규칙 Boolean

6월 30일 01:43에 게시됨