Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

BASEMENT

Python 3주차 - 1 본문

Programming/Python

Python 3주차 - 1

2_34 2020. 7. 12. 16:26

 

함수 (function)

1. 함수 기본

 

함수 : 특별한 기능을 위한 코드들의 집합

 

함수 용어

  • 함수 호출(function call) : 함수의 사용
  • 매개변수(parameter variable) : 함수 실행을 위해 인자(전달되는 값)를 저장하는 변수
  • 인자 또는 인수(arguments) : 함수 호출 시 전달하는 입력값
  • 리턴값(return value) : 함수 호출 시 최종적으로 나오는 결과 값. return 사용

함수 형식

def 함수이름(<매개변수, 매개변수, ...>):
	실행문
    실행문
   	...
    <return <값 or 수식 or 변수>>
    
# 함수 호출
함수이름(<필요한 입력값>)
# 함수 형식 예제

def plus(v1,v2):
	result = 0
    result = v1 + v2
    return result
    
hap = plus(100,200)
print(hap)

함수 종류

  • 내장함수 : 파이썬에서 이미 작성되어 사용자에게 제공되는 함수
  • 사용자 정의 함수 : 사용자가 필요한 기능을 만들어 사용하는 함수. def 사용
  • 메서드(method) : 클래스(class) 내부에 선언된 함수

2. 지역변수, 전역변수

def func1():
	a = 10	# 지역변수
    print("local var of func1 :", a)
    
def func2():
	print("global var :", a)
    
 a = 30		# 전역변수
 func1()	# 10
 func2()	# 30
def sub():
	global s	# global : 함수 안에서 사용되는 변수를 전역변수로 사용하고 싶은 경우
    print(s)
    s = "안녕하세요"
    print(s)
    
s = "Hello"
sub()
print(s)

3. 네임스페이스 (namespace)

 

이름(변수이름, 함수이름, 클래스이름, 모듈이름 등)이 묶여 있는 영역

이름과 바인딩된 객체의 모임으로 구성된 사전

지역, 전역, 내장의 네임스페이스 사전 객체가 존재

  • 지역(local) : 함수 또는 클래스의 인스턴스가 생성될 때 그 내부에서 이름과 객체의 묶임으로 생성. locals()로 확인
  • 전역(global) : 각 모듈이 시작될 때 생성되는 최상위 네임스페이스, 모듈 전체에서 사용 가능. globals()로 확인
  • 내장(built-in) : 파이썬 인터프리터가 시작될 때 생성, 끝날때 까지 유지됨. dir(__builtins__)로 확인

유효범위 규칙에 따라 네임을 찾아감 : 지역 -> 전역 -> 내장 순

 

유효범위 규칙 확인 코드 - global

def test_Scope():
	global x
    print(f'global x: {x}')
    x = 100
    print(f' test_scope x: {x}')
    print(f'{locals()}')
    return

유효범위 규칙 확인 코드 - nonlocal (비 지역변수를 참조할 때 사용)

  • nonlocal로 선언된 변수는 해당 함수의 지역변수에 표시
  • 그 함수의 부모함수에 같은 이름을 가진 지역변수를 참조
  • 따라서 부모함수에 반드시 nonlocal로 선언된 이름의 변수가 존재해야 함
def name_f1():
	i = 10
    def name_f2():
    	nonlocal i	# nonlocal : name_f2 에서 name_f1의 변수 i를 참조하고 싶을 때
        print(f'name_f2 i : {i}')
        i = 20
        print(f'name_f2 i : {i}')
        print(f'name_f2 local: {locals()}')
        
        print('*'*40)
        
	name_f2()
    print(f'name_f1 i : {i}')
    print(f'name_f1 local: {locals()}')
    
i = 30
name_f1()
print(f'global i : {i}')
       

4. return

 

함수의 종결자

return 다음에 오는 값을 함수를 호출시킨 위치로 반환

def sub(1):
	return
    a = a * 10
    print("a * 10 = ", a)
 
a = int(input("enter number>> "))
sub(a)
print("program end")	# 함수 시작 부분에 return이 있으므로 program end만 출력됨

5. 매개변수 사용

 

1) 가변 매개변수

  • 매개변수를 원하는 만큼 받을 수 있는 함수
  • 가변 매개변수 뒤에는 일반 매개변수가 위치할 수 없음
  • <*변수이름> 형식 사용
  • 가변 매개변수는 tuple형식으로 처리
def print_n_times(n, *values):	
	for i in range(n):
    	for value in values:	# values는 튜플처럼 사용
        	print(value, end='')
        print()
        
print_n_times(4, '안녕하세요','즐거운','수업시간입니다')
print_n_times(4, '건강한','하루')

2) 가변 매개변수 ** 인 경우

  • 딕셔너리 형태로 전달
  • 함수 호출 시 인자값의 형태는 키(key)=값(value)로 작성
  • 함수에서 위치는 항상 마지막에 와야 함
