일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 적용함수
- Suhr
- 스트라토캐스터
- Asato
- Prs
- oracle
- 메서드
- 리스트
- 파이썬
- 오더
- 존써
- 조인
- ansi표준
- group by
- case문
- 펜더
- 텔레
- 논리연산자
- Python
- 쏜버커
- to_date
- 로즈우드
- MateusAsato
- 오라클
- 커스텀
- 메이플
- Decode
- SQL
- 서브쿼리
- 로스티드메이플
- Today
- Total
Big Bro's Studying Archive
Python 기초 7 : 전역변수 선언, 사용자 설정 함수 인자, open함수 등 본문
@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)
외부파일 불러오기
- 파이썬 내장 메소드
- 특히 텍스트로 구성된 파일을 불러오는데 유용하게 사용할 수 있다.
- open : 파일을 열어서 메모리 상으로 불러오는 작업(cursor 선언)
- fetch : 선언된 cursor(임시 메모리 공간)에 저장된 data를 한 건 씩 불러오기
- 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) # 불가
'Big Data展' 카테고리의 다른 글
SQL 기초 : 다중 컬럼 서브쿼리 : 중첩서브쿼리와 상호연관 서브쿼리, 그리고 인라인 뷰 (Nested subquery, Correlated subquery, Inline view) (0) | 2020.05.12 |
---|---|
SQL 기초 : 다중행 서브쿼리의 사용법 (0) | 2020.05.11 |
R로 접하는 통계 : T - test (0) | 2020.05.03 |
SQL by Oracle #6 outer join과 다양한 서브쿼리 (0) | 2020.04.24 |
Python 기초 6 : for 반복문, map함수, 리스트 내포표현식을 이용한 리스트 연산 (0) | 2020.04.21 |