[LG헬로비전 DX DATA SCHOOL 4기] Python(2) (250107)

mini_bang·2025년 1월 7일

2. 자료형

(1) 숫자(int, float)

  • int: 정수
  • float: 실수
  • type(변수명): 변수의 자료형을 알려주는 함수

(2) 문자(string)

  • 문자열 슬라이싱
  • 문자열 함수 (lower, upper, count, find, index 등)
  • 문자열 변환 및 조작 (replace, split, strip, join)
// 실습 코드
# 2. 문자(string)
"""

str_6 = '안녕하세요. 홍길동 고객님!'
str_6

str_6[7:10]

str_6[:2] # 시작점이 없을 경우 처음부터

str_6[2:] # 끝이 없다면 끝까지

str_6[:] # 시작과 끝이 없다면 전체

str_6[:-2] # '-'는 끝에서부터 거꾸로

str_6[::-1]

str_7 = "Alphabet"
print(str_7.lower()) # 소문자로 바꾸는 함수

str_7.lower # 함수만 호출되는 것이기 때문에 ()있어야 함.
# () => 값을 호출해달라고 함.

str_7.upper()

str_7 # 값을 할당 하지 않았으므로, str_7은 그대로이다.

str_7.count('a') # a의 개수를 세어줌

"""str_7을 소문자로 바꾸고 소문자 a의 개수를 셈"""

str_7.lower().count('a')

find vs index(같은 함수 이긴 하나, 인덱스를 -로 반환하느냐 오류를 반환하느냐의 차이?)

str_7.find('t')

str_7.index('t')

str_7.find('z')

str_7.index('z')

str_8 = 'Life is C between B and D'
str_8

str_8.replace('C', 'Chicken')

"""split vs strip"""

str_8.split(' ') # splict: 안에 분할하는 기준을 넣을 수 있음.

str_8.split('C')

# 공백을 먼저 제거하고 분할(자연어 처리에서 많이 사용)
str_8.strip().split(' ') # strip: 공백을 제거

str_9 = 'abcd'
','.join(str_9) # ,를 추가

str_10 = str_8.split()
' '.join(str_10)

print(dir(str_8)) # 문자열 변수 str_8에 적용 가능한 메소드 나열

(3) 리스트(list)

  • 리스트 선언 및 이중 리스트
  • 리스트 연산 (삽입, 수정, 삭제)
  • 정렬 및 얕은/깊은 복사
// 실습 코드
"""# 3. 리스트(list)"""

list_3 = [1, 2, '문자', ['이중 리스트', '가능'], ('리스트 속', '튜플')]
list_3

list_3[3][0]

"""- 2차원 리스트 (* 3차원이상부터는 시각화 어려움)"""

a = [[10,20],[30,40],[50,60]]
a

"""- 이중 리스트"""

list_6 = ['a','b','c']
list_7 = ['가','나','다']
list_6 + list_7

list_6 * 3

list_6

'a' in list_6

"""- 리스트 -> 삽입, 수정, 삭제가 자유로움."""

list_8 = ['파이썬','C','Java']

list_8.append('R') # 맨뒤에 추가해줌
list_8

list_8.insert(2, 'C++') # insert는 원하는 위치에 삽입
list_8

list_8[0] = 'Python' # 덮어쓰기 가능
list_8

list_8.remove('C')
list_8

del list_8[3] # del은 메모리까지 삭제함
list_8

list_8.pop() # 괄호()안 인덱스에 해당하는 요소를 반환
# 인덱스를 생략하면 가장 마지막 요소를 꺼내옴

list_8

list_9 = [1,5,7,2,6]
list_9.sort() # sort(): 순서대로 정렬해주는 함수임. return 함수가 내장되어있어서 원본에 적용됨
list_9

list_9 = [1,5,7,2,6]
list_9.sort(reverse=True)
list_9

list_9 = [1,5,7,2,6]
sorted(list_9) # sorted: return 함수가 내장되지 않아서 원본에 적용되지 않음
list_9

"""- 얕은 복사"""

a = [10,9,8,7,6]
b = [5,7,8,9,10]
print(id(a), id(b))  # CPU 주소는 서로 다름

b = a # a를 b에 할당하면 주소가 같아짐
print(id(a), id(b))   # 얕은 복사: 참조값까지 복사 하는 것