def dic_func(**para):
	for k in para.keys():
    		print("%s --> %d 입니다" % (k,para[k]))

dic_func(트와이스=9, 소녀시대=7, 방탄소년단=7, 블랙핑크=4)

3) 키워드 매개변수 함수

  • 매개변수에 초기값이 부여된 경우
  • 키워드 매개변수 뒤에는 일반 매개변수 위치 불가
  • def function name(매개변수1, 매개변수2, 매개변수3=초기값)
def print_n_times(value, n=2):	# n=2 초기값
	for i in range(n):
    	print(value)

print_n_times("안녕하세요", 3)	# n값을 지정하지 않으면 초기값 2 적용

4) 키워드 매개변수/가변 매개변수 함께 사용 시

  • 가변 매개변수 앞에 일반 또는 키워드 매개변수가 정의된 경우
  • 키워드 매개변수를 이용하여 호출 불가
def sample(n, *test):
	print("sample")

sample(3,1,2,3)	# sample(n=3, 1,2,3) : 오류 -> 키워드 매개변수를 이용하여 호출할 수 없음
  • 가변 매개변수 뒤에 일반 또는 키워드 매개변수가 정의된 경우
  • 반드시 키워드 매개변수를 이용하여 호출
def sample(*test, n):
	print("sample")

sample(1,2,3, n=4)	# sample(1,2,3,4) : 오류
# 예제 - 매개변수 사용 

def change(a,b,*args):
    print(args)

def testF(*var):
    x,y,*z = var	# * : unpacking 연산자, z가 리스트로 변함
    print("%d, %d, %s" % (x,y,z))

change(1,2,3,4,5,6)
testF(1,2,3,4,5,6)

6. 재귀함수 (Recursive Function)

 

self 호출 하는 함수. 자기 자신을 호출하는 코드가 존재하는 함수

반복문으로 대체할 수 있는 재귀함수는 반복문으로 작성함

def A(<매개변수>):
	<변수> = <초기값>
    <실행문>
    A(<값>)
def recur_f(num):
	if num == 0:
    	return 0
    else:
    	return num + recur_f(num-1)		# 재귀함수 -> 반복문 역할을 함

value = int(imput("Enter number>> "))
result = recur_f(value)
print("sum of %d :: %d" % (value, result))
# 예제 - 재귀함수를 사용한 계승문제(누적의 곱) factorial

def fact(n):
	if n < 0 or n != int(n):
    	print("wrong input")
        return
    elif n == 0 or n == 1:
    	return 1
    else:
    	return n*fact(n-1)

n = int(input("factorial number >> "))
result = fact(n)
print(f'{n}! == {result}')

# 참고: 반복문으로 작성
def factorial(num):
	fact = 1
    for i in range(1,num+1):
    	fact *= i
    return fact

value = int(input("Enter number >> "))
result = factorial(value)
print("factorial of %d :: %d" % (value,result))
# 예제 - 재귀함수를 이용한 피보나치 수열

def fibo(n):
	if n<0:
    	print("range out number")
        return
    elif 0<=n<=1:
    	return n
    else:
    	return fibo(n-1) + fibo(n-2)
        
fibo_n = int(input("fibonacci number >> "))
print(fibo(fibo_n))

# 피보나치 수열 - 메모이제이션 사용

fibo_dict = {	# 딕셔너리를 이용한 메모화 기능 사용
	1:1,
    2:1
}
def fibo(n):
	if n in fibo_dict:
    	return fibo_dict[n]
    output = fibo(n-1) + fibo(n-2)
    fibo_dict[n] = output
    return output

7. 람다 (Lambda)

 

함수의 기능을 매개변수로 전달하는 코드에서 사용

함수의 형태가 간단한 경우

런타임에 생성해서 사용할 수 있는 익명의 함수

Lambda <매개변수> : <리턴값>

power = lambda x: x*x
n_power = lambda x,y: x**y
print(power(3))
print(n_power(2,5))
print((lambda x,y: x+y)(3,4))

8. map 함수

 

map(함수이름, 리스트 또는 리스트 변수이름)

두번째 인자인 리스트값을 순차적으로 첫번째 인자인 함수에 대입해주는 함수

ex) map(str, [1,2,3]) 를  str(1), str(2), str(3)로, 결과는 '1', '2', '3'

# 예제 - 리스트에 +10을 하는 함수 호출

myList = [1,2,3,4,5]
def add10(num):
	return num+10

result10 = map(add10, myList)
print(result10)
print(list(result10))

# lambda를 사용한 map 함수

myList = [1,2,3,4,5]

result10 = map(lambda num:num+10, myList)
print(result10)
print(list(result10))

9. filter 함수

 

filter(<함수>,<리스트>)

리스트의 용소를 함수에 입력하고, 리턴된 값이 True인 것으로 새로운 리스트를 생성하는 함수

