Programming/Python

[혼공챌린지]python 함수

Hayley Shim 2021. 7. 26. 07:33

4주차 과제
기본미션 : p.223[직전 해보는 손코딩: 범위 내부의 정수를 모두 더하는 함수] 실행 후 코드가 입력된 화면 및 실행 결과 화면 인증샷

함수 : 코드의 집합
함수를 사용한다 = 함수를 호출한다

def print_3_times(): 
	print("안녕하세요") 
    print("안녕하세요") 
    print("안녕하세요") 
    
print_3_times()

 

매개변수 : 함수를 호출할 때 괄호 내부에 넣는 여러 자료 값

def print_n_times(value, n): 
	for i in range(n): 
    	print(value) 

print_n_times("안녕", 5)

 

매개변수와 관련된 TypeError : 요청한 매개변수와 숫자가 일치하지 않으면 오류 발생

def print_n_times(value, n): 
	for i in range(n): 
    	print(value) 
        
print_n_times("안녕", 5, 10)

TypeError

 

가변 매개변수 : print() 함수와 같이 매개변수를 원하는 만큼 받을 수 있는 함수

def print_n_times(n, *values): 
	# n번 반복 
    for i in range(n): 
    	#values는 리스트처럼 활용 
        for value in values: 
        	print(value) 
            #단순 줄바꿈 
            print() 
            
#함수 호출 
print_n_times(3, "안녕하세요", "즐거운", "파이썬 프로그래밍")

 

-> 가변 매개변수 뒤에는 일반 매개변수가 올 수 없다. 위의 예제에서 n을 아픙로 옮기고 매개변수 *values를 뒤로 밀었다. *values는 리스트처럼 사용하면 된다

기본 매개변수 : '매개변수=값' 형태로 되어있고, 매개변수를 입력하지 않았을 경우 매개변수에 들어가는 기본 값. 기본 매개변수 뒤에는 일반 매개변수가 올 수 없다

def print_n_times(value, n=2): 
	#n번 반복한다 
    for i in range(n): 
    	print(value) 
#함수를 호출 
print_n_times("안녕하세요")

 

-> 기본 매개변수 뒤에 일반 매개변수를 오지 못하게 막은 이유 : 만약 print_n_times(n=2, value) 형태로 사용할 수 있다면 print_n_times("안녕하세요")라고 입력했을 때, "안녕하세요"라는 글자가 첫번째 매개변수에 할당되어야 하는지 두번째 매개변수에 할당되어야 하는지 확실하게 알 수 없다. 그래서 파이썬 프로그래밍 언어는 내부적으로 기본 매개변수 뒤에 일반 매개변수가 오지 못하게 막은 것이다.


키워드 매개변수 : 가변 매개변수와 기본 매개변수 둘다 사용하는 방법
1) 기본 매개변수가 가변 매개변수보다 앞에 올 때

def print_n_times(n=2, *values): 
	#n번 반복 
    for i in range(n): 
    	#values는 리스트처럼 활용 
        for value in values: 
        	print(value) 
            #단순한 줄바꿈 
            print() 
            
# 함수를 호출 print_n_times("안녕","즐거운","파이썬")

-> 위의 예제에서 n에는 매개변수가 순서대로 입력되므로 n에는 "안녕"이 들어가고, values에는 ["즐거운", "파이썬"]이 들어간다. 그런데 range() 함수의 매개변수에는 숫자만 들어올 수 있으므로 TypeError 에러가 발생한다. 따라서 기본 매개변수는 가변 매개변수 앞에 써도 의미가 없다

2) 가변 매개변수가 기본 매개변수보다 앞에 올 때

def print_n_times(*values, n=2): 
	#n번 반복 
    for i in range(n): 
    	#values는 리스트처럼 활용 
        for value in values: 
        	print(value) 
            #단순한 줄바꿈 
            print() 
            
# 함수를 호출 
print_n_times("안녕","즐거운","파이썬", 3)

실행결과 - 기본매개변수도 함께 출력됨

 

3) 키워드 매개변수

def print_n_times(*values, n=2): 
	#n번 반복 
    for i in range(n): 
    	#values는 리스트처럼 활용 
        for value in values: 
        	print(value) 
            #단순한 줄바꿈 
            print() 

# 함수를 호출 
print_n_times("안녕","즐거운","파이썬",n=3)

실행결과 - 키워드 매개변수 경우 출력 횟수만 반복됨

-> n=" "과 같은 형식으로 매개변수 이름을 직접적으로 지정해서 값을 입력해 줌

