교육 받기 시작한지 2주차 3일째 되는 날입니다.
하나하나 배워가는 재미가 쏠쏠합니다.
회사다닐땐 그렇게 하기 싫어서 집에도 제대로된 컴퓨터 하나 사지 않았습니다.
책을 읽고, 유튜브 등을 통해 다른 사람들이 말하는 배우는게 재밌다 라는 말을
진심으로 이해하지 못했었던 것 같습니다.

항상 일은 그 자체가 목적이 아니라 돈 버는 목적이라고 생각했었습니다.
회사를 다니면서도 발전할 기회를 잘 인지하지 못하고 시간만 보냈었던 것 같습니다.
일이 아니라 하고 싶은 공부를 하는건 다르네요.
순수하게 재밌습니다. 계속 재밌었으면 좋겠네요.

연산자


논리연산

def test1():
    print("test1 함수 호출!")
    return False

def test2():
    print("test2 함수 호출!")
    return True

# 가장 많이 걸러지는 조건을 맨 앞에 두어야 리소스를 줄일 수 있다.
result = test1() and test2()
print(result) # 결과: False

# 퀴즈 1
True and False # 결과 False

1 or 0    # 결과 1



할당연산

x = 9
y = 3
z = 4

x //= y    # 몫이 x에 저장
y /= z    # / 는 나눗셈

print(x, y, z)    # 결과 1 2.0 3



식별연산

# 1. -5 ~ 256 같은 주소를 바라 보고 있지만 그 범위 이하 이상 일때는 주소가 달라진다.
# 문자열의 경우에는 10자리가 넘어가면 주소가 달라진다.

coffee_employee = "Brand"
orange_employee = "Brand"

print(coffee_employee is orange_employee)            # 결과 : True
print(coffee_employee == orange_employee)            # 결과 : True

print(id(coffee_employee), id(orange_employee))        # 결과 : 135165306382576 135165306382576

결과는 True, True 이다.
is 는 주소의 위치를 비교하지만 == 는 값만 비교한다.

a = [1, 2, 3] # 리스트형인 [1,2,3]
b = [1, 2, 3] # 리스트형인 [1,2,3]
c = a         # # 리스트형인 [1,2,3] 다만 a에 있는 것을 재할당!

print(a, b, c)                # 결과 : [1, 2, 3] [1, 2, 3] [1, 2, 3]
print('a == b', a == b)        # 결과 : a == b True
print('a == c', a == c)        # 결과 : a == c True
print('a is b', a is b)        # 결과 : a is b False
print('a is c', a is c)        # 결과 : a is c True
print('b is c', b is c)        # 결과 : b is c False

print(id(a), id(b), id(c))    # 결과 : 135165446452160 135165446451584 135165446452160

리스트 a와 b는 새로 만들어진 변수이니 주소가 다르다.
c는 a를 할당했기 때문에 a와 주소가 같다.
값을 비교하는 a == b 는 True 지만 주소를 비교하는 a is b 는 False


멤버 연산

a = [1, 2, 3, 4]
b = [1, 2, 3, 4]
c = 'hello world'

print(1 in a)             # 출력: True
print(0 not in a)         # 출력: True
print([2] in b)         # 출력: False
print([1, 2] in b)         # 출력: False
print('h' in c)         # 출력: True
print('hello ' in c)     # 출력: True

강의중에 강사님 실수가 비슷한 건에 있었는데 print(c in 'h') 처럼 거꾸로 쓰셨다.
왜 안되는지 헷갈렸는데 잘 생각해보면 c 라는 'hello world' 가 'h' 에 있느냐 물어보는 거니 당연히 False

# 자료형태를 잘 파악하셔서 In을 사용하셔야 된다.
a_1 = [[1, 2], [2], 3, 4]
#리스트 안에 있는 값은 정수형 3, 4 / 리스트형 [1, 2], [2]



연산자 순서

-2 ** 2 # 출력: -4, -(2 ** 2)
(-2) ** 2 # 출력: 4
True * True and True + False # 출력: 1 , ((True * True) and (True + False))

# 복합 할당 연산자가 가장 나중입니다!
a = 10
a *= 10 + 100
a # 출력: 1100

 result = 2 ** 3 * 3 + 4 / 2 - 5
 print(result)

연산자 순서는 다 외울 순 없고, 일반적인 수학적 우선순위 기반에서 찾아보면서 사용하면 되지 않을까 싶다.


연습문제

# (심화문제) 입력한 금액을 5000원, 1000원, 500원, 100원으로 교환하는 프로그램을 만들어주세요.
money = input("금액을 입력해주세요 : ")

# 5,000원 지폐 계산
num5000count = int(int(money) / 5000)
na5000count = int(int(money) % 5000)

# 1,000원 지폐 계산
num1000count = int(na5000count / 1000)
na1000count = int(na5000count % 1000)

# 100원 동전 계산
num100count = int(na1000count / 100)
na100count = int(na1000count % 100)

print(f"\n입력한 금액은 \n5,000원권 {num5000count}장, \n1,000원권 {num1000count}장, \n100원 동전 {num100count}개 로 바꿀 수 있고, \n남은 금액은 {na100count}원 입니다.")