필요없는 데이터를 걸러내기 위하여 사용하는 함수

list_a = [1,2,3,4,5]
output = list(filter(lambda x:x<3, list_a))
print(output)
# map, filter 함수 컴프리핸션

seq = [1,2,3,4,5]
f = lambda x:x**2
print(list(map(f,seq))		# print([x**2 for x in seq])

seq = [1,2,3,4,5]
f = lamabda x,y:x+y
print(list(map(f,seq,seq)))	# print([x+y for x,y in ziq(seq,seq)])

10. reduce 함수

 

map과 형제같은 함수로, 리스트와 같은 시퀀스 자료형에 차례대로 함수를 적용 후, 모든 값을 통합하는 함수

from functools import reduce

f = reduce(lambda x,y:x+y, [1,2,3,4,5])
print(f)	# 결과 : 15

11. 제너레이터(Generator)

 

성능 및 효율적 코드 작성을 위한 패턴

- 메모리와 CPU 효율이 높음 : 생성된 데이터는 임시저장, 1회 사용 후 메모리에서 삭제되므로 재사용 불가

- 코드의 간결성이 높음

파이썬의 시퀀스를 생성하는 객체

제너레이터는 이터레이터임

제너레이터의 형태 - 제너레이터 함수(function), 제너레이터 표현(expressions)

 

1) 제너레이터 표현

변수이름 = (수식 또는 항목 for 항목 in range() <if 조건식>)

-> 튜플형식, class는 generator

튜플은 컴프리핸션이 없음

-> 플 형식을 사용한 컴프리핸션 표현은 제너레이터

gen = (i for i in range(10) if i%2 == 0)
print(type(gen))
print(gen)

2) 제너레이터 함수

def 함수이름(<인자1, 인자2, ...>):
	실행문
    실행문
    ...
	yield 변수 or 수식 or 값

return 대신 yield를 사용하여 값을 반환

return과는 달리 yield는 값을 반환하고 다시 함수로 되돌아와 남은 실행문을 실행함

대표적인 제너레이터 함수 range() -> range는 iterable이며, range()는 제너레이터이자 이터레이터

# 제너레이터 함수 예제 - 0~4 사이의 정수값 발생하고 리스트로 저장

def gen():
	for i in range(5):
    	yield i
        
me = list(gen())
print(me)

12. 모듈 (module)

 

함수, 전역변수, 클래스 등의 집합체로 .py로 작성되는 파이썬 파일

코드를 분리하고 공유하기 편한 형태로 만들기 위한 목적

모듈 종류 : 표준모듈, 사용자정의모듈, 서드파티

 

모듈 사용하기

  • 모듈 전체 기능 사용 : import <모듈이름>
  • 모듈 특정 기능 사용 : from <모듈이름> import <특정기능1>, <특정기능2>, ...
  • 모듈 또는 특정 기능을 다른 이름으로 사용 : from <모듈이름> import <특정기능1> as <식별자>
  •                                                          import <모듈이름> as <식별자>
import math
print("trigonometric ratio of sin(1): ", math.sin(1))

import math as m
print("trigonometric ratio of sin(1): ", m.sin(1))

from math import sin, cos
print("trigonometric ratio of sin(1): ", sin(1))

__name__, "__main__" 모듈

  • 어떤 py파일이 프로그램이 시작되는 진입 파일(엔트리 포인트)인지 구분
  • 메인파일(엔트리 포인트 파일) 내부에서의 __name__ 변수값은 "__main__"
  • py 파일 내에서 print(__name__)을 실행 시 __main__이 출력되면 그 파일이 엔트리 포인트 파일. 그 외 파일은 자신의 모듈이름이 출력됨
# 예제 - test_module.py 파일

PI - 3.141592

def number_input():
	output = input("Enter your number :: ")
    return float(output)
    
def get_circumference(radius):
	return 2*PI*readius
    
def get_circle_area(radius):
	return PI*radius**2
    
if __name__ == "__main__":		# test_module.py가 엔트리 포인트 파일이면 이 부분만 실행시킴
	print(get_circumference(10))
    print(get_circle_area(10))

13. Package

 

모듈이 모여서 구조를 이룬 것

pip (python package index) : 패키지 또는 모듈을 설치할 때 사용하는 명령어. package management system임

__init__.py

  • 패키지를 import 할 때 어떤 처리를 수행하거나, 패키지 내부의 모듈을 모두 import하고 싶을 때 처리하는 파일
  • package를 초기화 하는 역할
  • 패키지 호출 시 자동 실행

 

'Programming > Python' 카테고리의 다른 글

Python 4주차 - 1  (0) 2020.07.12
Python 3주차 - 2  (0) 2020.07.12
Python 2주차 - 2  (0) 2020.07.11
Python 2주차 - 1  (0) 2020.07.11
Python 1주차 - 2  (0) 2020.07.09
Comments