Big Bro's Studying Archive

Python 기초 7 : 전역변수 선언, 사용자 설정 함수 인자, open함수 등 본문

Big Data展

Python 기초 7 : 전역변수 선언, 사용자 설정 함수 인자, open함수 등

빅브로오 2020. 5. 8. 11:07

@author: Yoon Baek

다양한 함수 생성 방식

전역변수 선언(global, c1 <<- 1 in R)

함수를 통해 내부 변수 선언

v1 = 10
def f1() :
    v1 = 1
    print(v1)

def f2() :
    print(v1)
f1()     # 1 리턴(함수 내부 선언 값이 더 우선순위)
f2()     # 10 리턴(v1이 전역변수 선언되어 있으므로)

global 선언문을 통해 전역변수를 선언할 수 있다.

def f1() : 
    global v2 # 전역변수 선언
    v2 = 1
    print(v2)

def f2() :
    print(v2)
f1()
f2()    # 이번에는 f2도 1리턴

매개변수 전달 방식

1. * 가변형 인자 전달 방식, 내부 반복문 필요 (... in R)

def f1(*para) :
    for i in para :
        print(i)

f1 (1,2,3,4,)

위 함수의 실행 결과 1,2,3,4가 출력된다.
이렇듯 함수의 인자값에 길이가 가변적인 값을 넣을 수가 있다.

예제) 함수에 입력된 모든 값의 곱을 출력하는 함수 생성

def f2(*para) :
    v_multi = 1
    for i in para :
        v_multi = v_multi * i
    return(v_multi)

f2(1,2,3,4,5,6,7)

5040이 출력된다.

2. ** : key-value 인자 전달 방식, 내부 반복문 필요

d1 = {'a' : 1, 'b' : 2, 'c' : 3}
d1.get('a')       # 1 출력
d1['a']           # 'a' key를 이용한 색인
d1.keys()         # 딕셔너리 키값들로만 구성된 오브젝트 형식
set(d1)           # 딕셔너리 키값들로만 구성된 오브젝트 형식, 딕셔너리 형태 유지

set(d1)의 경우 key값들이 딕셔너리의 형태로 출력.
{'a','b','c'}

def f3(**para) :
    for i in para.keys() :
        print('%s의 값은 %s 입니다.' % (i, para[i]))

f3(a = 1, b = 2, c = 3)

3. zip : 동시에 변수를 묶어서 전달 시 필요

def fsum(v1, v2) :
    result=[]
    for i,j in zip(v1,v2) :
        result.append(i+j)
    return result

fsum([1,2,3],[10,20,30])

두 변수를 각각 더한 11,22,33의 결과가 출력된다.

모듈의 생성

모듈 : 함수의 묶음(package in R)

정의된 여러개의 함수를 하나의 파이썬파일(.py)에 저장하면 한 번에 불러올 수 있다.

위의 f1, f2, f3, fsum을 파이썬파일로 따로 저장 -> myfunction.py


위와 같이 함수가 들어가 있는 것을 확인할 수 있다.

[ 연습 문제 ]

두 수를 전달받아 두수의 곱을 구하여 리스트에 저장
저장된 값은 숫자가 큰 순서대로 정렬하여 출력하도록 하는 사용자 정의함수 생성.
단, 사용자 정의 함수에 두 수 이외의 reverse라는 키워드 인자를 입력받도록 하자.

def fprod(L1, L2, reverse = True) :
    result = []
    for i, j in zip(L1,L2) :
        result.append(i*j)
    result.sort(reverse = reverse)
    return result

다른 풀이법

def fprod2(x, y, **para) :
    result = []
    for i, j in zip(L1,L2) :
        result.append(i*j)
    result.sort(reverse = para['reverse'])
    return result

fprod([1,2,3],[4,5,6],True)

외부파일 불러오기

  • 파이썬 내장 메소드
  • 특히 텍스트로 구성된 파일을 불러오는데 유용하게 사용할 수 있다.
  1. open : 파일을 열어서 메모리 상으로 불러오는 작업(cursor 선언)
  2. fetch : 선언된 cursor(임시 메모리 공간)에 저장된 data를 한 건 씩 불러오기
  3. close : 객체 선언 완료 후 cursor에 할당된 메모리 영역 close
        cursor를 닫지 않으면 메모리 누수현상이 발생할 수 있으므로 주의
    c1 = open('read_test1.txt')   # open : 커서 선언
    v1 = c1.readline()
    print(v1)
    

v2 = c1.readline()
print(v2) # 이상 fetch

c1.close() # 이상 close

while 1 :
v1 = c1.readline()
if v1 == '' :
break
print(v1, end = '') # fetch 과정의 반복문 처리
# 원 텍스트 자체가 \n을 갖고 있기 때문에 print 문의 '\n' 자동 삽입을 꺼줌

v3 = c1.readlines() # 한꺼번에 불러올 수 있음.

# [ 실습 문제 : 아래와 같은 함수 생성]
f_read_txt(file, sep = ';', fmt = 'int') 구현\
read_test1을 미리 텍스트 파일로 만들어 놓아 보자
```python
# read_test1
1 2 3 4
5 6 7 8 
def f_read_txt(file, sep, fmt):
    of = open(file)
    v1 = of.readlines()
    of.close
    v2 = []
    for i in range(0,len(v1)) :
        v2.append(v1[i].replace('\n',''))
    result = []
    if fmt == str :
        for i in range(0,len(v2)) :
            result.append(v2[i].split(sep))
        return result
    elif fmt == int :
        for i in range(0,len(v2)) :
            result.append(list(map(fmt,v2[i].split(sep))))            
        return result
    else :
        print('int와 str 중에서 입력해 주세요.')
list(map(int,['1','2'])) # 형변환 함수는 리스트 적용이 불가하기 때문

f_read_txt('read_test1.txt', ' ', int)
# fmt를 함수명 그대로 받아와도 된다!

풀이2-1 fmt 인자를 함수명 그 자체로 전달

def f_read_txt(file, sep = ' ', fmt = int) :
    c1 = open('read_test1.txt','r')       # 커서 선언
    v1 = c1.readlines()                   # fetch
    c1.close()                            # close
    outlist = []
    for i in v1 :
        L1 = i.strip().split(sep)
        outlist.append([fmt(i) for i in L1])

    return outlist

f_read_txt('read_test1.txt', sep = ' ', fmt = 'int')  # 불가
f_read_txt('read_test1.txt', sep = ' ', fmt = int)    # 가능

풀이2-2 fmt 인자를 '함수명' 형태로 전달

def f_read_txt(file, sep = ' ', fmt = 'int') :
    c1 = open('read_test1.txt','r')       # 커서 선언
    v1 = c1.readlines()                   # fetch
    c1.close()                            # close
    outlist = []
    for i in v1 :
        L1 = i.strip().split(sep)
        outlist.append([eval(fmt + '(' + i + ')') for i in L1])

    return outlist

f_read_txt('read_test1.txt', sep = ' ', fmt = 'int')  # 가능
f_read_txt('read_test1.txt', sep = ' ', fmt = int)    # 불가

Comments