본문 바로가기

부스트캠프 AI Tech 3기/이론 : U-stage

[Day2] Python 2-4. String and advanced function concept : String, Call by Object Reference, Function, Recursive Function, Fuction type hints, Docstring, 함수 작성 가이드라인, 좋은 코드 쓰는 법

String

  • 문자형 데이터
  • 시퀀스 자료형
  • 한 글자에 1byte(=8bit =256까지 표현 가능) 차지

1. Indexing

문자열의 각 문자 하나하나가 list의 element처럼 생각하면 된다

각 문자는 개별 주소(offset)을 갖는다

s='asdf'
print(s[-2])
>>>d

2. Slicing

a='Last Checkpoint: 5시간 전(unsaved changes)'
a[15:30]
>>>': 5시간 전(unsaved'

주소값을 기반으로 문자열의 일부만 가져올 수 있다

 

3. 포함 여부 검사

s='asdf'
'f' in s
>>>True

 

4. 문자열 함수

엄청 많은 문자열 함수가 있다

잘 활용하자,,

  • isdigit()
  • title()
  • split()
  • lower()
  • count()

5. 문자열 표현

  • '문자열'
    중간에 ' 가 들어간 문자열이라면 역슬래쉬 \를 앞에 붙혀준다.
    s='I\'m angel'​
    jupyter에서는 역슬래쉬가 \로 나타난다

  • "문자열"
    s="I'm angel"
    print(s)​
    큰 따옴표로 이 문제를 간단히 해결할 수도 있다.
  • 특수문자
    \n \t \\ \' \" \b \<enter>
    줄 바꾸기 개행 tab \ ' " 백스페이스 다음 줄과 연속임
  • raw string
    raw_string=r'raw string에서는 특수문자를 무시합니다 \\ \n'
    print(raw_string)
    >>>raw string에서는 특수문자를 무시합니다 \\ \n​
     문자열 앞에 r을 붙히면 특수문자가 무시된다.

Call by Object Reference

1. 함수에서 parameter를 전달하는 방식

  • 값에 의한 호출 : call by value
    값만 전달하는 방식
    함수 내에서 인자 값을 변경해도 원래 값은 영향을 받지 않게 된다.
    def plus2(x):
    	x+=2
        
    a=2
    plus2(a)
    print(a)
    >>>2


  • 참조에 의한 호출 : call by reference
    주소를 전달하는 방식
    함수 내에서 인자 값을 변경할 때 원래 값도 변경 된다.
    마치 c언어의 포인터처럼!

  • 객체 참조에 의한 호출 : call by object reference
    객체의 주소가 함수의 인자로 전달되는 방식
    def extend1(list):
    	list.append(1)
        
    original=[0]
    extend1(original)
    print(original)
    >>>[0, 1]​
    함수 내에서 list의 주소가 연결되어 그 주소값에 1이 추가되어 함수밖의 원래 리스트도 영향을 받는다리스트의 메모리 방식을 알고 있으면 이해하기 편하다

그래서 함수 내에서 값을 받자마자 복사해서 사용하서나 리스트 자체를 만지지 않게 하는 것이 가장 좋다

 

Function : Scoping rule

변수가 사용되는 범위

1. Scoping rule

  • 지역변수 : local variable
    함수 내에서만 사용하는 변수
  • 전역변수 : global vaiable
    메인 프로그램 전체에서 사용하는 변수
def to20(x):
    print("1: ",x)
    x=20
    print("2: ",x)
    
x=10
to20(x)
print("3: ",x)
>>>1:  10
2:  20
3:  10

함수 내에서 사용하는 x를 바꾼다 해서 전역변수 x는 영향을 받지 않고 10으로 다시 나오는 것을 확인할 수 있다

 

2. global 키워드

함수 내에서 전역변수를 가져다가 사용하기 위해서 변수 앞에 global이라는 키워드를 붙혀준다.

def to20():
    global x
    print("1: ",x)
    x=20
    print("2: ",x)
    
x=10
to20()
print("3: ",x)
>>>1:  10
2:  20
3:  20

 

Recursive Function

재귀함수 : 자기 자신을 호출하는 함수

종료조건 전까지 자기 자신(재귀함수)를 반복해서 호출한다

 

def plusto1(n):
    if n==1:
        return 1
    else:
        return n+ plusto1(n-1)
    

n=int(input('-->'))
print(plusto1(n))

수 하나를 입력하면 그 수부터 1까지의 합을 구하는 재귀함수이다.

재귀함수는 for문으로 대체할 수도 있다

 

Fuction type hints

dynamic typing이라는 특성을 파이썬이 가져서

함수를 사용할 때 어떤 타입을 넣을 지 interface를 알기 어렵다

그래서 function을 정의할 때 파라미터의 type과 return type을 제공할 수 있다

def <함수 이름>(<변수이름>:<변수 타입>) -> <return할 변수 타입>:
	명령문

이런 형식으로 할 수 있다

def hint(age:int)->int:
    return 2022-age+1

예시이다

 

Docstring

함수에 대한 설명과 목적을 미리 적을 수 있다.
reference

 

Python Docstrings (With Examples)

Python docstrings are the string literals that appear right after the definition of a function, method, class, or module. Let's take an example. Example 1: Docstrings def square(n): '''Takes in a number n, returns the square of n''' return n**2 Here, the s

www.programiz.com

def hint(age:int)->int:
    ''' 2022년 기준 현재 나이를 알려주는 함수'''
    return 2022-age+1

'를 3번 눌러서 적을 수 있다.

파라미터에 대한 설명과 리턴에 대한 설명 등 더 자세하게 적는 경우도 많다

 

vscode에서는 extension에서 'Python docstring generator'을 설치한 후에

ctrl+shift+p를 눌러 doctring generator를 찾으면 바로 form을 넣을 수 있다. hint를 적으면 그 내용까지 포함해서 만들어준다.

 

함수 작성 가이드라인

  • 함수는 짧게 여러 개
  • 이름은 v(verb:동사) + o(object:목적어) 순으로 나타내어 역할, 의도가 드러나게 작성한다
    단어를 연결할 시에 언더바 '_'를 주로 사용
  • 인자로 받은 값 자체를 바꾸지 말고 임시변수로 처음에 copy해서 사용하는 편이 좋다
  • 공통적으로 여러 번 사용하는 코드를 함수로 만드는 것이 좋다
  • 복잡한 수식이나 공식, 조건
    함수의 이름을 보고 다른 사용자가 유추할 수 있다

좋은 코드 쓰는 법

코딩을 혼자 하는 경우는 거의 없기 때문에 다른 사람이 이해할 수 있는 코드를 작성하는 것이 좋다.

코딩 컨벤션을 사용해서 한 팀 내에서는 일관성을 유지하는 것이 좋다.

구글 python convention

 

styleguide

Style guides for Google-originated open-source projects

google.github.io


구글 convention을 참고하자

 

  • 들여쓰기
  • 한 줄 최대 몇 자까지
  • 주석 유지 삭제
  • 마지막임을 표시
  • I1l 0O 등 헷갈리는 문자
  • 함수명, 변수명 등

PEP8

 

PEP 8 -- Style Guide for Python Code

The official home of the Python Programming Language

www.python.org

pep8에 맞추어 적었는지 확인하는 anaconda에 flake8로 코드를 검사해볼 수 있다

수정 추천 사항을 출력해준다

conda install flake8

flake8 파일이름

 

black이라는 모듈은은 수정사항을 알아서 고쳐준다

conda install black

black 파일이름

black은 pep8과 비슷한 수준으로 고쳐준다.