

-> 1byte 로 표현할 수 있는 범위(ASCII Code)
import sys
print(sys.getsizeof("a"), sys.getsizeof("ab"), sys.getsizeof("abc"))
#50 51 52
-> sys 모듈을 import해서 getsizeof 메서드를 이용해, 각 메모리 사이즈를 출력해볼 수 있다.

-> 각 데이터 타입 별로 할당 받을 수 있는 공간의 크기가 다르다.

a = 'abcde'
print(a[0], a[4])
#a e
print(a[-1], a[-5])
#e a
>>> a = "Artificial Intelligence and Machine Learning"
>>> print (a[0:6], " AND ", a[-9:]) # a 변수의 0부터 5까지, -9부터 끝까지
Artifi AND Learning
>>> print (a[:]) # a변수의 처음부터 끝까지
Artificial Intelligence and Machine Learning
>>> print (a[-50:50]) # 범위를 넘어갈 경우 자동으로 최대 범위를 지정
Artificial Intelligence and Machine Learning
>>> print (a[::2], " AND ", a[::-1]) # 2칸 단위로, 역으로 슬라이싱
Atfca nelgneadMcieLann AND gninraeL enihcaM dna ecnegilletnI laicifitrA
-> 문자열의 offset 값을 기반으로 문자열의 부분값을 반환할 수 있다.
-> [a:b:c] : a부터 b-1까지 c 간격으로
>>> a = “TEAM"
>>> b = “LAB"
>>> print (a + " " + b) # 덧셈으로 a와 b 변수 연결하기
TEAM LAB
>>> print (a * 2 + " " + b * 2)
TEAMTEAM LABLAB # 곱하기로 반복 연산 가능
>>> if ‘A' in a: # ‘U‘가 a에 포함되었는지 확인
... print (a)
... else:
... print (b)
...
TEAM


1) 문자열 선언 시, 큰따옴표나 작은 따옴표를 활용하는데 이 때, 내가 이러한 문자들을 출력하고 싶으면 어떻게 해야할까?
백슬래쉬 활용 : 백슬래쉬 + ' 는 문자열 구분자가 아닌 '를 그대로 출력해줌
ex) a = 'It\'s Ok.' #It's Ok.
큰따옴표로 묶기 : 큰따옴표로 문자열 선언 후, 작은따옴표를 출력 문자로 사용.
ex) a = "It's Ok." #It's Ok.
2) 두 줄 이상의 문자열 표현은 어떻게 할까?

