Python 정리

[Python 2일차 데이터 타입 ~ 예외처리까지]

100.nam 2024. 11. 27. 17:09

1. 데이터 타입

 #숫자형
 a = 10         #정수형(int)
 x = 3.14      #실수형(float)
 c1 = 1 + 2j  #복소수형(complex)
 
 #문자형
 name = "Alice"       #작은따옴표, 큰따옴표 작성 가능
 message = """안녕
 하세요 여러"""        #삼중 따옴표로 여러줄 작성 가능
 
 full_name = name + message # + 연산자로 문자열 연결, * 반복
 text = "Python"
 print(text[0])   # 'p'   # 문자열 인덱스로 개별 문자 접근 가능
 print(text[1:4]) # 'yth" # 슬라이싱을 통해 부분 문자열 추출 가능
 
 #불리언(Bolean) 논리연산자, 비교 연산자와 사용
 is_sunny = True    #True or False
 a = True
 b = False
 print(a and b) # False
 print(a or b)  # True
 print(not a)   # False

 x = 10
 y = 20
 print(X == y) # false
print(X < y)  # True

 

 

2. 컬랙션 자료형

 #리스트(List) #여러 개의 항목을 순서대로 저장하는 가변 자료형
 # []로 표현 ,로 구분

 #리스트 생성
 fruits = ["apple", "banana", "cherry"]

 #리스트 요소 접근
 print(fruits[0])  # apple

 # 리스트 요소 변경
 fruits[1] = "blueberry"
 print(fruits)  # ['apple', 'blueberry', 'cherry']

 # 리스트에 요소 추가
 fruits.append("orange")
 print(fruits)  # ['apple', 'blueberry', 'cherry', 'orange']

 # 리스트에서 요소 제거
 fruits.remove("blueberry")
 print(fruits)  # ['apple', 'cherry', 'orange']

 # 리스트 길이 확인
 print(len(fruits))  # 3

 

 #튜플(Tuple) 한번 생성되면 수정 X, 불변 자료형
 #()로 표현

 ## 튜플 생성
 coordinates = (10, 20)

 # 튜플 요소 접근
 print(coordinates[0])  # 10

 # 튜플은 불변이므로 요소 변경 불가
 # coordinates[0] = 15  # 오류 발생

 # 튜플 길이 확인
 print(len(coordinates))  # 2

 # 하나의 요소를 가진 튜플을 생성할 때는 뒤에 쉼표를 붙임
 single_element_tuple = (5,)
 print(type(single_element_tuple))  # <class 'tuple'>

 

 #딕셔너리(Dictionary) 키-값 쌍으로 데이터 저장하는 자료형
 #{}로 표현, 각 키와 값은 : 으로 구분

 # 딕셔너리 생성
 person = {
    "name": "Alice",
    "age": 25,
    "city": "New York"
 }

 # 딕셔너리 값 접근
 print(person["name"])  # Alice

 # 딕셔너리 값 변경
 person["age"] = 26
 print(person)  # {'name': 'Alice', 'age': 26, 'city': 'New York'}

 # 딕셔너리에 새 키-값 쌍 추가
 person["email"] = "alice@example.com"
 print(person)  # {'name': 'Alice', 'age': 26, 'city': 'New York', 'email': 'alice@example.com'}

 # 딕셔너리에서 키-값 쌍 제거
 del person["city"]
 print(person)  # {'name': 'Alice', 'age': 26, 'email': 'alice@example.com'}

 # 딕셔너리에서 키 목록과 값 목록 접근
 print(person.keys())  # dict_keys(['name', 'age', 'email'])
 print(person.values())  # dict_values(['Alice', 26, 'alice@example.com'])

 

 #셋(set) 중복되지 않는 요소들의 집합
 #{}로 표현, 순서가 없고 중복 허용 X

 # 셋 생성
 numbers = {1, 2, 3, 4, 4, 5}  # 중복된 요소는 하나로 처리됨
 print(numbers)  # {1, 2, 3, 4, 5}

 # 셋에 요소 추가
 numbers.add(6)
 print(numbers)  # {1, 2, 3, 4, 5, 6}

 # 셋에서 요소 제거
 numbers.remove(3)
 print(numbers)  # {1, 2, 4, 5, 6}

 # 셋의 집합 연산 (합집합, 교집합 등)
 odd = {1, 3, 5, 7}
 even = {2, 4, 6, 8}

 # 합집합
 union_set = odd.union(even)
 print(union_set)  # {1, 2, 3, 4, 5, 6, 7, 8}

 # 교집합
 intersection_set = numbers.intersection(odd)
