import sys # sys module을 호출
print(sys.getsizeof("a"), sys.getsizeof('ab'), sys.getsizeof('abc'))
50 51 52
#각 문자열의 메모리 사이즈 출력
a = "abcde"
a : 0100 1001
b : 0100 1010
c : 0100 1011
d : 0100 1100
e : 0100 1101
a = 'abcde'
print(a[0], a[4]) # a e
print(a[-1], a[-5]) # e a
문자열의 주소값을 기반으로 문자열의 부분값을 반환
print(a[0:6], a[-9:]) # a 변수의 0부터 5까지, -9부터 끝까지
print(a[:]) # a 변수의 처음부터 끝까지
print(a[-50:50]) # 범위를 넘어갈 경우 자동으로 최대 범위를 지정
print(a[::2], a[::-1]) # 2칸 단위로, 역으로 슬라이싱
- 문자열 연산 및 포함여부 검사
a = 'AAA' b = 'BBB' print(a + b) print(a * 2 + b * 2)
AAABBB
AAAAAABBBBBB
if 'A' in a: print(True) else: print(False)
True
len(x) : 문자열의 문자 개수를 반환
x.upper() : 대문자로 변환
x.lower() : 소문자로 변환
x.capitalize : 첫 문자를 대문자로 변환
x.title() : 제목형태로 변환, 띄워쓰기 후 첫 글자만 대문자
x.count('abc') : 문자열 a에 'abc'가 들어간 횟수 반환
x.find('abc') / x.rfind('abc') : 문자열 a에 'abc'가 들어간 위치(offset) 반환
x.startwith('abc') : 문자열 a는 'abc'로 시작하는 문자열인지 여부 반환
x.endwith('abc') : 문자열 a는 'abc'로 끝나는 문자열인지 여부 반환
x.strip() : 좌우 공백 제거
x.rstrip() : 오른쪽 공백 제거
x.lstrip() : 왼쪽 공백 제거
x.split() : 공백을 기준으로 나눠 리스트로 반환
x.split('abc') : abc를 기준으로 나눠 리스트로 반환
x.isdigit() : 문자열이 숫자인지 여부 반환
x.islower() : 문자열이 소문자인지 여부 반환
x.isupper() : 문자열이 대문자인지 여부 반환
print("""aaa
bbb
ccc""")
aaa
bbb
ccc
\ [Enter] : 다음 줄과 연속
print("aaa\
bbb") # aaabbb
\n : 줄 바꿈
\ : \ 출력
\t : tab 출력
\' : ' 출력
\" : " 출력
\b : back space
\e : esc
print(r"aaa\nbbb''")
aaa\nbbb\''
import wget
wget.download("https://raw.githubusercontent.com/TeamLab/introduction_to_python_TEAMLAB_MOOC/master/code/6/yesterday.txt")
- 노래 가사에 특정 단어가 나오는 횟수 구하기
f = open("yesterday.txt", 'r') yesterday_lyric = "" while True: line = f.readline() if not line: break yesterday_lyric = yesterday_lyric + line.strip() + "\n" f.close() n_of_yesterday = yesterday_lyric.upper().count("YESTERDAY") # 대소문자 구분 제거 print ("Number of a Word 'Yesterday'" , n_of_yesterday)
Number of a Word 'Yesterday' 9
함수에서 Parameter를 전달하는 방식
def spam(eggs):
eggs.append(1) # 3. 기존 객체의 주소값(ham과 eggs가 가리키는 메모리)에 [1] 추가 >> ham, eggs = [0, 1]
eggs = [2, 3] # 4. 새로운 객체 생성 >> ham = [0, 1] / eggs = [2, 3]
ham = [0] # 1. ham이라는 리스트가 만들어지고 하나의 메모리를 가리킨다
spam(ham) # 2. spam이라는 함수에 들어가서 eggs라는 걸로 받고 ham과 같은 메모리를 가리킨다
print(ham) # [0, 1]
Quiz: a = [1, 2, 3, 4, 5]일 때, 아래 함수 중 실제 Swap이 일어나는 함수?
a = [1, 2, 3, 4, 5] def swap_value(x, y): temp = x x = y y = temp swap_value(a[1], a[2]) # 주소만 바뀌기 때문에 a라는 리스트 자체는 영향이 없다 print(a) # [1,2,3,4,5]
def swap_offset(offset_x, offset_y): temp = a[offset_x] a[offset_x] = a[offset_y] a[offset_y] = temp swap_offset(1, 2) # 리스트 인덱스 자체를 건드리기 때문에 값이 바뀐다 print(a) # [1,3,2,4,5]
def swap_reference(list, offset_x, offset_y): temp = list[offset_x] list[offset_x] = list[offset_y] list[offset_y] = temp swap_reference(a, 1, 2) # 밖에 있는 객체(리스트)를 유지하면서 값을 바꿔준다 print(a) # [1,3,2,4,5]
- swap_offset : a 리스트의 전역 변수 값을 직접 변경
- swap_reference : a 리스트 객체의 주소 값을 받아 값을 변경
변수의 범위(Scoping Rule)
def test(t):
print(x) # 함수 밖의 x
t = 20 # 함수 내의 t, 새롭게 20이라는 값을 할당했으니 x라는 변수와는 관계가 없어진다
print ("In Function :", t)
x = 10
test(x)
print(t) # t는 지역변수이므로 밖에서는 존재하는 변수 취급 : NameError, not defined
10
In Function : 20
def test(t):
t = 20
print ("In Function :", t)
x = 10
print ("Before :", x) # 10
test(x) # 함수 호출
print ("After :", x) # 10 – 함수 내부의 t는 새로운 주소값을 가짐
Before : 10
In Function : 20
After : 10
def f():
s = "I love London!" # 지역변수 s를 바꾸는 것, 밖의 전역변수 s는 값의 변화가 없다
print(s)
s = "I love Paris!"
f()
print(s)
I love London!
I love Paris!
def f():
global s
s = "I love London!"
print(s)
s = "I love Paris!"
f()
print(s)
I love London!
I love London!
def calculate(x, y):
total = x + y # 새로운 값이 할당되어 함수 내 total은 지역변수가 됨
print ("In Function")
print ("a:", str(a), "b:", str(b), "a+b:", str(a+b), "total :", str(total))
return total
a = 5 # a와 b는 전역변수
b = 7
total = 0 # 전역변수 total
print ("In Program - 1")
print ("a:", str(a), "b:", str(b), "a+b:", str(a+b))
sum = calculate (a,b)
print ("After Calculation")
print ("Total :", str(total), " Sum:", str(sum)) # 지역변수는 전역변수에 영향 X
In Program - 1
a: 5 b: 7 a+b: 12
After Calculation
Total : 0 Sum: 12
def factorial(n):
if n == 1:
return 1
else:
return n * factorial(n - 1)
print(factorial(int(input("Input Number for Factorial Calculation: "))))
Type Hints의 장점
최근에는 black module을 활용하여 pep8 like 수준을 준수
black codename.py 명령을 사용
들여쓰기 Tab VS 4Space > 4Space 권장
명확한 규칙은 없다, 팀마다, 프로젝트마다 유동적으로, 중요한 건 일관성
한 줄은 최대 79자까지
불필요한 공백은 피하기
'='연산자는 한칸 이상 안 띄운다
주석은 항상 갱신, 불필요한 주석 삭제
코드의 마지막에는 항상 한 줄 추가
소문자 l, 대문자 o, 대문자 i 최소한으로 사용 > lIO0
함수명은 소문자로 구성, 필요시 밑줄로 구분
flake8 module로 체크 > flake8 <파일명>
conda install -c anaconda flake8
def print_hello_world():
print("Hello, World")
def get_hello_world():
return "Hello, World"
def add_variables(x,y):
return x + y
def add_variables(x,y): # 더하는 함수인데 print 기능을 포함
print (x, y)
return x + y
# before
def count_word(string_variable):
string_variable = list(string_variable) # 원래 호출된 값에 변화가 생길 수 있으니, 복사된 값을 사용
return len(string_variable)
# after
def count_word(string_variable):
return len(string_variable)
# before
a = 5
if (a > 3):
print "Hello World"
print "Hello Gachon"
if (a > 4):
print "Hello World"
print "Hello Gachon"
if (a > 5):
print "Hello World"
print "Hello Gachon"
# after
def print_hello():
print "Hello World"
print "Hello Gachon"
a = 5
if (a > 3):
print_hello()
if (a > 4):
print_hello()
if (a > 5):
print_hello()
# before
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))
# after
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))