키워드 매개변수 사용 예)
기본 매개변수 중에서 필요한 값만 입력할 때

def test(a, b=10, c=100): 
	print(a+b+c) 
    
    #1) 기본 형태 
    test(10,20,30) 
    
    #2) 키워드 매개변수로 모든 매개변수를 지정한 형태 
    test(a=10, b=100, c=200) 
    
    #3) 키워드 매개변수로 모든 매개변수를 마구잡이로 지정한 형태 
    test(c=10, a=100, b=200) 
    
    #4) 키워드 매개변수로 일부 매개변수만 지정한 형태 
    test(10, c=200)

실행결과

 

리턴값 : 함수를 호출해서 최종적으로 나오는 결과

1) 자료없이 리턴하기

def return_test(): 
	print("A 위치입니다") 
    
    return print("B 위치입니다") 
    
return_test()

-> return 키워드를 만나는 순간 함수가 종료됨. 결과적으로 "A 위치입니다" 만 출력

2) 자료와 함께 리턴하기

def return_test(): 
	return 100 
    
value = return_test() 
print(value)

-> 리턴 뒤에 자료를 입력하면 자료를 가지고 리턴함. 결과로 100이 출력됨

3) 아무것도 리턴하지 않기

def return_test(): 
	return value = return_test() 
    
print(value)

-> None을 출력함.

기본적인 함수의 활용
1) 범위 내부의 정수를 모두 더하는 함수

def sum_all(start, end): 
    output = 0 
    
    for i in range(start, end+1): 
        output += i 
        return output 
        
print("0 to 100:", sum_all(0,100)) 
print("0 to 1000:", sum_all(0,1000)) 
print("50 to 100:", sum_all(50,100)) 
print("500 to 1000:", sum_all(500,1000))

실행결과


2) 기본 매개변수와 키워드 매개변수를 활용해 범위의 정수를 더하는 함수

def sum_all(start=0, end=100, step=1): 
	output = 0 
    
    for i in range(start, end+1, step): 
    	output += i 
        return output 
        
print("A:", sum_all(0,100,10)) 
print("B:", sum_all(end=100)) 
print("C:", sum_all(end=100, step=2))

실행결과

 


재귀 함수 : '자기 자신을 호출'

1) 반복문으로 팩토리얼

def factorial(n): 
	output =1 
    
    for i in range(1, n+1): 
    	output *= i 
        return output 
        
print("1!:", factorial(1)) 
print("2!:", factorial(2)) 
print("3!:", factorial(3)) 
print("4!:", factorial(4)) 
print("5!:", factorial(5))

 

2) 재귀함수로 팩토리얼

def factorial(n): 
	if n == 0: 
    	return 1 
    else: 
    	return n * factorial(n-1) 
        
print("1!:", factorial(1)) 
print("2!:", factorial(2)) 
print("3!:", factorial(3)) 
print("4!:", factorial(4)) 
print("5!:", factorial(5))

 

재귀 함수의 문제
1) 피보나치 수열(1)

def fibonacci(n): 
	if n == 1: 
    	return 1 
    if n == 2: 
    	return 1 
    else: 
    	return fibonacci(n-1) + fibonacci(n-2) 
        
print("fibonacci(1):", fibonacci(1)) 
print("fibonacci(2):", fibonacci(2)) 
print("fibonacci(3):", fibonacci(3)) 
print("fibonacci(4):", fibonacci(4)) 
print("fibonacci(5):", fibonacci(5))

 

2) 피보나치 수열(2)

counter = 0 

def fibonacci(n): 
	print("fibonacci({})를 구한다.".format(n)) 
    
    global counter 
    
    counter += 1 
    
    if n == 1: 
    	return 1 
    if n ==2: 
    	return 1 
    else: 
    	return fibonacci(n-1) + fibonacci(n-2) 
        
fibonacci(10) 
print("---") 
print("fibonacci(10) 계산에 활용된 덧셈 횟누는 {}번이다".format(counter))

-> fibonacci(10)을 구하는데 109번이나 연산했다.

UnboundLocalError에 대한 처리
-> 위의 코드에서 global counter 부분을 주석처리하면, UnboundLocalError 예외를 출력함.
global 키워드는 파이썬언어에만 있는 특이한 구조이다. 함수 내부에서 함수 외부에 있는 변수를 설명하려면 global 키워드를 사용해서 변수를 참조(reference) 한다.