print(intersection_set)  # {1, 5}

 

 

3. 데이터 타입 변환

 #명시적 타입 변환 -> 프로그래머가 직접 타입 변환 함수 사용
 # 실수를 정수로 변환
 a = 3.14
 b = int(a)
 print(b)  # 3

 # 문자열을 정수로 변환
 c = "100"
 d = int(c)
 print(d)  # 100 # 주의: 변환하려는 문자열이 숫자가 아니면 오류가 발생합니다.

 

 # 정수를 실수로 변환
 a = 10
 b = float(a)
 print(b)  # 10.0

 # 문자열을 실수로 변환
 c = "3.14"
 d = float(c)
 print(d)  # 3.14 # 주의: 변환하려는 문자열이 실수 형태가 아니면 오류가 발생합니다.

 

 # 정수를 문자열로 변환
 a = 10
 b = str(a)
 print(b)  # "10"

 # 실수를 문자열로 변환
 c = 3.14
 d = str(c)
 print(d)  # "3.14"

 

 # 숫자를 불리언으로 변환
 a = 0
 b = bool(a)
 print(b)  # False

 c = 1
 d = bool(c)
 print(d)  # True

 # 빈 문자열과 None은 False, 그 외의 값은 True
 e = ""
 f = bool(e)
 print(f)  # False

 g = "Hello"
 h = bool(g)
 print(h)  # True

 

 # 문자열을 리스트로 변환
 a = "hello"
 b = list(a)
 print(b)  # ['h', 'e', 'l', 'l', 'o']

 # 리스트를 튜플로 변환
 c = [1, 2, 3]
 d = tuple(c)
 print(d)  # (1, 2, 3)

 # 리스트를 셋으로 변환 (중복 제거)
 e = [1, 2, 2, 3, 4]
 f = set(e)
 print(f)  # {1, 2, 3, 4}

 

 #암시적 타입 변화 -> python 자동으로 데이터 변환
 # 정수와 실수의 연산에서 발생하는 암시적 변환
 a = 5
 b = 2.0
 c = a + b
 print(c)  # 7.0 (정수 5가 실수 5.0으로 암시적 변환됨)
 print(type(c))  # <class 'float'>

 

 

4. 조건문

조건문에서 중요한 점

1️⃣ 조건문의 순서

조건문은 위에서부터 순차적으로 조건을 검사합니다. 첫 번째로 참인 조건이 발견되면, 이후의 조건은 검사하지 않습니다.

2️⃣ 중첩 조건문

중첩 조건문을 활용하면 더 세밀한 조건 처리가 가능합니다.

3️⃣ elif와 else

다양한 상황을 처리하기 위해 elif와 else를 적절히 사용합니다.

 #기본적인 조건문 if, else
 
 age = 16

 if age >= 18:
    print("성인입니다.")
 else:
    print("미성년자입니다.")

 

 # 여러개를 쓸 때 elif
 # 사용자로부터 점수를 입력받아 학점을 출력하는 프로그램
 score = int(input("점수를 입력하세요: "))
 
 if score >= 90:
    print("A 학점")
 elif score >= 80:
    print("B 학점")
 elif score >= 70:
    print("C 학점")
 elif score >= 60:
    print("D 학점")
 else:
    print("F 학점")

 

 # 중첩 조건문  
# 사용자로부터 나이와 학생 여부를 입력받아 상태를 출력하는 프로그램
 age = int(input("나이를 입력하세요: "))
 is_student = input("학생입니까? (yes/no): ")

 if age >= 18:
    if is_student.lower() == "yes":
        print("성인이며, 학생입니다.")
    else:
        print("성인이며, 학생이 아닙니다.")
 else:
    if is_student.lower() == "yes":
        print("미성년자이며, 학생입니다.")
    else:
        print("미성년자이며, 학생이 아닙니다.")

 

 

