Python 함수, 모듈, 파일과 예외 처리

2023. 3. 17. 15:55카테고리 없음

함수호출

def my_function():
  print("Hello from a function")

my_function()
def my_function(fname):
  print(fname + " Refsnes")

my_function("Emil")
my_function("Tobias")
my_function("Linus")

매개변수 또는 인수?

함수의 관점에서 : 

매개변수는 함수 정의에서 괄호 안에 나열된 변수입니다.

인수는 함수가 호출될 때 함수로 전송되는 값입니다.

임의 인수,  *args

함수에 전달될 인수 수를 모르는 경우  매개변수 이름 앞에 *을 붙이면

입력값을 전부 모아서 튜플로 만들어 준다.

def add_many(*args): 
...     result = 0 
...     for i in args: 
...         result = result + i 
...     return result

만약 add_many(1, 2, 3)처럼 이 함수를 쓰면 args는 (1, 2, 3)이 되고, 

add_many(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)처럼 쓰면 args는 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)이 된다.

여기에서 *args는 임의로 정한 변수 이름이다.

 

함수값의 반환

 def add_mul(choice, *args): 
...     if choice == "add": 
...         result = 0 
...         for i in args: 
...             result = result + i 
...     elif choice == "mul": 
...         result = 1 
...         for i in args: 
...             result = result * i 
...     return result
>>> result = add_mul('add', 1,2,3,4,5)
>>> print(result)
15
>>> result = add_mul('mul', 1,2,3,4,5)
>>> print(result)
120

함수 안에서 선언한 변수의 효력 범위

def vartest(a):
    a = a + 1

vartest(3)
print(a)

vartest(3)을 수행하면 vartest 함수 안에서 a는 4가 되지만

함수를 호출하고 난 뒤에 print(a) 문장은 오류가 발생하게 됩니다.

그 이유는 print(a)에서 사용한 a 변수를 어디에서도 찾을 수가 없기 때문입니다.

 

- 함수 안에서 선언한 매개변수는 함수 안에서만 사용될 뿐 함수 밖에서는 사용되지 않습니다. 

함수 안에서 함수 밖의 변수를 변경하는 방법

1. return 사용하기

a = 1 
def vartest(a): 
    a = a +1 
    return a

a = vartest(a)
print(a)

>>>2

2 . global 명령어 사용하기

a = 1 
def vartest(): 
    global a 
    a = a+1

vartest() 
print(a)

>>>2

내장 함수

파이썬 모듈

➢하나의 파일을 여러개로 나누어 관리

➢프로그램에서 공통적으로 사용되는 함수들을 모아서 별도의 파일에 저장하는 기능을 제공
➢필요한 모듈 파일을 불러와서 파일 내에 정의 된 함수들을 쉽게 이용

 

math 모듈의 모듈 함수

round() 함수

time 모듈의 모듈 함수

현지 시간 구하기

strftime() 함수에서 쓰이는 포맷 기호

실행 시간 지연시키기

random 모듈의 모듈 함수

import random
#1) random() 0~1사이의 임의의 실수 값을 반환(0,1은 포함되지 않음)
print(random.random())

#2) randint(시작범위, 종료범위) 특정구간의 임의의 정수 값을 반환(범위값을 포함)
print(random.randint(1, 6))

#3) choice(리스트) 리스트, 튜플 ,문자열의 요소 중 임의의 요소를 반환
print(random.choice([1,2,3,4,5,6,]))
print(random.choice(["가위","바위","보"]))
#4) shuffle(리스트) 리스트 요소의 순서를 임의로 섞음
list1 = ["가위", "바위", "보"]
print("원래의 리스트: ",list1)
random.shuffle(list1)
print("순서가 변경된 리스트", list1)

### result ###

0.13014957645371716
2
2
보
원래의 리스트:  ['가위', '바위', '보']
순서가 변경된 리스트 ['보', '가위', '바위']

ex ) 주사위 만들기 게임

"""
주사위 게임 만들기
- 게임 시작 시간 표시 -> 주사위 던지기 -> 승부 판정하기 -> 계속 여부 확인
y -> 반복, n-> 게임 종료
"""
import time
import random

# 게임 시작 시간 표시
start = time.localtime(time.time())
print("게임 시작 시간: ", time.strftime("%H:%M:%S %p", start))

# 게임 여부 확인 변수 초기화
again = "y"

while True :
    if again == "y" :
        print("two dice are rolling...")
        time.sleep(2)

        me = random.randint(1, 6)
        computer = random.randint(1, 6)

        print("나", me)
        print("컴퓨터", computer)

        # 승부 판정
        if me > computer :
            print("나의 승리")
        elif me < computer :
            print("컴퓨터의 승리")
        else:
            print("무승부")


        print("-" * 50)
    else:
        break
    again = input("계속하시겠습니까?(y:예, n:아니오) ")

print("게임이 종료되었습니다.")
end = time.localtime(time.time())
print("게임 종료 시간: ",time.strftime("%H:%M:%S %p", end))
print("게임 사용 시간 ",end-start)
    


계속하시겠습니까?(y:예, n:아니오) y
two dice are rolling...
나 5
컴퓨터 1
나의 승리
--------------------------------------------------
계속하시겠습니까?(y:예, n:아니오)

>파일과 예외 처리

텍스트 파일에 데이터를 저장하기

"""
텍스트 파일에 데이터를 저장하기
"""
f = open("new_file.txt","w", encoding="utf-8")
names = ["홍지수", "안지영", "김연수","김예린","한정연"]

for name in names:
    f.write(name + "\n")

print("파일 쓰기 완료!")
f.close()

 

텍스트 파일 읽기

#텍스트 파일 읽기
f = open("new_file.txt", "r", encoding="utf-8")
lines = f.readlines() # 리스트 반환
name_list = []
for line in lines:
    temp = line.replace("\n","")
    name_list.append(temp)

print(name_list)

 

open() 함수의 파일 모드

csv 파일 읽기

"""
CSV 파일 읽기
"""

import csv

file_name = "weather.csv"
f = open(file_name, "r", encoding="utf-8")
lines  = csv.reader(f)
header = next(lines)

for line in lines :
    # 특정 데이터 추출 -> 12월 25일의 최저기온 찾기
    # 지점명[0], 일시[1],평균기온[2],최고기온[3]
    # 최저기온[4], 강수량[5], 습도[6]
    if line[1] =="12월 25일":
        day = line[1]
        min_temp = line[4]
        
        
print("%s 최저기온 : %s도" %(day, min_temp))

f.close()

	### result ###

12월 25일 최저기온 : -1.2도

try ~ except ~ 구문

try:
    print(x)
except NameError:           # NameError
    print("변수가 정의되지 않아 오류가 발생함!")

try ~ except ~  finally ~ 구문

def get_value(list1, n):
    try:
        result = list1[n] 
    except IndexError:  # IndexError : 리스트의 인덱스 오
        print("인덱스가 범위를 벗어남!")
        result = -1  
    finally:
        return result

data = [10, 20, 30]

print(get_value(data, 3))
print(get_value(data, 1))


인덱스가 범위를 벗어남!
-1
20