메모화 : 딕셔너리를 사용해서 한 번 계산한 값을 저장한다. 이를 메모(memo)한다고 표현한다. 딕셔너리에 값이 메모되어 있으면 처리를 수행하지 않고 곧바로 메모된 값을 돌려주면서 코드의 속도를 빠르게 만든다. 메모화를 사용하면 실행 후 곧바로 결과를 출력할 정도로 빨라진다. 재귀함수와 함께 사용되는 기술이다.

dictionary = { 1: 1, 2: 1 } 

def fibonacci(n): 
	if n in dictionary: 
    	return dictionary[n] 
    else: output = fibonacci(n-1) + fibonacci(n-2) 
    
    dictionary[n] = output 
    return output 
    
print("fibonacci(10):", fibonacci(10)) 
print("fibonacci(20):", fibonacci(20)) 
print("fibonacci(30):", fibonacci(30))

 

조기 리턴

dictionary = { 1: 1, 2: 1 } 

def fibonacci(n): 
	if n in dictionary: 
    	return dictionary[n] 
        
	# 들여 쓰기 단계가 줄어 코드 읽기가 쉬움. 조기 리턴 
	output = fibonacci(n-1) + fibonacci(n-2) 

	dictionary[n] = output 
	return output 
    
print("fibonacci(10):", fibonacci(10)) 
print("fibonacci(20):", fibonacci(20)) 
print("fibonacci(30):", fibonacci(30))

* 코드에 이름 붙이기 : 주석을 잘 사용하여 프로그램을 작성할 때 가독성이 좋아지게 한다. 또는 함수를 만든다
-> 한 줄의 코드라도 의미를 가지고 있다면 함수로 만든느 것이 좋다.(모듈)
* 코드 유지보수 : 함수를 사용할 경우, 수정이 쉽다!

튜플 : 함수와 함께 많이 사용되는 리스트와 비슷한 자료형. 리스트와 다른 점은 한번 결정된 요소는 바꿀 수 없다
1)리스트와 튜플 사용 예

[a,b] = [10,20] 
(c,d) = (10,20) 

print("a:", a) 
print("b:", b) 
print("c:", c) 
print("d:", d)

실행결과

2) 괄호가 없는 튜플

tuple_test = 10,20,30,40 
print("#괄호가 없는 튜플의 값과 자료형 출력") 
print("tuple test:", tuple_test) 
print("type(tuple_test):",type(tuple_test)) 
print() 

a,b,c = 10,20,30 
print("#괄호가 없는 튜플을 활용한 할당") 
print("a:", a) 
print("b:", b) 
print("c:", c)

실행결과


3) 변수값을 교환하는 튜플

a,b = 10,20 

print("# 교환 전 값") 
print("a:", a) 
print("b:", b) 
print() 

print("#교환 후 값") 
print("a:", a) 
print("b:", b) 
print()

실행결과

4) 여러 개 값 리턴

def test(): 
	return(10,20) 
    
a, b = test() 

print("a:", a) 
print("b:", b)

실행결과

-> enumerate(), items() 함수를 사용할 때, i, value 는 (i, value) 튜플에서 괄호를 제거한 것

for i, value in enumerate([1,2,3,4,5,6]): 
	print("{}번째 요소는 {}입니다".format(i,value))

-> divmod() 함수도 튜플을 리턴하는 함수.

a, b = 97,40 

divmod(a,b)

x, y = divmod(a,b) 
x >>>2 
y >>>17

 

람다 : 매개변수로 함수를 전달하기 위해 함수 구문을 작성하는 것이 번거롭고 코드 공간 낭비라는 생각이 들 때 함수를 간단하고 쉽게 선언하는 방법

1) 매개변수로 함수 전달

def call_10_times(func): 
	for i in range(10): 
    	func() 
        
def print_hello(): 
	print("안녕") 

call_10_times(print_hello)

 

2) map() 함수와 filter() 함수

- 함수를 매개변수로 전달하는 대표적인 표준 함수

def power(item):
    return item * item
def under_3(item):
    return item < 3

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

output_a = map(power, list_input_a)
print("# map() 함수의 실행결과")
print("map(power, list_input_a:", output_a)
print("map(power, list_input_a:", list(output_a))
print()

output_b = filter(under_3, list_input_a)
print("# filter() 함수의 실행결과")
print("filter(under_3, list_input_a):", output_b)
print("filter(under_3, list_input_a):", list(output_b))

실행결과

-> map() 함수와 filter() 함수는 모두 첫번째 매개변수에 함수, 두번째 매개변수에 리스트를 넣는다.