5. 반복문

1) for문의 기본 구조

    for 변수 in 컬렉션:

      실행할 코드

 #for문
 numbers = [ 1,2,3,4,5]

 for number in numbers:
    square = number **2
    print(f"{number}의 제곱은 {square}입니다.")
 #문자열 앞의 f를 사용하면 {} 자리 표시자를 사용하여 변수 값을 문자열에 직접 삽입가능.

 

2) while문의 기본 구조
   while 조건식
  : 실행할 코드
 #while문
 # 사용자로부터 숫자를 입력받아, 그 숫자가 0이 될 때까지 반복해서 입력받는 프로그램
 number = int(input("숫자를 입력하세요 (0을 입력하면 종료): "))

 while number != 0:
    print(f"입력한 숫자는 {number}입니다.")
    number = int(input("다시 숫자를 입력하세요 (0을 입력하면 종료): "))

 print("프로그램을 종료합니다.")

 

3) break와 cotinue

 #반복 제어: break와 continue
 # 사용자로부터 숫자를 입력받아, 음수를 입력할 경우 반복문을 종료하는 프로그램
 while True:
    number = int(input("숫자를 입력하세요 (음수를 입력하면 종료): "))
    if number < 0:
        print("음수가 입력되어 프로그램을 종료합니다.")
        break      #바로 종료
    if number % 2 == 0:
        print("짝수입니다.")
        continue  # 현재 반복을 건너뛰고 다음 반복으로
    print("홀수입니다.")

 

4) range()함수

for i in range(시작, 종료, 단계):

     실행할 코드

  • 시작: 시작할 숫자 (기본값 0).
  • 종료: 종료할 숫자 (해당 숫자는 포함되지 않음).
  • 단계: 숫자 간의 간격 (기본값 1).
 #range()함수
 # 1부터 10까지의 숫자 중 짝수만 출력하는 프로그램
 for i in range(1, 11):  # 이 경우는 시작과 종료만 적혀있기에, 단계는 기본값 1
    if i % 2 == 0:
        print(i)

 

5) 중첩 반복문

for i in range(첫 번째 범위):

      for j in range(두 번째 범위): 실행할 코드

 #중첩 반복문
 # 구구단 출력 프로그램
 for i in range(2, 10):
    print(f"{i}단:")
    for j in range(1, 10):
        print(f"{i} x {j} = {i*j}")
    print()  # 각 단마다 줄바꿈 추가

 

 

6. 내장함수

내장 함수는 Python에서 기본적으로 제공하는 함수들로, 별도의 모듈을 임포트(import)하지 않아도 언제든지 사용할 수 있습니다. 이들 함수는 기본적인 데이터 타입 변환, 수학 연산, 문자열 처리 등 다양한 작업을 간편하게 수행할 수 있도록 도와줍니다.

 #print()함수: 출력하기
 print("Hello, World!")
 #input()함수: 사용자 입력받기
 name = input("이름을 입력하세요: ")
 #len()함수: 길이 구하기
 fruits = ["apple", "banana", "cherry"]
 print(len(fruits))  
 #type()함수: 데이터 타입 확인
 a = 10
 b = 3.14
 c = "Python"
 print(type(a))  # <class 'int'>
 print(type(b))  # <class 'float'>
 #int(),float(),str()함수: 타입 변환하기
 # 정수 변환
 num_str = "100"
 num_int = int(num_str)
 print(num_int)  # 100

 # 실수 변환
 num_float = float("3.14")
 print(num_float)  # 3.14

 # 문자열 변환
 num = 50
 num_str = str(num)
 print(num_str)  # "50"
 #sum()함수: 합계 구하기
 numbers = [1, 2, 3, 4, 5]
 total = sum(numbers)
 print(total)  # 15
 #min(),max()함수: 최솟값과 최대값 찾기
 numbers = [3, 1, 4, 1, 5, 9]
 minimum = min(numbers)
 maximum = max(numbers)
 print(f"최솟값: {minimum}, 최댓값: {maximum}")  # 최솟값: 1, 최댓값: 9
 #sorted()함수: 정렬하기
 numbers = [5, 3, 8, 6, 2]
 sorted_numbers = sorted(numbers)
 print(sorted_numbers)  # [2, 3, 5, 6, 8]
 print(sorted(numbers, reverse=True))  # [8, 6, 5, 3, 2]
 #abs()함수: 절대값 구하기
 num = -10
 print(abs(num))  # 10
 #round()함수: 반올림하기
 pi = 3.14159
 print(round(pi, 2))  # 3.14

 

 

