2022-01-21 Function

yyj·2022년 1월 31일
0

.

목록 보기
4/21
  • 자주 사용되는 기능을 하나의 코드블럭(함수)으로 작성한 후
  • 함수 이름으로 호출해서 기능을 사용

Python의 함수(Function)

- 크게 2가지 종류가 있음

1. 내장함수

  • Python이 이미 가지고 있는 함수
  • print(), type(), id(), len(), ....등 많음
  • int(), list(), tuple(), range()

2. 사용자 정의 함수 (user define function)

  • 직접 함수를 만들어서 사용하는 방법




사용자 정의 함수

  • 어떻게 만들어야 하는가? 함수를 만들어야 사용가능!
  • 함수를 만들때는 특수한 키워드를 이용한다 == [def]

식별자 : 변수명, 함수명, ....

  • 함수명을 정할 때는 변수명을 정할때와 비슷한 규칙 적용

  • 키워드 X, 한글 X, 숫자로 시작 X, 여러단어로 되어있는 함수의 경우 '_' 이용

  • 대문자를 이용해도 되나? 일반적으로 소문자로 만듦

  • 함수는 인자라는 것을 받아 들임

  • y(a, b, c) = 2a + 3b + 4c + 100

  • 인자 --> parameter

  • return은 함수를 호출한 곳으로 결과값을 반환하여 전달하는 역할, 그리고 함수호출을 종료하는 역할
def my_sum(a, b):
    result = a + b
    return result

#만든 함수를 call(호출)
aa = my_sum(10, 20)                  # 여기서 10, 20은 actual parameter(실인자)
print(aa)

# Python은 함수도 객체!
print(type(my_sum))                  # <class 'function'>
print(my_sum))                       # <fucntion my_sum at 0x0000020336EBB280>
						=> my_sum의 객체가 가리키는 주소값
print(my_sum(100, 200)		     # ()의 의미가 변수가 가리키는 함수 객체의 코드를 실행
  • 결과
    30
    <class 'function'>
    <fucntion my_sum at 0x0000020336EBB280>
    300
    이 출력됨

사용자 정의 함수의 여러가지 형태(특징)

  • 만약 인자의 개수에 상관없이 함수를 사용하려면 어떻게 해야하나?

  • [*args(변수)] => 함수로 들어오는 인자를 tuple로 받는다는 의미
def my_sum(*args):
    result = 0
    for tmp in args:
        result += tmp
    return result
  
print(my_sum(10, 20, 30, 40, 50))      # 150 출력
  • Python의 함수는 여러개의 값을 리턴할 수 없다.

  • 프로그래밍 언어의 함수는 무조건 1개의 값만 return

  • tuple은 괄호를 생략할 수 있다!
    • (result1, result2) == result1, result2
def my_sum(a, b):
    result1 = a + b
    result1 = a * b
    return result1, result2

aa, bb = my_sum(10, 20)
print(aa, bb)                           # 30 200
  • default parameter

  • default parameter는 반드시 맨 마지막 parameter에만 나올 수 있다.
    • (a, b = 100, c) (X) // (a, b, c = 100) (O)

  • default parameter는 함수를 호출할 때 인자를 사용해도 되고 사용하지 않아도 됨!
def my_sum(a, b, c = 100):
    return a + b + c
print(my_sum(1,2))           # 103
print(my_sum(1,2,3))         # 6
  • mutable(가변의) [리스트, 딕셔너리] vs immutable(불변의) [숫자, 문자, 튜플 등]

  • call - by - value, call - by - reference
  • immutable(불변의) => call-by-value
    • 복사본 넘겨줘서 원본이 안바뀜
  • mutable(가변의) => call-by-reference
    • 주소값 넘겨줘서 원본이 바뀜
def my_sum(tmp_number, tmp_list):
    tmp_number += 100
    tmp_list.append(100)

data_x = 10
data_list = [10]

print(data_x, data_list)      #10 [10]

my_sum(data_x, data_list)     # 함수호출

print(data_x, data_list)      # 10 [10, 100]

  • local variable & global variable

  • scope ( 식별자를 찾을 수 있는 영역)
tmp = 100              # memory 영역에 존재

def my_func(x):
    tmp = tmp + x      # stack안에서 실행 
    return tmp         # tmp를 찾을 수 없음 tmp값이 stack안에 없기 때문에 누적할 수 없음!

print(my_func(10))     # Error 발생
tmp = 100            

def my_func(x):
    global tmp         
    tmp = tmp + x      
    return tmp        

print(my_func(10))     # 110
  • global()함수는 메모리 영역에서 함수를 찾는다는 의미 즉 스택을 넘어 메모리 영역에 있는 다른변수를 참조하기 위한 함수

  • 이렇게 global keyword를 사용하면 외부 영역에 있는 변수를 사용할 수 있다!

  • 편한 방법! 하지만 유지보수 측면에서 좋지 않기 때문에 이런 방법은 지양하는 편!

Python의 내장함수

  • print(), id(), len(), type(), size(), sum(), ...

Python 객체지향

- class => 객체 모데링의 수단


  • 1명의 학생정보(이름, 학번, 학과, 성적)를 프로그램적으로 저장
student_name = '아이유'
student_dept = '철학과'
student_number = '20221021'          # 직접적인 수학적 연산이 가능하면 숫자
				     # 그렇지 않으면 문자
student_grade = 3.5
# 3명의 학생 정보를 프로그램적으로 저장
# 노동집약적 표현
student1_name = '아이유'
student1_dept = '철학과'
student1_number = '20220121'
student1_grade = 3.5

student2_name = '김연아'
student2_dept = '컴퓨터'
student2_number = '20220122'
student2_grade = 4.5

student3_name = '신사임당'
student3_dept = '영어영문'
student3_number = '20220123'
student3_grade = 1.5
# 3명의 학생 정보를 프로그램적으로 저장
# 위의 표현보다는 나은 표현이지만 각 인데스 값이 같은 경우
# 1사람의 정보라는 데이터 코드에 명시되지 않음!
student_name = ['아이유', '김연아', '신사임당']
student_dept = ['철학과', '컴퓨터', '영어영문']
student_number = ['20220121', '20220122'. '20220123']
student_grade = [3.5, 4.5, 1.5]
  • 사용자 정의함수!
# user defin class의 이름은 관용적으로 대문자로 시작!

class Student(object):
	# 특별한 함수를 하나 정의 할 것임! 이름이 정해져 있다!
    def__init__(self, stu_name, sut_dept, stu_number, stu_grade):
       self.student_name = stu_name
       self.student_dept = stu_dept
       self.student_number = stu_number
       self.student_grade = stu_grade
    
stu1 = Student('아이유','철학과','20220121','3.5')
stu2 = Student('김연아','컴퓨터','20220122','4.5')
stu3 = Student('신사임당','영어영문','20220123','1.5')

# class 안에는 반드시 함수 ef__init__이 있어야 한다!
# __init__은 코드에서 직접 호출하지 않음! __init__뒤의 인자를 호출하면
# 자동으로 __init__이 호출됨!
profile
초보개발자

0개의 댓글