만들고 나니 소스가 예전 프로그램 스타일이다.
계속 형변환 할 필요 없이 몫을 리턴해주는 // 같은 연산자 사용하면 된다.
좀 더 한다면 어차피 계산하는 부분은 같으니 함수화 하면 될것 같다.


시퀀스 자료형


인덱싱

# 1.1 인덱싱
       #(-)54321
          #01234
example = 'abcde'

print(example[0]) # 출력 : a
print(example[2]) # 출력 : c
print(example[-3]) # 출력 : c

자리 인덱싱은 언제나 헷갈린다.
반대생각이 떠오르는 느낌

# 1.2 슬라이싱
       #(-)54321
          #01234
example = 'abcde'

print(example[1:3])   # 출력: bc
print(example[-4:-1]) # 출력: bcd

#range(10)[3] # 출력: 3
range(100)[::5] # 출력: range(0, 100, 5)

개인적으로는 슬라이싱이 마음에 든다.
슬라이싱에서 스탑이 인덱스값이 아니라는 것! 하나앞에 값

# 1.5 내장함수 사용

example = 'abcde'
print(len(example))  # 출력: 5
print(min(example))  # 출력: a
print(max(example))  # 출력: e

일반적 내장함수 배우고 졸리다 하던 순간에!!


시퀀스 자료형의 패킹과 언패킹

가장 새로웠던 부분 신기하다 python!

# 2.1 튜플 패킹

# 튜플 패킹
packed_tuple = 1, 2, 3, 4
print(packed_tuple)  # 출력: (1, 2, 3, 4)
type(packed_tuple)     # 출력 : tuple

tuple_example = 1
print(tuple_example)    # 출력 : 1
type(tuple_example)        # 출력 : int

신기한 패킹과 자료형을 맘대로? 정한다.

# 2.2 언패킹

# 튜플 패킹
packed_tuple = 1, 2, 3, 4
print(packed_tuple)            # 출력 : (1, 2, 3, 4)
print(type(packed_tuple))    # 출력 : <class 'tuple'>

# 튜플 언패킹
a, b, c, d = packed_tuple
print(a)                      # 출력: 1
print(b)                      # 출력: 2
print(c)                      # 출력: 3
print(d)                      # 출력: 4

print(type(a))                # 출력 : <class 'int'>
print(type(b))                # 출력 : <class 'int'>
print(type(c))                # 출력 : <class 'int'>
print(type(d))                # 출력 : <class 'int'>

더 신기한 언패킹

# 다양한 패킹/언패킹
# range는 0부터 n-1까지 숫자를 생성하는 함수

a, b, c = range(3)
print(range(3))        # 출력 : range(0, 3)
print(a, b, c)        # 출력 : 0 1 2

range함수 써서 변수에 하나씩 자동으로 할당! 신기하네요.

a, b, c, d, e = 'hello'

문자가 변수에 하나씩..

# 별표를 이용한 언패킹

first, *middle, last = [1, 2, 3, 4, 5, 6, 7]

print(first)            # 출력 : 1
print(middle)            # 출력 : [2, 3, 4, 5, 6]
print(last)                # 출력 : 7

print(type(first))        # 출력 : <class 'int'>
print(type(middle))        # 출력 : <class 'list'>
print(type(last))        # 출력 : <class 'int'>

거의 내 맘을 알아주는 애인수준으로 형변환을ㅋㅋ
내가 할게 없잖아요 언패킹씨..



리스트

실습한 것들 다 쓰고 싶지만 너무 많으니 주요한 것들만 올린다.

# 리스트의 장점 : 여러가지 자료형을 넣을 수 있다.

#z = [1, 'apple', 2.5, ['a', 'b'], (1, 2)]
z = [
        1,
        'apple',
        2.5,
        ['a', 'b'],
        (1, 2), # 마지막에 컴마 넣어도 상관 없음
]
print(z[0])
print(z[1])
print(z[2])
print(z[3])
print(z[4])

다양한 자료형이 있으니 한줄로 하지 않고, 컴마 기준으로 가독성을 높여도 된다.
마지막 컴마는 넣어도 상관 없다.

# 2.2 리스트 값 수정

a = [1, 2, 3, 4, 5]
print(a)        # 출력 : [1, 2, 3, 4, 5]

a[0] = 10000
a[1] = [1, 2, 3, [4]]
print(a)        # 출력 : [10000, [1, 2, 3, [4]], 3, 4, 5]


# 문자열은 변경할 수 없다.

s = 'licat'
print(s[0])                
s[0] = 'k'        # 문자열의 첫자리를 변경하려도 오류.. TypeError: 'str' object does not support item assignment

문자열은 변경할 수 없다.

import numpy as np

l = [1, 2, 3]
ll = np.array(l)

print(type(l))        # 출력 : <class 'list'>
print(l)            # 출력 : [1, 2, 3]
print(l * 3)        # 출력 : [1, 2, 3, 1, 2, 3, 1, 2, 3]
print(l + l)        # 출력 : [1, 2, 3, 1, 2, 3]

print(type(ll))        # 출력 : <class 'numpy.ndarray'>
print(ll)            # 출력 : [1 2 3]
print(ll * 3)        # 출력 : [3 6 9]
print(ll + ll)        # 출력 : [2 4 6]

너무 당연하게 요소를 붙이는 것이다라고 생각하지 말아야 한다.
numpy를 쓰면 수학적 계산이 가능하다.


여기까지 끝.