7. 함수 만들기

Python에서 함수를 정의하려면 def 키워드를 사용합니다.

함수 이름을 지정하고, 필요한 경우 매개변수를 정의합니다.

함수는 필요한 작업을 수행한 후, 반환값을 돌려줄 수 있습니다.

 #함수 만들기
 def greet(name):
    return f"안녕하세요,{name}님!"

 message = greet("Alice")
 print(message) #안녕하세요, Alice님
 #매개변수 (각 매개변수는 ,로 구분)
 def add(a,b): #매개변수는 a와 b, 함수가 호출될 때 3과 5 인수가 각각 전달
    return a + b

 result = add(3,5)
 print(result)
 #반환값 (함수가 작업을 완료한 후 호출된 위치로 돌려주는 값)
 def calculate(a, b):
    sum = a + b
    difference = a - b
    return sum, difference

 s, d = calculate(10, 5)
 print(s)  # 15
 print(d)  # 5
 # retrun문을 생략하거나 반환값이 없이 return만 사용하면 함수는 None을 반환
 #기본값 (인수가 전달되지 않으면 기본값이 사용)
 def greet(name="손님"):
    return f"안녕하세요, {name}님!"

 print(greet())          # 안녕하세요, 손님님!
 print(greet("Alice"))   # 안녕하세요, Alice님!
 #가변 매개변수 (정해지지 않은 개수의 인수를 받도록)
 # *args: 임의의 위치 인수를 튜플로 받음
 def add(*args):
    return sum(args)

 print(add(1, 2, 3))      # 6
 print(add(10, 20, 30, 40))  # 100

 # **kwargs: 키워드 인수의 딕셔너리를 받는다
 def print_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

 print_info(name="Alice", age=30, city="Seoul")
 # name: Alice
 # age: 30
 # city: Seoul

함수 사용 시 주의사항

함수의 역할 분명히 하기

함수는 하나의 작업 또는 논리적 단위를 처리하도록 설계하는 것이 좋습니다. 너무 많은 역할을 수행하는 함수는 이해하기 어렵고, 유지보수하기 힘들 수 있습니다.

 

매개변수의 순서에 주의

기본값이 있는 매개변수는 항상 기본값이 없는 매개변수 뒤에 와야 합니다. 그렇지 않으면 문법 오류가 발생합니다.

 

반환값 처리

함수가 return 문을 통해 반환하는 값을 적절히 처리해야 합니다. 반환값이 필요하지 않은 경우에도, 함수의 동작을 명확히 이해하고 사용해야 합니다.

 

가변 매개변수 남용 주의

args와 *kwargs는 매우 유용하지만, 남용하면 코드가 읽기 어려워질 수 있습니다. 필요한 경우에만 사용하고, 가독성을 고려하여 적절히 사용해야 합니다.

 

 

8. 모듈

모듈은 Python에서 관련된 함수, 클래스, 변수 등을 하나의 파일에 모아놓은 코드 묶음입니다. 모듈을 사용하면 코드를 재사용하고, 논리적으로 구분하여 관리할 수 있습니다. 간단히 말해, Python 파일(.py) 하나가 하나의 모듈이 됩니다.

 

1) import 모듈이름 (다른 파일에 있는 모듈을 불러와 사용할 수 있습니다.)

 import math  # 수학 관련 함수들을 포함한 math 모듈

 result = math.sqrt(16)  # math 모듈의 sqrt 함수 사용
 print(result)  # 4.0

 

