Python 변수, 진수, if문, 논리 연산자, in, 바다코끼리 연산자
- 프로그래밍/Python
- 2022. 4. 30.
파이썬 데이터는 객체다
파이썬은 각 데이터 값(불리언, 정수, 부동소수점 숫자, 문자열, 자료구조, 함수 및 프로그램)을 메모리에 객체로 래핑한다.
리스트, 바이트배열, 셋, 딕셔너리는 가변객체이다
이 외에 모든것은 불변객체다.
데이터 값을 변경할 수 있는것 가변
일정하게 유지할 수 있는 것 불변
이것에 대한 설명은 밑에서 다시 하겠다.
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문에서도 사용가능하다