2-4. String and advanced function concept

유승우·2022년 5월 2일
0

문자열(string)


  • 시퀀스 자료형으로 문자형 data를 메모리에 저장

  • 문자 하나하나가 1byte의 메모리 공간을 사용

    • 1byte = 8bit = 2^8 = 256 까지 저장 가능
    • 컴퓨터는 문자를 직접적으로 인식 X
    • 이를 위해 2진수를 문자로 변환하는 표준 규칙을 정함
    • 언어 내에서도 표준이 있는데 우리나라의 경우 대부분 cp-949, UTF-8 를 표준으로 사용
  • 각 데이터 타입 별로 메모리 공간을 할당 받은 크기가 다르다.

    ex ) int 는 4byte , float 타입은 8byte 의 크기를 할당 받아 표현 범위의 차이가 크다.

인덱싱(Indexing)


  • 문자열의 각 문자는 개별 주소를 가지며, 이 주소를 사용해 할당된 값을 가져오는 것이 Indexing
  • List와 같은 형태로 데이터를 처리한다.
a = "abcde"
print(a[0],a[4])
>>> a e

슬라이싱(Slicing)


  • 문자열의 주소값을 기반으로 문자열의 부분값을 반환
Text = "Artificial Intelligence and Machine Learning"
print(a[0:6], " AND " , a[-9:])
>>> Artifi  AND  Learning

문자열 함수


함수명기능
len(a)문자열의 문자 개수를 반환
a.upper()대문자로 변환
a.lower()소문자로 변환
a.capitalize()첫 문자를 대문자로 변환
a.title()제목형태로 변환, 띄워쓰기 후 첫 글자만 대문자
a.count(’abc’)문자열 a에 ‘abc’가 들어간 횟수 반환
a.find(’abc’)문자열 a에 ‘abc’가 들어간 위치 처음 위치 반환
a.rfind(’abc’)문자열 a에 ‘abc’가 들어간 위치 중 마지막 위치 반환
a.startswith(’abc’)‘abc’로 시작하는 문자열 여부 반환
a.endswith(’abc’)‘abc’로 끝나는 문자열 여부 반환
a.isdigit()문자열 a가 숫자인지 아닌지 여부 반환
  • 문자열 선언은 큰 따옴표(””) 혹은 작은 따옴표(’’) 활용
    • 역슬래시( \ ) 는 문자열 구분자가 아닌 출력 문자로 처리
    • 큰 따옴표로 문자열 선언 후 작은 따옴표는 출력 문자로 사용
# "It's OK." 라는 문자열 선언
a = 'It\'s OK.'

a = "It's OK."
  • 두 줄 이상의 문자열 선언
    • 큰 따옴표 또는 작은 따옴표 세 번 연속 사용
a = """It's OK
		I'm Happy.
		See you."""

특수 문자


문자설명
\ [Enter]다음 줄과 연속임을 표현
\\ 문자 자체
\n줄 바꾸기
\tTAB 키
\eESC 키
\’‘ 문자
\”“ 문자
\b백 스페이스

Call by object reference


  • 파이썬의 어떤 함수내에서 parameter를 전달할 때 메모리를 어떻게 처리하는가?

  • 값에 의한 호출(Call by Value)

    • 함수에 인자를 넘길 때 값만 넘김
    • 함수 내에 인자 값 변경 시, 호출자에게 영향을 주지 않음
  • 참조에 의한 호출(Call by Reference)

    • 함수에 인자를 넘길 때 메모리 주소를 넘김
    • 따라서, 함수 내에 인자 값 변경 시, 호출자의 값 또한 변경이 됨
  • 객체 참조에 의한 호출(Call by Object Reference)

    • 파이썬은 객체의 주소가 함수로 전달되는 방식
def spam(eggs):
	eggs.append(1) # 햄과 에그는 같은 메모리 공간을 가르키기 때문에 1이 추가
	eggs = [2,3] # 새로운 객체 생성

ham = [0] # 햄은 0
spam(ham) # 스팸에 햄을 넣어서 햄이 에그가 됨
print(ham) # 따라서 햄은 [0,1]
>>> [0,1]

swap


  • 함수를 통해 변수 간의 값을 교환하는 함수
# 메모리는 고정 되어있기 때문에 전체 리스트에는 영향이 없다
def swap_value(x,y):
	temp = x
	x = y
	y = temp
  • swap_offset
    • 리스트의 전역 변수 값을 직접 변경
def swap_offset(offset_x,offset_y): 
	temp = a[offset_x]
	a[offset_x] = a[offset_y] # 좌변에 할당
	a[offset_y] = temp # 리스트 자체의 값을 만지기 때문에 변화가 일어난다
  • swap_reference
    • 리스트 객체의 주소 값을 받아 값을 변경

def swap_reference(list,offset_x,offset_y): # 리스트 값이 이미 들어가있고,
	temp = list[offset_x]
	list[offset_x] = list[offset_y] # 리스트의 메모리가 그대로 유지되기 때문에 변화가 나타난다
	list[offset_y] = temp 

Scoping rule


  • 지역변수 : 함수 내에서만 사용
def test(t):
	t = 20
	print("In Function :",t) # 20

x = 10
print("Before : ", x) # 10
test(x)
print("After : ", x) # 10
  • 전역변수 : 프로그램 전체에서 사용
    • 함수 내에 전역 변수와 같은 이름의 변수를 선언하면 새로운 지역 변수가 생긴다.
    • 전역 변수를 사용하기 위해 함수 내에 global 키워드 사용
def f():
	global s # 전역 변수 사용
	s = "I love London!" # 새로운 지역변수 생성
	print(s) # I love London!

s = "I love Paris!" 
f() # global에 의해 s의 변화가 나타남
print(s) # I love London!

Recursive functioin(재귀 함수)


  • 자기 자신을 호출하는 함수
  • 점화식과 같은 재귀적 수학 모형을 표현할 때 사용
def factorial(n):
	if n == 1:
			return 1
	else:
			return n * factorial(n-1)
print(factorial(int(input("Input Number of Factorial Calculation: "))))

Type hints


  • 사전에 parameter type과 return값에 대한 정보를 명시함으로써 사용자에게 인터페이스를 명확히 알려줄 수 있다.
  • 함수의 문서화시 parameter에 대한 정보를 명확히 알 수 있다.
  • mypy 또는 IDE, linter 등을 통해 코드의 발생 가능한 오류를 사전에 확인 할수 있다.
  • 시스템 전체적인 안정성을 확보할 수 있다.
def type_hint_example(name:str) -> str:
	return f"Hello, {name}"

Docstring


  • 함수 사용자의 이행도를 높이기 위해 파이썬 함수에 대한 목적, 파라미터, 설명 등을 사전에 작성

  • vscode에서 docstring generator를 통해 편리하게 작성할 수 있다.

함수 작성 가이드 라인


  • 기본적으로 함수는 간결하고 명확하게 작성할 것

  • 함수 이름에 함수의 역할,의도가 명확히 들어날 수 있도록 생성

  • 인자로 받은 값 자체를 바꾸지는 말 것 → 복사를 사용해 다룬다면 OK

  • 공통적으로 나타나는 부분과 복잡한 수식은 함수로 구현해 간결하게 나타내기

  • 컴퓨터보다는 사람이 이해할 수 있는 코드를 짜기

  • 코딩 컨벤션

    • 팀 혹은 프로젝트 마다 규칙을 정해 코드의 일관성을 띄어야 함

      ex ) 들여쓰기는 4space OR Tab , 불필요한 공백 피하기, 연산자는 1칸 이상 띄우지 않는다 등

0개의 댓글