raw_string = "난 네부캠 ai-tech 8기에 합격한다. \n 레알"
print(raw_string)
#난 네부캠 ai-tech 8기에 합격한다.
# 레알
raw_string = (r"난 네부캠 ai-tech 8기에 합격한다. \n 레알")
print(raw_string)
#난 네부캠 ai-tech 8기에 합격한다. \n 레알
def spam(eggs) :
eggs.append(1)
eggs = [2, 3]
ham = [0]
spam(ham)
print(ham) #[0, 1]
흐름을 따라가 보자!
-> 기존 객체의 주소값에 [1]을 추가함 - eggs.append(1)
-> 새로운 객체 생성 - eggs = [2,3]
def swap_value (x, y):
temp = x
x = y
y = temp
def swap_offset (offset_x, offset_y):
temp = a[offset_x]
a[offset_x] = a[offset_y]
a[offset_y] = temp
def swap_reference (list, offset_x, offset_y):
temp = list[offset_x]
list[offset_x] = list[offset_y]
list[offset_y] = temp
a = [1, 2, 3, 4, 5]
#1
swap_value(a[0], a[1])
print(a)
#[1, 2, 3, 4, 5]
#2
swap_offset(0, 1)
print(a)
#[2, 1, 3, 4, 5]
#3
swap_reference(a, 3, 4)
print(a)
#[1, 2, 3, 5, 4]
#1.
x에 a[0] 값이 들어가고, y에 a[1] 값이 들어간다.
temp는 x, 즉 a[0]를 가리키게 되는데,
이때 값은 각각, 1와 2을 가리키고 메모리는 고정되어 있다.(-5~256)
그 다음 줄 코드에서, x는 a[1]를 가리키게 된다.
그 다음 줄 코드에서, y 는 temp를 가리킨다.
temp는 1을 가리키기 때문에 a[0]을 가리키게 된다.
리스트 자체가 들어가서 바뀌지 않고 값을,
변수가 가리키는 주소값만 계속 바뀌게 되는 것이다.
그렇기 때문에, 리스트 자체에는 전혀 영향을 주지 않는것이다.
#2.
offset만 주어진다.(함수 밖에 있는 리스트를 불러와서 쓴다.)
temp의 값에 리스트 a의 0번째 인덱스가 저장된다.
그 다음 코드에서 할당을 새롭게 해주는데,
리스트 자체를 다루기 때문에 a의 0번 인덱스 값을,
a의 1번 인덱스 값으로 새롭게 할당한다.
그리고 a의 1번 인덱스 값을 temp에 들어있던
값으로 새롭게 할당해준다.
#3.
세번째는 아예 reference list도 같이 넣어주는 것이다.
리스트 값이 함수에 들어가기 때문에,
이 리스트는 객체가 유지가 된다.
temp에 4가 저장되고,
그 다음 코드에서 a[3]은 5에 할당되고,
그 다음 코드에서 a[4]는 4가 들어가게 되면서
리스트에 변화가 생긴다.
파이썬 함수 내에서 객체내에서 함수의 메모리주소가 어떻게 유지가 되는지를 추적하라!
함수 내에서 뭔가를 쓸 때, 새로 들어온 값을 복사를 하는 것이 좋다!
예를 들면, 3번 예시에서라면 temp_list = a[:] 이런식으로.
되도록이면, 들어온 객체를 직접 만지지 않는 것이 좋다!
특히 append 같은거 값자체가 바뀌어버릴 수 있다.
Scoping Rule 이란?
def test(t):
print(x)
t = 20 #Local Variable
print ("In Function :", t)
x = 10 #Global Variable
test(x)
print(t)
def test(t):
t = 20
print ("In Function :", t)
x = 10
print ("Before :", x) # 10
test(x) # 함수 호출 # In Function : 20
print ("After :", x) # 10
def f():
s = "I love London!"
print(s)
s = "I love Paris!"
f()
print(s)
def f():
global s
s = "I love London!"
print(s)
s = "I love Paris!"
f()
print(s)
재귀함수 Recursive Function 이란?
def factorial(n):
if n == 1:
return 1
else:
return n * factorial(n-1)
print (factorial(int(input("Input Number for Factorial Calculation: "))))
위 코드를 for loop로 변경한다면?
def factorial(n) :
result = 1
if n == 1 :
return result
else :
for i in range(n, 1, -1) :
result = result * i
return result
def do_fuction(var_name : var_type) -> return_type :
pass
->
example)
def type_hint_example(name : str) -> str :
return f"Hello, {name}"
#example pytorch
def insert(self, index : int, module : Module) -> None :
r""" Insert a given module before a given index in the list.
Arguments :
index (int) : index to insert.
module (nn.Module) : module to insert
"""

함수 작성 가이드 라인
함수는 가능하면 짧게 작성할 것(최소 단위, 짧게 여러개).
함수 이름에 함수의 역할, 의도가 명확히 드러낼 것.
함수의 이름은 VO 형태로 많이 생성된다. V는 verb, O는 object
하나의 함수에는 유사한 역할을 하는 코드만 포함할 것.
#적절
def add_variables(x,y) :
return x + y
#부적절함
def add_variables(x,y) :
print(x, y)
return x + y
인자로 받은 값 자체를 바꾸지 말 것
(임시변수로 선언하거나 또는 복사해서 사용할 것)
#이것 보다는
def count_word(string_variable) :
string_variable = list(string_variable)
return len(string_variable)
# 이게 낫다는 거지
def count_word(string_variable) :
return len(string_variable)
공통적으로 사용되는 코드는 함수로 변환
복잡한 수식, 조건은 식별 가능한 이름의 함수로 변환할 것.
#이것 보다는,
import math
a = 1; b = -2; c = 1
print ((-b + math.sqrt(b ** 2 - (4 * a * c)) ) / (2 * a))
print ((-b - math.sqrt(b ** 2 - (4 * a * c)) ) / (2 * a))
#이게 낫다는 거지
import math
def get_result_quadratic_equation(a, b, c):
values = []
values.append((-b + math.sqrt(b ** 2 - (4 * a * c)) ) / (2 * a))
values.append((-b - math.sqrt(b ** 2 - (4 * a * c)) ) / (2 * a))
return values
print (get_result_quadratic_equation(1,-2,1))

