Python 변수, 진수, if문, 논리 연산자, in, 바다코끼리 연산자

파이썬 데이터는 객체

파이썬은 각 데이터 값(불리언, 정수, 부동소수점 숫자, 문자열, 자료구조, 함수 및 프로그램)을 메모리에 객체래핑한다.

 

리스트, 바이트배열, 셋, 딕셔너리는 가변객체이다

이 외에 모든것은 불변객체다.

데이터 값을 변경할 수 있는것 가변

일정하게 유지할 수 있는 것 불변

이것에 대한 설명은 밑에서 다시 하겠다.

 

y = 5
x = 6
print(id(y))
print(id(x))

a = y
print(id(a))

위와 같이 입력하면 y와 a는 같은 값이 나오게 되고

x는 다른값이 나오게된다.

 

파이썬에서는 이미 만들어진 값을 재 할당하면 C언어에서의 포인터처럼 주소값을 넘겨주게 되어 있다.

그래서 하나의 변수에 2개가 참조하고 있는것이다.

 

y = 5
x = 12 - y
print(x)

이 코드를 실행 했을 때 컴퓨터 동작은 이러하다.

 

1. 값 5인 정수 객체를 생성한다.

2. 변수 y가 객체 5를 가리키도록 한다

3. 값 5인 객체의 참조 횟수를 증가 시킨다. (참조 횟수가 0이 되면 5객체는 사라지게 된다.)

4. 값이 12인 다른 정수 객체를 생성한다.

5. (익명) 객체의 값 12와 변수 y가 가리키는 값 5를 뺀다.

6. 값 7은 이름이 없는 새 정수 객체에 할당된다.

7. 변수 x가 새 정수 객체를 가리킨다

8. (익명) 객체의 값 12는 참조횟수가 0이여서 객체가 사라진다.

9. x가 가리키는 새로운 객체의 참조 횟수를 증가시킨다.

10. x가 가리키는 객체 값 7을 찾아서 출력 한다.

 

y = 5 다음에 y = 6을 대입하면 어떻게 될까?

 

1. 값 5인 정수 객체를 생성한다.

2. 변수 y가 객체 5를 가리키도록 한다.

3. 값 6인 정수 객체를 생성한다.

4. 변수 y는 새로운 값 객체 6을 가리키도록 한다.

5. 객체 5는 참조횟수가 0이여서 사라지게 된다.

 

왜 이렇게 작동할까?

내가 위에서 리스트, 바이트배열, 셋, 딕셔너리는 가변객체고 나머지는 다 불변객체라고 말을 했다.

상수 5는 불변객체라서 값을 변경할 수 없어 다시 객체를 만드는 것이다.

이해가 되었나?

 

 

x = 5
print(id(x))

y = x
print(id(y))

x = 29
print(id(x))
print(id(y))

이렇게 했을 때

1,2,4번째 출력은 같게 나오고 3번째 출력만 다르게 나오는것을 확인 할 수 있다.

왜냐 ? 상수는 불변 객체이기 때문이다.

 

리스트의 경우도 알아보자

리스트는 나중에 다시 자세하게 알아보고 일단 기초적인것만 알아보자.

 

a = [2,4,6]
b = a
print(id(a))
print(id(b))

a[0] = 99
print(id(a))
print(id(b))
print(a)
print(b)

리스트는 가변객체라 값 변경이 가능하다

값을 바꾼다고 해도 객체가 생성이 되지 않는다.

 

 


n = 1_000_000
print(n)

이렇게 우리가 보기 편하게 _ 을 이용해 값을 대입할 수 있다

 

print(9 / 5) # 1.8
print(9 // 5) # 1

/ 나눗셈이지만 // 결과가 정수로 나오게된다.

 

print(divmod(9,5)) # (1, 4)

divmod를 사용하게 되면 몫과 나머지가 나오게 된다.

 

print(2**3) # 8

**연산자는 제곱 연산자이다

 

a = 95
a = a - 3

위이 코드는 컴퓨터가 어떻게 작동하는지 생각을 해보자.

 

1. 95 정수 객체를 생성한다.

2. a는 95객체를 바라본다.

3. 3 정수 객체를 만든다

4. 95 - 3 계산을 한다.

5. 결과값 92라는 객체를 생성한다.

6. a는 92객체를 바라본다.

 

이렇게 된다.

 


print(0b10) #10을 2진수로 출력
print(0o10) #10을 8진수 출력
print(0x10) #10을 16진수로 출력

a = 65
print(bin(a)) # 2진수 출력
print(oct(a)) # 8진수 출력
print(hex(a)) # 16진수 출력
print(chr(65)) # A출력
print(ord('A')) # 65출력

chr은 정수를 아스키코드로 변환해준다.

ord는 문자를 아스키코드로 변환해준다.

 

print(int('100', 2)) # 문자 100을 2진수로 변환을 해 정수로 출력
print(int('100', 8)) # 문자 100을 8진수로 변환을 해 정수로 출력
print(int('100', 16)) # 문자 100을 16진수로 변환을 해 정수로 출력

sum = 1 + \
    2 + \
    3 + \
    4
print(sum)

코딩을 하다보면 코드가 길어질때가 있다

이때 \(백슬래시)를 이용해 위와 같이 사용하면 된다.

 

disaster = True
if disaster :
    print("Woe!") #disaster이 True라면 실행
else:
    print("Whee!") # 조건에 만족하는게 없으면 실행
    
furry = True
large = True
if furry:
    if large:
        print("It's a yeti")
    else:
        print("It's a cat!")
else:
    if large:
        print("It's a whale!")
    else:
        print("It's a human. Or a hairless cat")

#조건에 2개 이상이라면 밑에 방법을 쓴다.
color = "mauve"
if color == "red":
    print("red")
elif color == "green":
    print("green")
else:
    print("mauve")

 


x = 7
print(5 < x and x < 10)
print(5 < x or x < 10)
print(5 < x and not x < 10)

#파이썬에서는 이렇게도 허용한다.
print(5 < x < 10)

파이썬에서는 False값을 밑에와 같이 표현하기도 한다.

0 , none , 0.0 , ' ' , [ ] , ( ) , { } , set()

 

some_list = []
if some_list:
    print("There's something in  here")
else:
    print("Hey, it's empty!") # 출력

어떤 문자열에 모음(a, e, i, o, u)이 있는지 확인하려면 어떻게 해야 할까?

위의 or 연산자를 이용해서 하면 코드가 너무 길어지게 된다.

파이썬에서는 멤버십 연산자 in 을 사용할 수 있다.

 

vowels = "aeiou"
letter = 'o'
print(letter in vowels)

if letter in vowels:
    print(letter, 'is a vowels')

파이썬 3.8 이상에서는 바다코끼리 연산자(:=)를 사용할 수 있다.

이름 := 표현식

 

tweet_limit = 280
tweet_string = "Blah" * 50
diff = tweet_limit - len(tweet_string)
if diff >= 0:
    print("A fitting tweet")
else:
    print("Went over by", abs(diff)) #ads()절댓값 표시
    
#바다코끼리 연산자 이용 버전
tweet_limit = 280
tweet_string = "Blah" * 50
if diff := tweet_limit - len(tweet_string):
    print("A fitting tweet")
else:
    print("Went over by", abs(diff))

바다코끼리 연산자를 사용하면 할당과 비교를 동시에 할 수 있다.

for문과 while문에서도 사용가능하다

댓글

Designed by JB FACTORY