"""- 같은 값을 복사하고 싶으면? => 깊은 복사(깊은 복사는 객체를 공유하지 않음)"""

a = [5,4,3,2,1]
b=a[:]
print(id(a), id(b))

b

a.sort()
a

b

a = [5,4,3,2,1]
b = a.copy()
print(id(a), id(b))  # 주소는 복사 안됨

a.sort()
a

b

a

import copy
a = [5,4,3,2,1]
b = copy.deepcopy(a)
print(id(a), id(b))

a.sort()
a

b

a

"""- 2차원에서는 깊은 복사가 안됨"""

a = [[1,2],[3,4]]
a

b = a[:]
a[0][1] = 100
a

b # b[0][1]도 같이 바뀌어버림

"""# 4. 튜플(tuple)
- 인덱싱과 슬라이싱이 가능
- 리스트와 달리 요소를 삽입/삭제/수정 할 수 없음
"""

tuple_3 = (1, 2)
tuple_4 = (3,) # 가변공간: 두 개 이상은 불가능
tuple_3 + tuple_4

"""# 5. 딕셔너리(dictionary)"""

dict_3 = {'홍길동':100, '홍계월':200}
dict_3

dict_3['슈퍼맨'] = 300
dict_3

dict_3['홍길동']=1
dict_3

# del dict_3['슈퍼맨']
# dict_3

# key에 접근하기 : keys()
dict_3 = {'홍길동':100, '홍계월':200, '슈퍼맨':150, '배트맨':250}
print(dict_3.keys())
print(type(dict_3.keys()))

# values에 접근하기: values()
print(dict_3.values())
print(type(dict_3.values()))

# key와 values에 함께 접근하기 : items()
print(dict_3.items())
print(type(dict_3.items()))

# 리스트처럼 보이나, 실제로는 dict의 개체이므로, 리스트의 메소드를 사용할 수 없음 => 리스트로 사용하려면 리스트로 형변환 해주어야 함.
list(dict_3.items())[0]

dict_3

print(dict_3['배트맨'])
print(dict_3.get('배트맨'))

# 키 값을 이용하여 접근할 경우, 해당키가 없으면 오류 발생
print(dict_3['펭수'])

# get을 통해 접근할 경우, None을 반환
print(dict_3.get('펭수'))

"""# 6. Set(집합)
- {}을 선언하여 set을 선언
- 중복을 허용하지 않음
- 순서가 없음
"""

set_2 = set("hello")
set_3 = set([1,2,3])
set_4 = {3,5,'hi'}
print(set_2)
print(set_3)
print(set_4)

# 교집합
set_5 = {1,2,3,4}
set_6 = {4,5,6,7}

print(set_5.intersection(set_6))
print(set_5 & set_6) # 집합 연산자

# 합집합
print(set_5 | set_6)
print(set_5.union(set_6))
// 실습 코드
# 조건문
- if / elif / else
"""

money = True
if money:
    print("여행을 간다")
else:
    print("집에 있는다.")

money = 20000
if money > 0 :
    if 0 < money < 5000 :
        print('라면을 먹는다')
    elif 5000 <= money < 25000 :
        print('치킨을 먹는다')
    elif 25000 <= money < 50000 :
        print('삼겹살을 먹는다')
    else :
        print('소고기를 먹는다')
else :
    print('양수를 입력해 주세요.')

a = 3
b = 5
a < b

c = 3
d = 3
c <= d

c != d

"""- 조건 논리식"""

a = 100
if a > 0 and (a % 2) == 0:
    print('a is even')

"""- and, &는 서로 다름"""

5 and 7 # 항상 큰 수가 나옴

"""- &(비트연산): and를 쓰면 csv파일에서 필터링을 할때 해당 데이터 위치를 가져올 수 없어서 비트연산자인 &를 사용하여야 한다."""

5 & 7   # 5 = 0101, 7 = 0111 => 여기서 교집합은 0101이므로 5가 나옴

5 | 7

money = 20000
card = True

if card:
    if money < 30000:
        print('삼겹살을 먹는다.')
    else:
        print('소고기를 먹는다.')
else:
    if money <= 1000:
        pass  # 조건을 만족해도 아무 일도 일어나지 않도록 해줌
    else:
        print('라면을 먹는다.')

value = 20
if value % 2 == 0:
    is_even = True
else:
    is_even = False
print(is_even)

# 삼항 연산자: 조건이 참이면 true_value값을 취하고, 거짓이면 false_value값을 취함
value = 30
is_even = True if value % 2 == 0 else False
print(is_even)

"""# 포멧팅"""

