본문 바로가기

파이썬(PYTHON)/개념정리
[파이썬(Python)] 사용자 정의 함수(def), 모듈, 파일 입출력

'''
# 함수(function)  :  입력값(인자값,인수값, 파라미터, 매개 변수, argument), 기능 구현, 결과값(출력값, 리턴값, 반환값))

- ★★재사용 가능한 블록
- print같은 내장함수도 있지만 직접 함수를 정의하여 사용할 수 있음
- 함수정의 방법
    ~def 로 시작함
    ~함수명을 작성함
    ~함수명 옆에 ()(괄호) 붙임, 인자가 필요하면 괄호안에 표기함.
    ~:(콜론)을 붙여서 블록을 시작함
    ~코드 부분은 들여쓰기를 시작하여 작성함.
    ~return은 반환값이 존재하면 작성하고, 반환값이 없으면 작성안함.(None반환)

- def 함수명(입력값) :
    수행코드
    return [결과값] #결과값이 있다면

- 함수호출(call) : 함수 정의 이후, 함수를 호출(call)을 해야만 함수가 실행됨.

- 변수 범위 : 모든 위치의 변수에 접근이 가능하지 않음.
    ~지역변수 : 함수 내부에 정의된 변수 (함수 안에서만 접근가능함.)
    ~전역변수 : 함수 외부에 정의된 변수 (전체에서 접근가능함.)

-  인자 사용 방법1 : 인자 사용하는 변수를 지정하여 사용 가능

def test(a) :
    print(a)

test(a="hi") #ok
test(b="hi") #error
test("hello") #ok - 변수가 한 개일때

def add(num1, num2) :
     result1 = num1 + num2

     return result1

print( add(num1=3, num2=4) ) #ok
print( add(num1=3, num3=4) ) #error    
print( add(3,4) ) #ok
print( add(3, num2=4) ) #ok



-인자 사용 방법2 : 인자 사용하는 변수에 기본값을 미리 지정할 수 있음(default argument)
    ~default 인자는 맨 마지막에 위치해야 함. ex) (num1=10, num2) -> 불가!!!

def add(num1, num2=10) :
     result1 = num1 + num2

     return result1

print( add(4) ) #4
print( add(4,15) ) #19 -> 두 개 넣어도 됨!(두 개 다 넣을 경우 기본값에 덮어씀)



- 인자 사용 방법3 : 인자의 개수가 지정하기 어려울때 *(아스터리스크)를 붙일 수 있음. *가 붙은매개 변수는 tuple형이 됨.

#가변 변수 함수
def addMulti(*num) :
    print(num)

addMulti(1,2,3)  #(1, 2, 3, 4, 5)


- 반환값은 원래 하나여야 함! (파이썬은 특이하게 결과값에 여러 개를 입력하면 튜플 형식으로 묶어서 하나로 반환 가능)

def add(num1, num2) :
    result1 = num1 + num2
    result2 = num1 - num2

    return result1, result2

print( add(3,4) ) # (7, -1)


==========================================================================
==============

연산 함수 만들기

print("===========================\n\n\n\n\n\n\n")
#두 수를 더하는 메서드(함수)

def add(num1, num2) :
    result1 = num1 + num2

    return result1

print( add(3,4) )

print("\n===========================\n\n\n\n\n\n\n")

#두 수를 빼는 메서드(함수)
def minus(num1, num2) :
    result2 = num1 - num2

    return result2

print( minus(5,4) )

print("\n===========================\n\n\n\n\n\n\n")

#두 수를 곱하는 메서드(함수)
def multiple(num1, num2) :
    result3 = num1 * num2

    return result3

print( multiple(5,4) )

print("\n===========================\n\n\n\n\n\n\n")

#두 수를 나누는 메서드(함수)
def devide(num1, num2) :
    result4 = num1 / num2

    return result4

print( devide(6,2) )

print("\n===========================\n\n\n\n\n\n\n")

#두 수를 더하는 메서드(함수) - 인자 미리 지정
def add(num1, num2=10) :
     result1 = num1 + num2

     return result1

print( add(4) )

print("\n===========================\n\n\n\n\n\n\n")

#세 수를 더하는 메서드(함수)
def add(num1, num2, num3) :
    result = num1 + num2 + num3

    return result

print( add(1,2,3) )

print("\n===========================\n\n\n\n\n\n\n")


==========================================================================
==============

결과값이 없는 함수

#결과값이 없는 함수 : 화면에 hello, python 출력

def helloPython() :
    print("hello, python")

    return None #결과값이 없을 경우 안 적어도 되지만, ★★무조건 return이 있다! 생략이 가능할 뿐

helloPython()


==========================================================================
==============

가변 변수 함수

print("\n===========================\n\n\n\n\n\n\n\n\n\n")

#가변 변수 함수
def addMulti(*num) :
    result = 0

    for i in num :
        result = result + i

    return result

print( addMulti(1,2) )

print("\n===========================\n\n\n\n\n\n\n")


==========================================================================
==============

모듈(module)

'''
#모듈: 클래스, 함수, 변수 를 의미 있게 모아 놓은 것
- 모듈을 이용하면 코드를 좀 더 이해하기 쉽고 논리적으로 만들 수 있음.

- 모듈은 함수, 클래스, 변수로 이루어짐.

- 모듈은 독자적으로 실행 가능함.

- import 키워드를 사용함.
import module1 [, module2, module3…]

