본문 바로가기
Python/네이버 부스트코스 AI BASIC 코칭스터디

[ AI 코칭스터디 ] 1주차 학습 ( String and advanced function concept )

by 2CHAE._.EUN 2022. 1. 21.

[ String and advanced function concept ]

 

문자열 ( String )

 

문자열( string ) : 시퀀스 자료형으로 문자형 데이터를 메모리에 저장

                      영문자 한 글자는 1byte의 메모리 공간을 사용

                          * 1 byte = 8 bits = 2^8 = 256 까지 저장 가능

                          * UTF-8에서 8은 8bits를 의미한다.

 

 

문자열의 각 문자는 개별 주소인 offset을 가진다. offset을 이용해서 할당된 값을 가져오는 것을 인덱싱이라 한다.

( List와 같은 형태로 데이터를 처리한다. → 문자열 slicing 가능,  ) 

 

len(a) 문자열의 길이 및 문자 개수 반환
a.upper() / a.lower() 문자열을 대문자 / 소문자로 변환
a.capitalize() 문자열의 첫 문자를 대문자로 변환
a.title() 문자열을 제목 형태로 변환
→ 띄어쓰기 후 첫 글자만 대문자
a.count('abc') 문자열에 인자값이 들어간 횟수 반환
a.find('abc')
a.rfind('abc')
문자열에 인자값이 들어간 offset 반환
a.startswith('abc') 문자열이 인자값으로 시작하는지 boolean 값 반환
a.endswith('abc') 문자열이 인자값으로 끝나는지 boolean 값 반환
a.isdigit() 문자열이 십진수로 변환이 가능한지 boolean 값 반환

 

ex) 인피니트 - Paradise 노래에서 'Paradise'가 몇번 나오는지 출력하는 함수 구하기

 

open으로 연 파일의 문자열을 한줄씩 읽기 위해서는 readline() 메소드를 활용

strip() 메소드는 양쪽 공백을 제거해준다. 

 

f = open('Paradise.txt', 'r', encoding="UTF-8")

my_lyric = ""
while True :
    line = f.readline()
    if not line :
        break
    my_lyric = my_lyric + line.strip() + "\n"
f.close()

count = my_lyric.lower().count('paradise')
print("Paradise 출력횟수 :", count) # 13

 

 


call by object reference

 

함수에서 Parameter를 전달하는 방식은 총 3가지가 존재.

Call by Value ( 값에 의한 호출 ) 함수에 인자를 넘길 때 값만 넘김.
함수 내에 인자값 변경시, 호출자에게 영향을 주지 않음
Call by Reference ( 참조에 의한 호출 ) 함수에 인자를 넘길 때 메모리 주소를 넘김.
함수내에 인자값 변경시, 호출자의 값도 변경됨
Call by Object Reference ( 객체 참조에 의한 호출 ) 객체의 주소가 함수로 전달되는 방식

 

파이썬은 객체의 주소가 함수로 전달되는 방식인 Call by Object Reference 이다.

전달된 객체를 참조하여 변경시 호출자에게 영향을 주나, 새로운 객체를 만들 경우 호출자에게 영향을 주지 않는다.

 

def spam(eggs):
    eggs.append(1) # 기존 객체의 주소값에 [1] 추가
    eggs = [2,3] # 새로운 객체 생성
    print(eggs) # [2, 3]

ham = [0]
spam(ham)
print(ham) # [0, 1]

 

ham이 spam()의 인자값으로 들어가게 되면 ham과 spam()의 파라미터인 eggs는 같은 주소를 가리키게 된다.

append 함수를 사용하면 ham과 eggs가 가리키고 있는 같은 주소에 [1]이 추가되지만 eggs = [2,3] 같이 

새로운 객체를 생성해 줄 경우는 eggs는 [2,3]이 들어있는 다른 주소를 가리키게 된다. 그래서 결과값은 [0,1]이다. 

 

 

* swap

 

1. 리스트 자체가 들어가지 않고 값들만 들어갈 경우는 각각의 값을 가리키는 주소만 바뀔 뿐 실제 값은 변하지 않는다.

   x, y에 들어가는 값들만 주소가 바뀌기 때문에 리스트의 자체에는 아무런 영향을 끼치지 않는다. 

def swap_value(x,y) :
    temp = x
    x = y
    y = temp

 

 

2. 리스트가 들어가지 않고 index 들만 들어가게 될 경우는 리스트 자체를 만지기 때문에 리스트의 값이 변한다. 

def swap_index(index_x, index_y):
    temp = ex[index_x]
    ex[index_x] = ex[index_y]
    ex[index_y] = temp

ex = [1,2,3,4,5]
swap_index(0,1)
print(ex) # [2, 1, 3, 4, 5]

 

3. index 뿐만 아니라 리스트도 같이 swap 함수에 전달할 경우는 리스트 전체 값이 들어가 있기 때문에

   리스트의 객체가 그대로 유지가 된다. 새로 할당을 안받았기 때문에 메모리의 주소가 그대로 유지된다. 

def swap_reference( list_ex, index_x, index_y) :
    temp = list_ex[index_x]
    list_ex[index_x] = list_ex[index_y]
    list_ex[index_y] = temp

ex = [1,2,3,4,5]
swap_reference(ex,1,4)
print(ex) # [1, 5, 3, 4, 2]

 

 

 


function - scoping rule

 

변수의 범위( Scoping Rule ) : 변수가 사용되는 범위

 

지역변수 ( Local Variable ) 함수 내에서만 사용
전역변수 ( Global Variable ) 프로그램 전체에서 사용

 

def game():
    g = "Lost Ark"
    print(g)

g = "Battle Ground"
game()
print(g)

# Lost Ark
# Battle Ground

 

전역변수와 지역변수는 같은 이름으로 선언될 수 있지만 같은 값이 아니다.

함수 내에 전역 변수와 같은 이름의 변수를 선언하면 새로운 지역변수가 생성된다. 

 

함수 내에서 전역변수를 사용할 경우 global 키워드를 사용해야한다.

def game():
    global g
    g = "Lost Ark"
    print(g)

g = "Battle Ground"
game()
print(g)

# Lost Ark
# Lost Ark

 

 


재귀함수 ( recursive function )

 

재귀함수는 자기 자신을 호출하는 함수이다. 재귀문이 종료하는 조건이 존재하며, 종료 조건까지 함수 호출을 반복한다.

 

def factorial(n) :
    if n == 0 :
        return 1
    else :
        return n * factorial(n-1)

number = int(input("숫자 입력 : "))
print(factorial(number))

 

 


function type hints

 

파이썬의 가장 큰 특징으로는 dynamic typing이 있다. 

function type hints는 동적 타입 언어인 파이썬에서도 정적 타입 언어처럼 자료형을 표시할 수 있게 해주는 기능이다.

 

def do_function(name : str) -> str :
    return name

 

type hints의 장점으로는 사용자에게 인터페이스를 명확하게 알려줄 수 있고, 함수의 문서화 시 파라미터에 대한

정보를 명확히 알 수 있다. 또한 시스템의 전체적인 안정성을 확보할 수 있다. 

 

 


docstring

 

docstring은 함수 사용자의 이해도를 높이기 위해서 파이썬 함수에 대한 상세한 설명을 사전에 작성하는 것이다.

함수의 목적을 사전에 정의해서 적을 수 있다. """로 함수명 바로 아래에 적어주면 된다.

 

def my_name(name) :
    """
    자기소개하는 함수입니다:)
    """
    return f"제 이름은 {name}입니다."