-> 출력값에 <map object>, <filter object> 가 나오는데 이를 제너레이터(generator)라고 한다. 


3) 람다 : 간단한 함수를 쉽게 선언하는 방법

power = lambda x: x*x
under_3 = lambda x: x < 3

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

output_a = map(power, list_input_a)
print("# map() 함수의 실행결과")
print("map(power, list_input_a):", output_a)
print("map(power, list_input_a):", list(output_a))
print()

output_b = filter(under_3, list_input_a)
print("# filter() 함수의 실행결과")
print("filter(under_3, list_input_a):", output_b)
print("filter(under_3, list_input_a):", list(output_b))

실행결과

4) 인라인람다 : 함수의 매개변수에 람다를 바로 넣는 것

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

output_a = map(lambda x: x * x, list_input_a)
print("# map() 함수의 실행결과")
print("#map(power, list_input_a):", output_a)
print("map(power, list_input_a):", output_a)
print("map(power, list_input_a):", list(output_a))
print()

output_b = filter(lambda x : x<3, list_input_a)
print("#filter() 함수의 실행결과")
print("filter(under_3, list_input_a):", output_b)
print("filter(under_3, list_input_a):", list(output_b))


파일처리

- 파일은 크게 텍스트 파일과 바이너리 파일로 나뉨

 

1) 파일 열고 닫기 

- 파일 열기 : 파일 객체 = open(문자열: 파일 경로, 문자열: 읽기 모드)

- 파일 닫기 : 파일 객체.close()

file = open("basic.txt", "w")
file.write("Hello Python Programming...!")

file.close()

 

2) with 키워드 : 프로그램이 길어지면서 조건문과 반복문이 들어가다보면 파일을 열고 닫지 않는 실수를 하는 경우가 생길 수 있다. 이런 실수를 방지하기 위해 with 키워드를 사용한다

with open("basic.txt", "w") as file:
    #파일에 텍스트 씀
    file.write("Hello Python Programming...!")

 

3) 텍스트 읽기 : write(), read()

with open("basic.txt", "r") as file:
    
    contents = file.read()

print(contents)

 

4) 텍스트 한줄씩 읽기 : 텍스트를 사용해 데이터를 구조적으로 표현할 수 있는 방법으로 CSV, XML, JSON 등이 있다.

랜덤하게 1000명의 키와 몸무게 만들기

import random

hanguls = list("가나다라마바사아자차카타파하")

with open("info.txt", "w") as file:
    for i in range(1000):

        name = random.choice(hanguls) + random.choice(hanguls)
        weight = random.randrange(40, 100)
        height = random.randrange(140, 200)

        file.write("{}, {}, {}\n".format(name, weight, height))

반복문으로 파일 한 줄씩 읽기

with open("info.txt", "r") as file:
    for line in file:
        (name, weight, height) = line.strip().split(", ")

        # 데이터가 문제없는지 확인한다: 문제가 있으면 지나감
        if (not name) or (not weight) or (not height):
            continue
        # 결과를 계산한다
        bmi = int(weight) / ((int(height) / 100) ** 2)
        result = ""
        if 25 <= bmi:
            result = "과체중"
        elif 18.5 <= bmi:
            result = "정상 체중"
        else:
            result = "저체중"
        
        #출력합니다
        print('\n'.join([
            "이름: {}",
            "몸무게: {}",
            "키: {}",
            "BMI: {}",
            "결과: {}"
        ]).format(name, weight, height, bmi, result))
        print()


교육도서 : 혼자 공부하는 파이썬 https://book.naver.com/bookdb/book_detail.nhn?bid=15028688

 

혼자 공부하는 파이썬

혼자 해도 충분하다! 1:1 과외하듯 배우는 파이썬 프로그래밍 자습서(파이썬 최신 버전 반영)27명의 베타리더 검증으로, ‘함께 만든’ 입문자 맞춤형 도서이 책은 독학으로 프로그래밍 언어를

book.naver.com

광고 수익은 기부 활동에 사용됩니다

정보를 얻으신 분들은 광고 클릭 부탁드려요 :)



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

[혼공챌린지]python scraping  (0) 2021.08.09
[혼공챌린지]python 오류(Error)  (0) 2021.08.02
[혼공챌린지]python 자료형  (0) 2021.07.19
[혼공챌린지]python 조건문  (0) 2021.07.10
[혼공챌린지] Hello~Python :)  (0) 2021.07.10