스터디/파이썬 스터디 강의자료

[2팀/김가림, 최다예] 5차시 파이썬 스터디 - 함수

omomirg 2023. 4. 6. 10:24

 

5차시_함수_강의자료.pdf
3.40MB
5차시_함수_과제.pdf
0.13MB

 

 

함수

참고도서 : 데이터 과학을 위한 파이썬 프로그래밍, 최상철

함수기초

  • 들어가기 앞서
    1. 다 같이 모여 토론하며 한 줄 한 줄 작성
    2. 가장 잘하는 사람이 혼자 작성
    3. 필요한 부분을 나누어 작성한 후 합치기
    가장 좋은 방법 2번, 일반적으로 사용하는 방법 3번 팀원들이 각자 해야 할 부분을 나눠서 하고 나중에 합치는 것오늘은 그 중 함수를 배울 예정
  • 프로그램을 만들 때 작성해야 하는 부분을 나누기 위해 파이썬에서는 함수, 객체, 모듈을 제공함
  • 여러명이 프로그램을 개발할 때, 코드를 어떻게 작성하면 좋을까 ?
  • 함수의 개념과 장점
    • 함수(function) : 어떤 일을 수행하는 코드의 덩어리, 코드의 묶음
    • ex. 도형의 넓이를 구하는 프로그램에서 사각형의 넓이를 구하는 작업이 있다면, 해당 작업을 함수화하여 필요할 때마다 호출하는 것
    • 함수의 장점
      • 필요할 때 마다 호출 가능 : 함수는 반복적으로 수행해야 하는 업무를 한 번만 작성해놓고 필요할 때 마다 호출하여 사용 가능, 같은 작업 여러번 반복 불필요
      • 논리적 단위로 분할 가능 :
        ㄴ 곱셈 실행 코드,ㄴ 나눗셈 실행 코드,.
      • .
      • .
      • ㄴ 덧셈 실행 코드,
      • < 도형 계산 프로그램 >
      • 코드의 캡슐화 :
        • 인터페이스 정의인터페이스가 잘 정의된 함수라면 코드의 내부 구조를 몰라도 함수를 사용하는 데에는 아무 문제가 없음
        • 코드에 입력(input)되는 값과 코드의 수행 결과인 출력(output)되는 값을 명확히 한다는 것, 흔히 블랙박스라고도함
      • 함수의 인터페이스만 잘 정의하면 다른 사람이 자신의 코드를 쉽게 가져다 사용할 수 있음
  • 함수의 선언def : definition의 준말, 함수의 정의를 시작한다는 의미
    • 함수 이름 규칙
      • 소문자로 입력
      • 띄어쓰기를 할 경우에는 기호 사용 ex. save*_*model
      • 작업을 나타내기 위해 동사와 명사를 함께 사용하는 경우가 많음 ex. find_number
      • 외부에 공개하는 함수일 경우 줄임말을 사용하지 않고 짧고 명료한 이름으로 정한다
    매개변수 : parameter, 함수에서 입력값으로 사용하는 변수, 1개 이상의 값 적을 수 o
    def calculate_rectangle_area(x, y) 
        return x * y
    
    함수이름 : def calculate_rectangle_areareturn : 반환한다는 의미, x, y를 곱한 값을 반환하는 함수로 이해</aside>f(x) = x + 1 일 때 f(1) = 2 즉, 함수 f(x)에서 x에 1이들어가면 2가 반환되는 것
  • 수학에서 x에 해당하는 것이 매개 변수, 즉 입력값이고 x+1의 계산 과정이 함수 안의 코드며 그 결과가 반환되는 값
  • 수학에서 함수와 같은 개념이라 생각 !
  • <aside> 💡 반환이란 ?
  • 매개변수 : x, y
  • 명령문 : 명령문은 반드시 ‘들여쓰기’한 후 코드 입력 (for문, if문, … ect 일반적인 코드)
  • 함수이름 : 개발자 마음대로 지정 but 규칙 존재
  • def 함수_이름 (매개변수 #1...): 명령문1 명령문2 return <반환값>
  • 함수의 실행 순서
    사각형 x의 길이 : 10
    사각형 y의 길이 : 20
    사각형 넓이 : 200
    
    <aside> ⚠️ 함수의 선언 부분을 코드의 맨 마지막에 입력할시 해당 코드 호출에 오류 발생def … : 함수 정의, 해당 코드를 메모리에 업로드해 다른 코드를 호출해 사용할 수 있도록 준비과정 거침print("사각형의 넓이:", calculate_rectangle_area(rectangle_x, rectangle_y)) : 정의한 함수 실행, 결과값 출력
  • rectangle x … : 2개의 변수에 값이 할당, 그 후 print문 실행
  • </aside>
  • def calculate_rectangle_area(x, y): return x * y rectangle_x = 10 rectangle_y = 20 print("사각형 x의 길이:", rectangle_x) print("사각형 y의 길이:", rectangle_y) # 넓이를 구하는 함수 호출 print("사각형의 넓이:", calculate_rectangle_area(rectangle_x, rectangle_y))
  • 프로그래밍의 함수와 수학의 함수f(x) = x + 1<math>f(2) =. 1, g(2) = 4, f(g(2)) = 15, g(f(2)) =. 21<programing>
    151
    
    • 매개 변수(parameter)와 인수(argument)
      11
      
      def f(x)의 x : 매개변수매개변수는 함수의 인터페이스 정의에 있어 어떤 변수를 사용하는지 정의하는 것
      • 인터페이스
      • 사용자가 기기를 쉽게 동작시키는데 도움을 주는 시스템
      f(2)의 2 : 인수둘 모두 함수의 입력값으로 부르기도 한다 하지만 정확한 의미를 파악하고 사용할 것을 권장 !
    • 매개변수가 설계도라면 인수는 구분 없이 사용하는 경우가 많으며,
    • 일반적으로 함수의 입력값에 대한 정의를 함수 사용에 있어 인터페이스를 정의한다고함
    • def f(x): return 2*x+7 print(f(2))
  • def f(x): return 2*x+7 def g(x): return x**2 x = 2 print(f(x)+g(x)+f(g(x))+g(f(x))
  • 11 + 4 + 15 + 121 = 151
  • f(x) = 2x + 7, g(x) = x**, x = 2 일 때, f(x) + g(x) + f(g(x)) + g(f(x))의 값은 ?
  • 프로그래밍에서의 함수와 수학에서의 함수는 매우 유사
  • 함수의 형태
    • a_ractangle_area() :이 경우에는 a_ractangle_area()가 35로 치환되는 것이 아니고, 반환값이 없기에 함수 자체는 none값을 가짐, 대신 내부 함수 print()함수로 인해 35 출력
    • 입력값도 없고 반환되는 값도 없지만 print(5*7)에 의해 35가 출력된다.
    • b_ractangle_area() :반환값이 없기에 매개 변수 자리에 값을 넣어줘야 해당 값 실행, 반환이 없으면 해당 함수는 none으로 치환됨
    • b_ractangle_area()가 매개변수로 x,y를 넘겨 받고, 그 값을 계산하여 화면에 출력하는 함수
    • x_ractangle_area(), d_ractangle_area(x,y :즉, return문으로 인해 35로 치환 되는 것
    • 이렇게 return이 있는 경우, 즉 함수의 반환값이 있는 경우에는 그 함수를 호출 하는 곳에서서 함수의 반환값을 변수에 할당하여 사용하는 것이 가능
    • c_ractangle_area(), d_ractangle_area() 함수 모두, 함수 안에서 print()함수를 수행시키는 것이 아닌 함수를 호출할 때 print()함수 이용
  • 35 35 35 35
  • def a_ractangle_area(): # 매개변수 x, 반환값 x print(5*7) def b_ractangle_area(): # 매개변수 o, 반환값 x print(x*y) def x_ractangle_area(): # 매개변수 x, 반환값 o return(5*7) def d_ractangle_area(x,y): # 매개변수 o, 반환값 o return(x*y) a_ractangle_area() b_ractangle_area(5,7) print(c_ractangle_area()) print(d_ractangle_area(5,7))
  • 함수는 매개변수와 반환값의 유무에 따라 네 가지 형태로 구분

함수 심화

  • 함수의 호출 방식
    9
    3
    
    f(x)에 5와 3이 입력됨,이렇게 함수 안에서 변수가 인수의 형태로 입력 될 때 변수를 호출하는 방식을 프로그래밍에서는 다음과 같이 크게 두 가지로 나눈다메모리 주소는 변수가 저장되는 공간을 가르키고, 그 공간 자체에 새로운 값을 할당하면 그 공간을 가리키고 있는 다른 변수에도 영향을 준다.즉 새로운 값을 할당하거나 해당 객체를 지울 때는 영향을 주지 않지만 단순히 해당 객체 에 값을 추가할 때는 영향을 준다
    [0, 1]
    
    먼저 ham이라는 리스트를 만들고, 함수 spam에 ham을 인수로 입력한다.ham과 eggs는 함수의 호출 방식으로 객체를 호출하고 있기에 같은 주소 공유eggs = [2, 3]으로 새로운 리스트를 만들어준다.그리고 함수를 빠져나와 print(ham)이 실행되면 eggs.append(1)에 의해 추가된 [0, 1]이 화면에 출력된다.
  • 새로운 값을 할당하기 전까지는 기존에 넘어온 인수 객체의 주소값을 그대로 사용하는 방식 이라고 이해하면 됨
  • 이것이 바로 객체 호출(call by object reference)이라는 파이썬의 함수 내부 변수 호출 방식이다.
  • 그래서 더이상 ham과 eggs가 같은 메모리 주소를 가리키지 않고 eggs는 자기만의 메모리 주소를 가지게 된다.
  • 따라서 eggs. append(1)에 의해 해당 리스트에 1 이 추가되면 ham과 eggs 모두 영향을 받는다
  • 이때 함 수 안에서는 이름이 ham에서 eggs로 바뀐다.
  • def spam(eggs): eggs.append(1) # 기존 객체의 주소값에 [1]추가 eegs = [2, 3] ham = [0] spam(ham) print(ham)
  • 파이썬에서는 객체의 주소를 함수로 넘기기 때문에 전달된 객체의 값에 변경이 있을 경우,
  • 파이썬은 객체의 주소가 함수로 넘어간다는 뜻의 객체 호출 방식을 사용
  • 즉, 위의 코드에서 만약 참조 호출로 적용된다면 맨 마지막에 있는 X의 값은 5로 변환되어야 한다. but 파이썬은 전통적인 두 가지 방식을 혼합한 조금은 특이한 방식을 사용하고 있다.
  • 그렇다면 함수 안에서의 x와 밖에서의 x는 같은 변수일까?
  • def f(x): y = x x = 5 return y*Y x = 3 print(f(x)) print(x)
  • 변수의 사용 범위함수 내부에서 사용할 것인지, 또는 프로그램 전체에서 사용할 것인지 그 범위를 결정하는 규칙
    • 변수 사용범위 결정시 고려해야할 변수
      • 지역변수(local variabl) : 함수 내부에서만 사용
      • 전역변수(global variabl) : 프로그램 전체에서 사용
      def test(t):
          print(x)
          t = 20
          print('In Function:', t)
      
      x = 20
      test(x)
      print('In Main:', x)
      print('In Main:', t)
      
      10
      In Function : 20
      In Main : 10
      Traceback (most recent call last):
          File "scoping_rule.py", line 9, in <module> 
              print("In Main:", t) 
      NameError: name 't' is not defined
      
      프로그램이 가장 먼저 시작되는 지점은 x= 10그렇다면 함수 내부에서 처음 만나는 print(x)의 x는 어떤 변수일까?즉, 프로그램 전체에서 사용할 수 있는 전역 변수이다.즉, 함수 내부에서는 x를 따로 선언한 적은 없고, t를 선언해 사용but 함수가 종료되고 코드에 print('In Main:’, t)가 실행되면 오류가 출력된다. 왜냐하면 t가 함수 내부에서만 사용할 수 있는 지역 변수이기 때문
      I love London!
      I love Paris!
      
      s = 'I love London!' : 지역 변수
      def f():
          global s
          s ="I love London!
          print(s)
      
      s = "I love Paris!"
      f()
      print(s)
      
      I love London! 
      I love London!
      
      기존의 s에는 ‘I love Paris!’가 저장되어 있는데그래서 이전과 달리 함수 내부와 외부에 있는 s는 같은 메모리 주소를 사용하게 된다.
      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))  # 지역 변수는 전역 변수에 영향을 주지않음
      
      In Program - 1
      a:5b:7a+b:12
      In Function
      a:5 b:7 a+b:12 total:12
      After Calculation
      Total:0 Sum:12
      
    • 따라서 해당 메모리 주소에 새로운 값인 ‘I love London!’이 할당되면 함수 외부의 s에도 해당 값이 할당되어 이와 같은 결과가 출력되는 것이다
    • f() 함수 내부의 코드가 수행되는 순간 global s가 선언되어 함수 외부의 s, 즉 전역 변수 s의 메모리 주소를 사용한다.
    • s = 'I love Paris!' : 전역 변수
    • def f(): s = 'I love London!' print(s) s = 'I love Paris!' f() print(s)
    • 그리고 t = 20 에 의해 t에 20이 할당되고, 실제로 4행 print('In Function:’, t)의 결과로 In Function: 20이 화면에 출력되는 것을 예상할 수 있음
    • test(x) 함수의 x를 t로 치환하여 사용
    • 이때의 x는 함수 내부에서 재 정의되지 않았기에 함수를 호출한 메인 프로그램에서 정의한 x = 10의 x를 뜻함
    • x = 20의 x는 test(x) 함수의 인수로 넘어간다.
  • 변수의 사용 범위 : 변수가 코드에서 사용되는 범위
  • 재귀 함수재귀적이라는 표현은 자신을 이용해 다른 것을 정의한다는 뜻, 재귀 함수는 수학의 점화식과 같은 형태
    def factorial(n):
        if n ==1:
            return 1
        else:
            return n*factorial(n-1)
    
    print(factorial(int(input('In Number for Factorial Calculation: '))))
    
    In Number for Factorial Calculation: 5 < 사용자 입력
    120 < 화면 출력
    
    < 코드 실행 과정 >위의 함수는 for문이나 while문으로도 얼마든지 표현 가능반복문에서도 마찬가지로 종료 조건과 반복문마다 동일한 연산이 진행되기 때문 재귀 함수를 잘 사용하는 것은 매우 중요 ! !
  • 고급 프로그래머로 갈수록 재귀적으로 작성된 프로그램을 자주 접하게 되므로 개념적으로 이해하고 있어야 함
  • 재귀 함수의 기본 구조가 종료 조건, 단계별 반환으로 구성되어 있으므로 크게 변경 없이도 사용할 수 있음
  • 5 * factorial(5 - 1) = 54 factorial(4 - 1) = 543* factorial(3 - 1) = 5432 factorial(2 -1) =54321
  • 재귀 함수 (recursive function): 자기 자신을 다시 호줄

함수의 인수

  • 인수
  • 인수(argument) : 함수의 입력으로 들어가는 변수의 다양한 형태
  • 키워드 인수함수에 입력되는 매개변수의 변수명을 사용해 함수의 인수를 지정하는 방법
    Hello TEAM LAB, My name is Sungchul HeUo TEAMLAB, My name is Sungchul
    
    print_something() 함수는 (my_name, your_name)이라는 입력 인터 페이스를 가짐but 함수의 입력 변수명만 정확히 기재된다면 순서에 상관없이 원하는 변수에 인수를 넣을 수 있음즉 입력되는 순서에 상관 없이 ‘Sungchul’은 my_name, ‘TEAMLAB’은 your_name으로 할당됨, 따라서 두 함수에 대한 2가지 호출 코드의 실행 결과가 동일하게 출력됨
  • print_something(your_ name = ‘TEAMLAB’, my_name = ‘Sungchul’)을 보면 함수의 인수에서 사용되는 각각의 변수명을 명시함으로써 해당 변수에 값이 할당될 수 있도록 처리하였다.
  • 일반적으로 함수를 호출할 때 인수가 순서대로 입력되도록 코드 작성해야됨print_something(’Sungchul’, ‘TEAMLAB’)에서 ‘Sungchul’은 my_name, ‘TEAMLAB’은 yoiir_name에 할당
  • def print_something(my_name, your_name): print('Hello {}, My name is {1}'.format(your_name, my_name)) print_something('Sungchul', 'TEAMLAB') print_something(your_name = 'TEAMLAB', my_name = 'Sungchul')
  • 키워드 인수(keyword arguments):
  • 디폴트 인수매개변수에 기본값을 지정하여 사용하고, 아무런 값도 인수로 넘어가지 않을 때 지정된 기본값을 사용하는 방
    Hello TEAMLAB, My name is Sungchul
    Hello TEAMLAB, My name is Sungchul
    
    def print_something_2(my_name, your_name = ‘TEAMLAB’) 에서 함수의 인터페이스를 정의결국 코드를 모두 실행하면 두 코드의 결과는 같다.예를들어 초깃값을 0으로 할당하면 ‘init=0’과 같은 형태로 입력
  • 가끔은 그 변수에 특정한 값이 입력되어야 할 때에는 ‘init = None’과 같은 형식으로 초깃값을 지정하면 됨
  • 이러한 디폴트 인수를 사용할 때 보통 함수를 사용하는 사람이 초깃값을 입력해주어야 할 때가 있음
  • your_name 매개변수에는 기본값으로 ‘TEAMLAB’ 지정, 이 경우 함수를 호출할 때 your_name 매개변수에는 별도의 값을 할당하지 않아도 함수가 작동print_something_2(’Sungchul’)에서 함수의 매개변수가 2개인데도 인수를 하나만 입력, 이 경우 입력된 값은 첫 번째 매개변수인 my_name에 할당, 두 번째 매개변수인 your_name에는 디폴트 인수로 지정된 ‘TEAMLAB’ 할당
  • def print_something_@(my_name, your_name = 'TEAMLAB'): print('HEllo{0}, My name is {1}.format(your_name, my_name)) print_something_2('Sungchul', 'TEANLAB') print_something_2('Sungchul')
  • 디폴트 인수(default arguments):
  • 가변 인수파이썬에서 기본적으로 곱셈 또는 제곱 연산 외에도 변수를 묶어주는 가변 인수를 만들 때 사용
    def asterisk_test(a, b, *args)
        return a+b+sum(args)
    
    print(asterisk_test(1,2,3,4,5))
    
    15
    
    asterisk test() 함수는 변수 a, b를 넘겨 받고, 나머지를 *args로 넘겨받음asterisk_test(l, 2, 3, 4, 5)를 보면 1과 2는 각각 a와 b에 할당되고, 나머지 인수인 3, 4, 5가 모두 *args에 할당됨
    (3,4,5)
    NONE
    
    결과값이 괄호로 묶여 출력됨, 이렇게 괄호로 묶여 출력되는 자료형을 튜플(tuple)자료형이라 하며 리스트 자료형처럼 인덱스로 접근할 수 있는 자료형이라고 기억 !또한 리스트와 비슷한 튜플 형태로 함수 안에서 사용되어지므로 인덱스를 사용하여 args[0], args[1] 등의 형태로 변수에 접근할 수 있음
    (3, 4, [5])
    
    입력받은 가변 인수의 개수를 정확히 안다면, x, y, *z = args처럼 언패킹 가능
    def asterisk_test_2(*args):
        s,y,*z = args
        return x,y,z
    
    print(asterisk_test_2(3,4,5,10,20))
    
    (3,4,,[5,10,20])
    
    *는 기능이 다양하여 언패킹할 때도 값을 가변 인수의 형태로 받을 수 있음
  • 이러한 특징을 잘 기억하면 함수와 변수 사용시 가변 인수를 유용하게 사용 가능
  • 만약 *z가 아닌 상태에서 asterisk_test_2(3, 4, 5. 10. 20)으로 변경하여 코드를 실행하면 언패킹의 개수가 맞지 않기 때문에 오류 발생
  • def asterisk_test_2(*args): s,y,*z = args return x,y,z print(asterisk_test_2(3,4,5))
  • 가변인수 *는 반드시 일반적인 키워드 인수에 대한 선언이 모두 끝난 후 마지막에 선언되어야함
  • def asterisk_test(a, b, *args): print(args) print(asterisk_test(1,2,3,4,5))
  • 여기서 *args를 가변 인수라고 함
  • 예를 들어, 항의 개수가 정해지지 않은 다항방정식의 덧셈 연산, 고객이 물건을 얼마나 구매할지 모르는 마트 계산기에서 합산을 수행하는 연산 등에 사용
  • 가변 인수(variable-length arguments) : asterisk라고 부름
  • 키워드 가변 인수가변 인수는 변수의 순서대로 튜플 형태로 저장됨, 사용할 때는 매우 간단하지만 변수의 이름을 지정할 수 없다는 단점 이러한 단점을 보완하는 방법그리고 입력된 값은 튜플 자료형이 아닌 딕셔너리 자료형(dictionary type)으로 사용할 수 있다. 배우지 않은 지금은 딕셔너리 자료형을 변수명과 값을 쌍으로 저장하는 방식이라고 생각하면 쉽다
    def kwargs_Test(**kwargs):
        print(kwargs)
        print('First value is {first}'.format(**kwargs))
        print('Second value is {second]'.fornat(**kwargs))
        print('Third value is {third}'.format(**kwargs))
    
    kwargs_test(first = 3, second = 4, third = 5)
    
    {'first': 3, 'second': 4, 'third': 5}
    First value is 3
    Second value is 4
    Third value is 5
    
    키워드 가변 인수는 변수명으로 kwargs를 사용이러한 형태를 딕셔너리 자료형이라 하고, 실행 결과 변수명과 값이 쌍으로 저장된 것을 알 수 있음개별 변수명을 따로 불러내 사용할 수도 있는데,이미 키워드 가변 인수를 사용해 ‘first = 3, second = 4, third = 5’ 변수를 함수 안에 넣었기 때문에 second라는 변수를 사용할 수 있음
  • 다음 코드에서 3, 4는 각각 one, two에 할당되고, 나머지 5, 6, 7, 8, 9는 args에, first = 3, second = 4*,* third = 5는 딕셔너리형으로 kwargs에 할당된다.
  • 정리해보면, 일반적으로 매개변수, 가변 인수. 키워드 가변 인수를 모두 사용하면 매개 변수, 가변 인수, 키워드 가변 인수 순으로 각 값을 적당한 위치의 변수에 할당
  • 이전 가변 인수에서 보았듯이 딕셔너리 자료형 변수에 *를2개 붙이면 개별 변수로 풀리면서 함수에 들어갈수 있으며 인터프리터는 다음과 같이 해석
  • 이 코드는 print() 함수로 출력할 때 변수 kwargs에 있는 second 변수를 사용하고 있는 것
  • print('Second value is {second}’.format(**kwargs))와 같이
  • 변수명 자체는 중요하지 않지만, * 는 반드시 **처럼 2개를 붙여야 한다는 것은 기억 ! kwargs_test(first = 3, second = 4, third = 5)에서 3개의 키워드 인수를 넘겼으므로 2행의 print() 함수에서 그 인수들이 {'first': 3, 'second': 4, 'third': 5} 형태로 출력
  • 키워드 가변 인수는 반드시 모든 매개변수의 맨 마지막, 즉 가변 인수 다음에 선언되어야함
  • 이 방법은 매개변수의 이름을 따로 지정하지 않고 입력하는 방법으로 이전 가변 인수와는 달리 * 를 2개 사용하여 함수의 매개변수를 표시
  • 키워드 가변 인수(keyword variable-length arguments) :

좋은 코드를 작성하는 방법

  • 좋은 코드의 의미좋은 프로그래머가 되기 위해서는 사람이 이해할 수 있는 프로그램 코드를 만들라는 조언이러 한 것을 가독성이라 하며 결국 프로그램 코드는 많은 사람이 쉽게 읽고 이해할 수 있도록 가독성이 좋아야 한다
  • 다시 말해 다른 사람이 내가 작성한 코드를 굉장히 쉽게 이해할 수 있도록 프로그램을 작성해야 한다는 뜻,
  • "컴퓨터가 이해할 수 있는 코드는 어느 바보나 다 짤 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다” - 마틴 파울러
  • 코딩 규칙
    • 기본 코딩 규칙
      • 들여쓰기는4 스페이스
      • 한 줄은 최대 79자까지
      • 불필요한 공백은 없애기
    • PEP 8 코딩 규칙
      • = 연산자는 1칸 이상 띄우지 않는다.
      • variable_example = 12 # 필요 이상으로 빈칸이 많음 variable_example = 12 # 정상적인 띄어쓰기
      • 주석은 항상 갱신하고 불필요한 주석은 삭제한다.
      • 소문자 1, 대문자 O, 대문자 I는 사용을 금한다.
      • 1100 = "Hard to Understand" # 변수 구분하기 어려움
      • 함수명은 소문자로 구성하고, 필요하면 밑줄로 구분한다.
    • 파이썬 개발자가 직접 정한 규칙, 꼭 PEP 8에 맞춰 코딩할 필요는 없음
    <aside> 💡 flake8 모듈코딩을 한 후 코딩 규칙을 제대로 지켰는지 확인하는 방법 중 하나는 flake8 모듈로 체크하는 것
    conda install -c anaconda flake8
    
    아래 코드 입력 후 ‘test_flake.py’로 저장cmd 창에 다음과 같이 입력시 각 코드의 수정방법 알려줌
  • flake8 test_flake.py
  • 1L0O = "123" for i in 10 : print('Hello')
  • flake8을 설치하기 위해서는 먼저 cmd 창에 다음과 같이 입력
  • </aside>
  • 함수 개발 가이드라인
    • 함수 이름
      • 함수 내용은 가능하면 짧게 작성할 것(줄 수를 줄일 것)
      • 함수 이름에 함수의 역할과 의도를 명확히 드러낼 것
      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(x, y) return x + y
    • 하나의 함수에는 유사한 역할을 하는 코드만 포함시켜야 함
    • 함수를 만들어야 하는 경우
      • 공통으로 사용되는 코드를 함수로 변환
        a =52
        if (a >3):
            print('Hello World')
            print('Hello TEAMLAB')
        if (a > 4):
            print('Hello World')
            print('Hello TEAMLAB')
        if (a > 5):
            print('Hello World')
            print('Hello TEAMLAB')
        
        이의 경우 함수 만들어 사용하면 좋음
      • def print_hello(): print("Hello World") print('Hello TEAMLAB') a =5 if (a > 3): print_hello() if (a > 4): print_hello() if (a >5): print_heUo()
      • ex. print (’Hello World’), print(’Hello TEAMLAB’) 코드 반복
      • 복잡한 로직이 사용되었을 때 식별 가능한 이름의 함수로 변환
        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(l,-2,1))
      • ex. 이차방정식의 근을 구하는 근의 공식 사용