2) from 모듈이름 import 항목이름(모듈 전체가 아닌 모듈 내의 특정 함수, 클래스, 변수를 선택적으로 불러올 수 있습니다.)

 from math import sqrt  # math 모듈에서 sqrt 함수만 불러옴

 result = sqrt(36)
 print(result)  # 6.0

 

모듈 탐색 경로

Python에서 모듈을 불러올 때, Python은 특정 모듈 탐색 경로에서 해당 모듈을 찾습니다. 일반적으로 Python은 다음 순서로 모듈을 찾습니다:

  1. 현재 작업 디렉터리: 현재 실행 중인 스크립트가 있는 폴더.
  2. 표준 라이브러리 경로: Python이 기본적으로 제공하는 라이브러리들이 위치한 폴더.
  3. 환경 변수에 지정된 경로: PYTHONPATH 환경 변수에 지정된 폴더.

모듈이 이 경로들 중 하나에 존재하면, import 또는 from 구문을 통해 해당 모듈을 불러올 수 있습니다.

 

 

9. 파이썬 패키지

Python에서 패키지는 여러 모듈을 논리적으로 묶은 디렉터리 구조입니다.

패키지는 모듈을 더 체계적으로 관리하고, 다른 프로젝트에서도 재사용할 수 있게 해줍니다.

패키지는 모듈과 마찬가지로 코드 재사용을 촉진하며, 대규모 프로젝트에서 코드의 가독성과 유지보수성을 높이는 데 중요한 역할을 합니다.

 

1) 📚 pip로 패키지 설치하기

pip를 사용하면, Python 패키지 인덱스(PyPI)에서 원하는 패키지를 쉽게 설치할 수 있습니다.

pip install 패키지이름

 

2) 설치된 패키지 목록 확인

pip list

 

3) 패키지 업그레이드

pip install --upgrade 패키지이름

 

4) 패키지 제거

pip uninstall 패키지이름

 

 

10. 가상환경

가상 환경(Virtual Environment)은 프로젝트별로 독립된 Python 실행 환경을 만드는 도구입니다.

가상 환경을 사용하면, 프로젝트마다 서로 다른 패키지 버전을 설치하고 관리할 수 있어, 패키지 간의 충돌을 방지할 수 있습니다.

 

1) 가상환경 생성

python -m venv myenv    #myenv는 내가 정해주는 이름

 

2) 가상환경 활성

Windows:

myenv\Scripts\activate

 

(오류!) 

.\myenv\Scripts\activate : 이 시스템에서 스크립트를 실행할 수 없으므로 C:\project
\myenv\Scripts\Activate.ps1 파일을 로드할 수 없습니다. 자세한 내용은 about_Execut 
ion_Policies(https://go.microsoft.com/fwlink/?LinkID=135170)를 참조하십시오.      
위치 줄:1 문자:1
+ .\myenv\Scripts\activate
+ ~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : 보안 오류: (:) [], PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

 

위와 같은 오류 발생시 시작메뉴에서 windows powershell 프로그램을 관리자 권한으로 실행

PS C:\windows\system32> Set-ExecutionPolicy RemoteSigned을 작성 후 엔터

Y[예]를 누르면 정상적으로 작동

 

3) 가상환경 비활성화

deactivate

 

4) 패키지 파일 생성

pip freeze > requirements.txt # 현재 설치된 패키지를 requirements.txt에 기록

 

5) 파일을 통한 패키지 설

pip install -r requirements.txt # requirements.txt에 명시된 모든 패키지를 설치

 

 

 

11. 예외처리

하나의 try 블록에서 여러 개의 except 블록을 사용하여, 다양한 예외를 처리할 수 있습니다.

 try:
    x = int(input("숫자를 입력하세요: "))
    result = 10 / x
 except ValueError:
    print("유효한 숫자가 아닙니다.")
 except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")

 

finally 블록은 예외가 발생하지 않더라도 실행됩니다.

 try:
    result = 10 / 2
    print(result)
 except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")
 finally:
    print("프로그램 종료.")