# formatting
# %s: 만능키
num = 1
print('문자열 포맷팅 하기 예시 %d' %num)

ch = '이름'
print('내 이름은 : %s' %ch)

f1 = 1/3
print('반올림 하기 : %0.20f' % f1) # 소숫점 17자리 넘어가면 오류 발생

a = 3
b = 5
print('%d와 %d를 더하면 %d' %(a, b, a+b))

print('문자열 포맷팅 하기 예시 {}'.format(2))

print('내 이름은 : {}'.format(ch))

a = '류'
b = '영표'
print('성은 {}, 이름은 {}'.format(a, b))

# 인덱스를 통해 순서를 지정할 수도 있습니다.
print('성은 {0}, 이름은 {1}'.format(a,b))

print('First name : {1}, last name : {0}'.format(a,b,))

print('나는 오늘 {음료}를 {개수} 잔이나 마셨다.'.format(음료='커피', 개수=3))

year = 2020
f'올해는 {year}'

drink = '커피'
nums = 3
f'나는 오늘 {drink}{nums+1} 잔이나 마셨다.' # nums+1 처럼 연산이 가능함

'나는 오늘 %s를 %d+1 잔이나 마셨다'%('커피',3)  # 연산이 불가능함

'나는 오늘 {drink}를 {num+1}를 마셨다'.format(drink='커피', nums=3)
// 연습 문제
# 1) b로 a를 나눈 나머지가 3 초과면 실패, 3이면 무승부, 3미만이면 성공이 출력되도록 만들어보자.

a = 34
b = 4

if (a%b) > 0:
  if (a%b) > 3:
    print("실패")
  elif (a%b) == 3:
    print("무승부")
  else:
    print("성공")
else:
  print("양수를 입력해주세요.")

# 2) 홀수 짝수 판별기: 사용자로부터 정수를 하나 입력받아 입력한 정수가 홀수인지 짝수인지 판별하여라.
# 0은 짝수라고 가정

a = int(input('정수를 입력하세요.'))

if (a % 2) == 1:
  print('입력하신 %d는 %s입니다.' %(a, '홀수'))
elif (a % 2) == 0:
  print('입력하신 %d는 %s입니다.' %(a, '짝수'))
else:
  print('올바른 정수를 입력해주세요.')

b = int(input('정수를 입력하세요.'))

if (b % 2) == 1:
  print('입력하신 %d는 %s입니다.' %(b, '홀수'))
elif (b % 2) == 0:
  print('입력하신 %d는 %s입니다.' %(b, '짝수'))
else:
  print('올바른 정수를 입력해주세요.')

# 3) 무슨 학교 다니세요?
      # 태어난 연도를 계산하여 학교 종류를 맞추는 프로그램
      # 나이는 현재년도 - 태어난 년도 + 1로 계산
      # 26세 이하 20세 이상이면 "대학생", 20세 미만 17세 이상이면 "고등학생"
      # 17세 미만 14세 이상이면 "중학생", 14세 미만 8세 이상이면 "초등학생"
      # 그 외의 경우는 "학생이 아닙니다" 출력

birth_year = int(input('당신이 태어난 년도를 입력하세요.'))
current_year = 2025
age = current_year - birth_year + 1

if birth_year > 0:
  if 20 <= age <= 26:
    print("대학생")
  elif 17 <= age < 20:
    print("고등학생")
  elif 14 <= age < 17:
    print("중학생")
  elif 8 <= age < 14:
    print("초등학생")
  else:
    print("학생이 아닙니다.")
else:
  print("올바른 년도를 입력하세요.")

# 4) 사용자로부터 점수를 3개 입력받아서 각 점수가 65점보다 클 경우 합격, 아닐경우 불합격을 출력하세요
      # 단, 0~100이 아닌 숫자가 입력된경우 "잘못된 점수가 입력되었습니다."를 출력하세요.

score_a = int(input('점수 A를 입력해주세요.'))
score_b = int(input('점수 B를 입력해주세요.'))
score_c = int(input('점수 C를 입력해주세요.'))