- 파이썬 파일명이 모듈명이 됨. ★★모둘명 파일과 실행할 파일이 같은 경로(폴더)에 존재해야 함.
* 모듈 찾는 방식(아래 순서대로 찾음) "
    1. 현재 같은 디렉토리
    2. 같은 디렉토리가 아니면, pythonpath 의 경로
    3. 이것도 찾을 수 없으면, 파이썬의 기본 경로
* sys.path 변수에서 확인 가능
import sys
print(sys.path)

- import <가져올 모듈명> 으로 모듈을 가져올 수 있다. 이를 Generic Import라 한다.
ex) import random

- 불러온 모듈을 사용할때는 <모듈명.함수명> 으로 사용한다.
ex) random.choice(a) / random.choice(b)

- 모듈은 처음 한 번만 불러옴.

- 만약 매번 모듈명을 앞에 쓰는게 귀찮다면 from <모듈명> import <그 중의 함수명> 을 사용하면 된다.
ex1) from random import choice -> choice(a) / choice(b)
ex2) from calc import add, sum-> a=add(1,2) / print(sum)

- 모든 함수를 가져오고 싶다면 from <모듈명> import * 를 하면 된다.
ex) from random import *  -> choice(a)  / shuffle(b)

'''

모듈 경로가 다른 경우 설정하는 방법

-  PYTHONPATH 경로 설정

 

모듈에 들어있는 정보 확인하기

#dir(modname) : 모듈이 가지고 있는 정보를 반환

import calc

print( dir (calc) )
print(calc.__name__) # 모듈 calc의 __name__
print(__name__) # 실행하고 있는 현재 파일의 __name__


==========================================================================
==============

'''
#디렉토리도 하나의 파일!

#파일 입출력 (File I/O)

- 파일 열고 닫기(열었으면 닫아줘야 함!)
    ~파이썬에서 파일에 관련한 기본적인 함수를 제공함.
    ~file 객체를 사용하여 조작함.

- 파일 열기
    ~파일을 읽고 쓰려면 먼저 파일을 열어야 함.
    ~open() 함수를 사용함.
    ~open(filename [, access_mode] [, buffering])
    ~access_mode 는 읽기, 쓰기, 추가하기
        <access mode>
        - r : 기본모드. 읽기전용
        - r+ : 읽고 쓸 수 있는 모드
        - w : 쓰기 전용. 파일이 없으면 새롭게 파일을 만들고, 있으면 덮어 씀.(덮어쓰기)
        - w+ : 읽고 쓸 수 있는 모드, 파일이 없으면 새롭게 파일을 만들고, 있으면 덮어 씀.
        - a : 파일에 내용을 추가함. 파일이 없으면 새롭게 파일을 만듬.(이어쓰기)
        - a+ : 추가하고 읽을 수 있는 모드. 파일이 없으면 새롭게 파일을 만듬.
        
- File 객체 속성값
    ~file.closed : 파일이 닫혀있으면 true. 그렇지 않으면 false.
    ~file.mode : 파일을 연 mode를 반환함.
    ~file.name : 파일명을 반환함.
    
    f = open("test.txt", "w")
    print("이름", f.name)
    print("모드", f.mode)
    f.close()

- 파일닫기
    ~파일을 닫은 후에는 쓰거나 읽을 수 없음
    ~close()를 하여 닫는 처리를 하는 것이 좋음.
'''

==========================================================================
==============

파일 입출력(I/O) - w

f = open("d:/sample.txt", 'w')

f.write("안녕하세요?\n")
f.write("오늘은 토요일입니다.\n")
f.write("이제 곧 저녁시간입니다.\n")

f.close()


==========================================================================
==============

파일 입출력(I/O) - r

f = open("d:/sample2.txt", 'r')

line1 = f.readline() #한 줄씩 읽기
line2 = f.readline()

line1 = line1.strip() #줄바꿈 제거
line2 = line2.strip()

print(line1)
print(line2)      

f.close()

 

f = open("d:/sample2.txt", 'r')

while True :
    line = f.readline()

    if (not line) :
        break

    print(line.strip())

f.close()


==========================================================================
==============

 

파일 입출력(I/O) - a

f = open("d:/sample2.txt", 'a')

f.write("조금 졸립니다.\n")

f.close()


==========================================================================
==============

파일명 변경

- os 모듈을 이용함. import os
- os.rename(현재 파일명, 바꿀 파일명)

import os

os.rename("d:/sample2.txt", "d:/파일명 변경.txt")

 

from os import *

rename( "d:/파일명 변경.txt", "d:/sample4.txt")


==========================================================================
==============

 

파일 삭제

- os 모듈을 이용함. import os
- os.remove(파일명)

from os import *
remove("d:/sample4.txt")


==========================================================================
==============

파일 이동

- os 모듈을 이용함. import os
- os.rename(현재 폴더/ 파일명, 바꿀 폴더/ 파일명)

from os import *

rename( "d:/sample.txt", "d:/python/sample.txt")


==========================================================================
==============

pickel

#pickel : txt 데이터가 아닌 파이썬 객체 자체를 파일로 저장

- pickle.dump(객체, 파일) 로 저장
- pickle.load(파일) 로 로딩
 
import pickle

profile_file = open("d:/profile.pickle", "wb")


profile = {"이름":"박명수", "나이": "30", "취미" : ["축구", "골프", "코딩"]}

print(profile)

pickle.dump(profile, profile_file) # profile 에 있는 정보를 file에 저장  #pickle.dump(객체, 파일)

profile_file.close()

 

profile_file = open("d:/profile.pickle", "rb")

profile = pickle.load(profile_file) # file에 있는 정보를 profile에 불러오기 # pickle.load(파일) 

print(pickle)

profile_file.close()