if (100 >= score_a > 0) and (100 >= score_b > 0) and (100 >= score_c > 0):
  if (score_a > 65) and (score_b > 65) and (score_c > 65):
    print("합격")
  else:
    print("불합격")
else:
  print("잘못된 점수가 입력되었습니다.")

# 5) 양의 정수 하나를 입력 받아 이 정수가 2의 배수인지 3의 배수인지 작성하시오.

num = int(input('양의 정수를 입력하세요.'))

if num > 0:
  if (num % 2) == 0:
    print(f"입력한 숫자:{num}, => 2의 배수 입니다.")
  elif (num % 3) == 0:
    print(f"입력한 숫자:{num}, => 3의 배수 입니다.")
  else:
    print(f"입력한 숫자:{num}, => 2 또는 3의 배수가 아닙니다.")
else:
  print(f"입력한 숫자:{num} => 양의 정수가 아닙니다.")

정리

분류문법/함수설명
문자열(String)str[start:end]문자열 슬라이싱 (start부터 end 이전까지 자름).
str.lower()문자열을 소문자로 변환.
str.upper()문자열을 대문자로 변환.
str.count('sub')특정 문자의 개수를 반환.
str.find('sub')특정 문자의 첫 번째 위치를 반환, 없으면 -1 반환.
str.index('sub')특정 문자의 첫 번째 위치를 반환, 없으면 오류 발생.
str.replace('old', 'new')문자열 내 특정 부분을 다른 문자열로 교체.
str.split('delimiter')특정 구분자를 기준으로 문자열 분리, 리스트 반환.
str.strip()문자열 양쪽의 공백 제거.
'delimiter'.join(iterable)구분자를 사용해 iterable의 요소들을 하나의 문자열로 연결.
dir(str)문자열 객체에서 사용할 수 있는 메소드 나열.
리스트(List)list.append(element)리스트의 마지막에 요소 추가.
list.insert(index, element)특정 위치에 요소 삽입.
list.remove(element)리스트에서 특정 요소 제거.
del list[index]특정 인덱스의 요소를 삭제.
list.pop(index)특정 인덱스의 요소를 반환하고 제거, 인덱스 생략 시 마지막 요소 제거.
list.sort()리스트 요소를 정렬. 원본 리스트 변경.
sorted(list)리스트 요소를 정렬하여 새 리스트 반환. 원본은 변경되지 않음.
list.copy()리스트 복사 (깊은 복사).
copy.deepcopy(list)다차원 리스트 깊은 복사.
튜플(Tuple)(element1, element2, ...)튜플 선언, 수정 불가.
tuple1 + tuple2튜플 합치기.
딕셔너리(Dictionary)dict.keys()딕셔너리의 키 반환.
dict.values()딕셔너리의 값 반환.
dict.items()딕셔너리의 키-값 쌍 반환.
dict['key']키를 이용한 값 접근. 키가 없으면 오류 발생.
dict.get('key')키를 이용한 값 접근. 키가 없으면 None 반환.
집합(Set){element1, element2, ...}집합 선언. 중복 제거, 순서 없음.
set1 & set2교집합.
`set1set2`
조건문if / elif / else조건문 사용.
and / or / not논리 연산자.
pass아무 동작도 하지 않음.
삼항 연산자value = true_value if condition else false_value
포매팅%문자열 내 특정 값을 포매팅.
str.format()문자열 포매팅 함수.
f'{}'f-string으로 문자열 포매팅.
  1. 튜플(tuple)

    • 튜플의 특징 및 사용법
  2. 딕셔너리(dictionary)

    • 딕셔너리 선언, 값 추가/수정/삭제
    • 키, 값, 아이템 접근법
  3. 집합(set)

    • 집합 선언 및 사용법
    • 집합 연산 (교집합, 합집합)
  4. 조건문

    • 기본 조건문 (if, elif, else)
    • 논리 연산자 및 비트 연산자
    • 삼항 연산자
  5. 포매팅 (Formatting)

    • 문자열 포매팅 방법 (%, format, f-string)
  6. 연습 문제

    1. 나머지 연산을 통한 조건문
    2. 홀수/짝수 판별기
    3. 학교 종류 맞추기 (태어난 연도 기준)
    4. 점수 입력 및 합격 여부 판별
    5. 배수 판별기

0개의 댓글