반응형

Python 의 decorator 는 funciton 이나 class에 코드의 내용을 변경하지 않고도 기능을 확장할 수 있는 아주 유용한 툴입니다. 

Decorator를 이해하기 위해서는 몇 가지 알아두면 좋은 내용들이 있어서 먼저 알아보고, decorator에 대해서 알아보도록 하겠습니다. 

 

 

First Class Objects

먼저 한국말로는 일급 객체라고 이야기하는 first class objects에 대해서 알아보겠습니다. 일급 객체는 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킵니다. 보통 함수에 인자로 넘기기, 수정하기, 변수에 대입하기와 같은 연산을 지원할 때 일급 객체라고 합니다.

 

일급 객체는 다음과 같은 특징이 있습니다. (by 로빈 포플스톤)

  • 모든 요소는 함수의 실제 매개변수가 될 수 있다.
  • 모든 요소는 함수의 반환 값이 될 수 있다.
  • 모든 요소는 할당 명령문의 대상이 될 수 있다.
  • 모든 요소는 동일 비교의 대상이 될 수 있다.

 

Python에서는 function 도 일급 객체로 분류됩니다. 아래 예시를 보면 쉽게 이해가 될 겁니다.

def add_10(val):
    return val + 10

def run_func(f, val):
    return f(val)

# (add_10 함수를) 매개변수로 사용
run_func(add_10, 10)

# (add_10 함수를) 반환값으로 사용
def plus_10():
    return add_10

# (add_10 함수를) 다른 변수에 할당
plus_ten = add_10

# 비교의 대상으로 사용
print(add_10 is run_func)

 

여기서 일급객체를 특별히 설명한 이유는 Python에서는 "function"이 일급객체이기 때문에, 매개변수로 사용할 수 있으며, function을 리턴 값으로 사용할 수 있다는 특징을 상기시키기 위함입니다. 많은 프로그래밍 언어들이 function을 일급객체로 사용하기 때문에 특별히 거부감이 있는 컨셉은 아닐겁니다.

 

 

Inner Functions

Python에서는 함수의 내부에 다른 함수를 정의하는 것이 가능합니다. 내부에 정의된 함수를 inner functions 라고 부르는 데요.. 한국말로는 내부 함수가 적절할 표현일 것 같습니다. (어떤 분은 내장 함수라고 번역하시기도 했는데요, 일반적으로 내장함수는 프로그래밍 언어에서 지원해주는 기본 함수를 이야기 하기 때문에 내부 함수라는 표현이 더 적절할 것 같습니다.)

 

아래 예시를 보면, parent 함수 내에 child  함수를 정의해서 사용하였습니다. child 함수의 scope은 parent 함수 내에서만 유효합니다.

def parent():
    print("parent")
    def child():
    	print("child")
    child()

 

 

바로 전에서 이야기했던 일급객체의 개념을 같이 사용하면 아래와 같은 사용이 가능합니다.

def parent(num):
    def first_child():
        return "I'm first child"
    def second_child():
        return "I'm second child"
    def others():
        return "not exist"
    
    # match - case는 python 3.10 이후 부터 지원
    match num:
        case 1:
            return first_child
        case 2:
            return second_child
        case _:
            return others

child1 = parent(1)
print(child1())

child2 = parent(2)
print(child2())

child3 = parent(3)
print(child3())

 

 

Simple Decorators

위에서 decorator를 구현하기 위한 중요한 컨셉들에 대해서 알아보았으니, 이제 decorator로 넘어갈 차례입니다. 먼저 아래 예시를 살펴보겠습니다.

 

def decorator(func):
    def wrapper():
        print("BEFORE")
        func()
        print("AFTER")
    return wrapper

def some_function():
    print("RUN")

some_function = decorator(some_function)

 

위의 예시에는 decorator() 함수와, some_function() 함수가 정의되어 있고, decorator() 함수에는 wrapper() 라는 내부 함수가 정의되어 있습니다. 그리고 마지막 줄에서는 some_function()을 decorator() 함수를 실행한 결과로 변경하였습니다.

 

여기서 some_function()을 실행하면 아래와 같은 결과가 화면에 출력될 겁니다.

>>> some_function()
BEFORE
RUN
AFTER

 

 

원래 some_function() 함수에서는 "RUN"만 출력해 주는데, decorator()를 통해서 변경한 some_function()은 "BEFORE", "RUN", "AFTER"를 차례로 출력해 줍니다. 쉽게 이야기해서 decorator() 함수가 some_function() 함수를 감싸서, 변경해 주었다고 할 수 있습니다.

 

실제로 decorator를 사용할 때는, 아래와 같이 @ 기호를 붙여서 함수 앞에 붙여 주면 됩니다. 아래 예시에서는 @decorator 는 some_function = decorator(some_function) 를 짧게 표현해 주는 방법으로 생각할 수 있습니다.

def decorator(func):
    def wrapper():
        print("BEFORE")
        func()
        print("AFTER")
    return wrapper

@decorator
def some_function():
    print("RUN")

 

 

아래처럼 check_performance() decorator를 이용하면, 각 함수의 수행 시간을 알 수 있습니다.

import time
def check_performance(func):
    def wrapper():
        begin = time.time()
        func()
        end = time.time()
        print("Time: ", func.__name__, end - begin)
    return wrapper

@check_performance
def some_function():
    print("RUN")

 

 

매개 변수가 있는 함수를 위한 decorator

이전 예시에서는 매개변수가 없는 간단한 함수에 대한 decorator를 정의해서 사용해 봤는데요, 이번에는 원래 함수에 매개변수가 있는 경우에 대해서 decorator를 작성해 보겠습니다.

 

위의 예시를 조금 변경해보면, 다음과 같습니다. *args 와 **kwargs 를 이용해서 매개변수를 전달해 주면 됩니다.

import time
def check_performance(func):
    def wrapper(*args, **kwargs):
        begin = time.time()
        func(*args, **kwargs)
        end = time.time()
        print("Time: ", func.__name__, end - begin)
    return wrapper

@check_performance
def some_function(some_param):
    print("RUN", some_param)

 

 

Decorator 함수에서 결과를 돌려 받기

지금까지의 예시에서는 화면에 결과를 출력하고 끝내는 간단한 예시였는데, 이번에는 결과를 돌려받는 경우를 가정해 보겠습니다.

 

import time
def check_performance(func):
    def wrapper(*args, **kwargs):
        begin = time.time()
        func(*args, **kwargs)
        end = time.time()
        print("Time: ", func.__name__, end - begin)
    return wrapper

@check_performance
def say_hi(name):
    return f"Hi {name}"

 

 

print( say_hi("Alex") ) 를 실행해 보면, 함수의 수행 시간과 "None" 만 출력될 뿐, "Hi Alex" 는 출력되지 않습니다.

>>> print(say_hi("Alex"))
Time:  say_hi 2.1457672119140625e-06
None

 

 

아래와 같이 wrapper를 수정하면, 원하는 결과를 돌려받을 수 있습니다. 

 

import time
def check_performance(func):
    def wrapper(*args, **kwargs):
        begin = time.time()
        ret = func(*args, **kwargs)
        end = time.time()
        print("Time: ", func.__name__, end - begin)
        return ret
    return wrapper

@check_performance
def say_hi(name):
    return f"Hi {name}"

 

 

Decorator 에 parameter 설정하기

이번에는 decorator 에 parameter를 설정하는 방법을 살펴보겠습니다.

 

아래 예시는 Django에 내장되어 있는 login_required decorator를 커스텀 버전으로 구현해 본 코드입니다. (실제 구현은 아래 코드와는 상이하게 작성이 되어 있습니다. 실제 코드가 궁금하신 분은 다음 링크 참고하세요. https://github.com/django/django/blob/main/django/contrib/auth/decorators.py)

from django.http import HttpResponse
from django.http import HttpResponseRedirect

def custom_login_required(*args, **kwargs):
    def _inner_func(func):
        def wrapper(*f_args, **f_kwargs):
            request = f_args[0]
            if request.user.is_authenticated:
                return func(*f_args, **f_kwargs)
            else:
                return HttpResponseRedirect(kwargs.get('login_url', '/') + f"?next={request.path}")
        return wrapper
    return _inner_func

@custom_login_required(login_url='/login/')
def test_view(request):
	return HttpResponse('success')

 

 

참고로 parameter가 필요한 decorator를 사용하게 되면, 실제 전달 인자가 없는 경우에도 함수를 호출하는 형태로 decorator를 사용해야 합니다. 

# Error: 'function' object has no attribute 'get'
@custom_login_required
def test_view_wrong(request):
	return HttpResponse('success')
    
# working!
@custom_login_required()
def test_view_correct(request):
	return HttpResponse('success')

 

 

참조 웹 사이트

이 글을 작성하면서 아래 웹 사이트들을 참조하였습니다. 이 글에서 다루지 않은 내용들도 있으니 한번 확인해 보시는 것도 좋을 듯 합니다.

 

https://realpython.com/primer-on-python-decorators/

 

Primer on Python Decorators – Real Python

In this tutorial, you'll look at what Python decorators are and how you define and use them. Decorators can make your code more readable and reusable. Come take a look at how decorators work under the hood and practice writing your own decorators.

realpython.com


https://www.geeksforgeeks.org/decorators-in-python/

 

Decorators in Python - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

 

반응형

'프로그래밍 > Python' 카테고리의 다른 글

9. 파일 관리  (0) 2019.02.21
8. 파일 읽고 쓰기  (0) 2019.02.21
7. 정규 표현식  (0) 2019.01.09
6. 문자열 다루기  (0) 2019.01.08
5. 사전 (Dictionary)  (0) 2019.01.07
반응형

* 이 포스트는 "파이썬 프로그래밍으로 지루한 작업 자동화하기" 의 내용을 참조해서 작성하였습니다.

* 파이썬 3.3을 기준으로 작성하였습니다.



파일 및 폴더 관리


shutil, os 모듈을 이용한 파일 및 폴더 관리에 대해서 알아보겠습니다.



파일 혹은 폴더 복사하기


>>> import shutil

>>> shutil.copy('/tmp/spam.txt', '/tmp2')

# /tmp 경로에 있는 spam.txt 파일을 /tmp2 경로로 복사합니다.

>>> shutil.copy('eggs.txt', '/tmp2/eggs2.txt')

# 현재 작업 경로에 있는 eggs.txt 파일을 /tmp2 경로에 eggs2.txt 파일로 이름을 변경하여 복사합니다.

>>> shtuil.copytree('/tmp/bacon', '/tmp/bacon_backup')

# /tmp/bacon 폴더에 있는 모든 내용을 /tmp/bacon_backup 으로 복사합니다.


 

파일 혹은 폴더 이동 및 이름 바꾸기


>>> import shutil

>>> shutil.move('/tmp/bacon.txt', '/eggs')

# 만약 /eggs 라는 폴더가 있다면, /tmp 경로에 있는 bacon.txt 파일을 /eggs 경로로 이동합니다.

# 만약 /eggs 라는 폴더가 없다면, /tmp 경로에 있는 bacon.txt 파일을 / 경로로 옮기고 파일 이름을 eggs 로 변경합니다.

>>> shutil.move('/tmp/bacon.txt', '/eggs/new_bacon.txt')

# /tmp 경로 있는 bacon.txt 파일을 /eggs 경로로 옮기고 파일 이름을 new_bacon.txt 로 변경합니다.



파일 혹은 폴더 지우기


 os.unlink()

 파라미터로 보내진 경로에 있는 파일을 삭제합니다. 

 os.mkdir()

 파라미터로 보내진 경로에 폴더를 생성합니다. 

 os.rmdir()

 파라미터로 보내진 경로에 있는 폴더를 삭제합니다. 해당 경로에는 어떤 파일이나 폴더도 없는 빈 폴더여야 합니다.

 shutil.rmtree()

 파라미터로 보내진 경로에 있는 폴더를 삭제합니다. 그 안의 파일 및 폴더도 모두 삭제됩니다.



다음은 확장자가 txt 인 파일을 모두 삭제하는 코드입니다.


>>> import os

for filename in os.listdir():

if filename.endswith('.txt'):

os.unlink(filename)



디렉토리 경로 탐색


os.walk() 함수를 이용합니다.


>>> import os

>>> for folderName, subfolders, filenames in os.walk('.'):

>>>    print (folderName, subfolders, filenames)




파일 압축하기


zipfile 모듈을 이용한 파일 압축에 대해서 알아보겠습니다.



ZIP 파일 읽기


ZipFile 객체를 생성하여 필요한 작업을 수행하고 객체의 리소스를 해제해 줍니다.


>>> import zipfile, os

>>> testZip = zipfile.ZipFile('example.zip')

# example.zip 파일로 부터 ZipFile 객체를 생성합니다.

>>> testZip.namelist()

# example.zip 파일에 포함된 파일 리스트를 출력합니다.

>>> testFile = testZip.getinfo('test.txt')

# example.zip 파일에 들어 있는 test.txt 파일에서 정보를 읽어서 ZipInfo 형태의 객체를 돌려줍니다.

>>> testFile.file_size

# test.txt 파일의 압축되기 전 크기를 출력합니다.

>>> testFile.compress_size

# text.txt 파일이 압축된 파일 크기를 출력합니다.

>>> testZip.close()

# 객체의 리소스를 정리합니다.



ZIP 파일에서 추출하기


extract, extractAll 메소드를 이용하여 파일을 추출합니다.



전체 파일 추출하기


>>> import zipfile, os

>>> testZip = zipfile.ZipFile('example.zip')

>>> testZip.extractAll()

# 현재 작업 경로에 example.zip 파일에 있는 모든 파일을 추출합니다.

>>> testZip.close()



일부 파일 추출하기


>>> import zipfile, os

>>> testZip = zipfile.ZipFile('example.zip')

>>> testZip.extract('test.txt')

# 현재 작업 경로에 test.txt 파일을 추출

>>> testZip.extract('test.txt', '/tmp)

# /tmp 에 test.txt 파일을 추출



파일에서 압축하기


압축 파일을 생성하려면, ZipFile 객체를 생성할 때, 두 번째 인수로 'w' 를 전달하여 쓰기 모드로 열면 됩니다. 

파일을 압축해서 추가할 때는 write() 메소드를 사용합니다.


>>> import zipfile

>>> newZip = zipfile.ZipFile('new.zip', 'w')

>>> newZip.write('spam.txt')

>>> newZip.close()




반응형

'프로그래밍 > Python' 카테고리의 다른 글

decorator 사용하기  (0) 2024.06.06
8. 파일 읽고 쓰기  (0) 2019.02.21
7. 정규 표현식  (0) 2019.01.09
6. 문자열 다루기  (0) 2019.01.08
5. 사전 (Dictionary)  (0) 2019.01.07
반응형

* 이 포스트는 "파이썬 프로그래밍으로 지루한 작업 자동화하기" 의 내용을 참조해서 작성하였습니다.

* 파이썬 3.3을 기준으로 작성하였습니다.



파일과 파일 경로


파일 속성 : 파일 이름, 경로



경로 구분자


윈도우에서는 백슬래시(\), MacOS (OSX) 와 리눅스에서는 슬래시(/)


os.path.sep 으로 확인이 가능합니다.


os.path.join() 을 이용해서 운영체제에 관계 없는 경로 생성이 가능 


>>> import os

>>> os.path.join('usr','bin','spam')

'usr/bin/spam'  (MacOS or Linux)

'usr\\bin\\spam' (Windows)



유용한 메써드


 os.getcwd()

 현재 경로를 확인 

 os.makedirs()

 새 폴더 만들기 

 os.listdir()

 매개변수 경로에 있는 파일 이름 문자열의 리스트를 돌려줍니다. 



상대 경로 vs 절대 경로


절대 경로 : 항상 루트 폴더로 시작한다.

상대 경로 : 프로그램의 현재 작업 디렉터리를 기준으로 시작한다.


. : 현재 디렉터리

.. : 부모 디렉터리



os.path 모듈


os.path 모듈에는 파일 이름과 파일 경로에 관련된 많은 유용한 기능을 포함하고 있습니다.



 os.path.abspath()

 매개변수의 절대 경로 문자열을 돌려줍니다.

 os.path.isabs()

 매개변수가 절대 경로일 때 True를, 상대 경로일 때 False 를 돌려 줍니다.

 os.path.relpath()

 두번째 매개변수의 경로로 시작하는 첫번째 매개변수의 상대 경로 문자열을 돌려 줍니다.

 os.path.dirname()

 매개변수의 마지막 슬래시 앞에 오는 모든 문자열을 돌려 줍니다. (윈도에서는 백슬래시) - 보통 파일 경로가 됩니다.

 os.path.basename()

 매개변수의 마지막 슬래시 뒤에 오는 모든 문자열을 돌려 줍니다. (윈도에서는 백슬래시) - 보통 파일 이름이 됩니다.

 os.path.sep

 현재 운영체제의 경로 구분자

 os.path.getsize()

 매개변수 안에 있는 파일의 크기를 바이트 단위로 돌려줍니다.

 os.path.exists()

 매개변수가 가리키는 파일 또는 폴더가 존재하면 True를, 그렇지 않다면 False를 돌려 줍니다. 

 os.path.isfile()

 매개변수가 존재하며 파일이라면 True를, 그렇지 않다면 False를 돌려 줍니다. 

 os.path.isdir()

 매개변수가 존재하며 폴더라면 True를, 그렇지 않다면 False를 돌려 줍니다. 




파일 읽기 / 쓰기 프로세스


1. open() 함수를 호출하여 File 객체를 돌려받습니다.

2. File 객체에 대해서 read() 혹은 write() 메써드를 사용하여 작업을 합니다.

3. File 객체의 close() 메써드를 이용하여 파일을 닫습니다.



파일 열기 속성


 r

 파일을 읽기 모드로 열어서 돌려 줍니다.

 w

 파일을 쓰기 모드로 열어서 돌려 줍니다. (이미 파일이 존재하면 내용이 삭제됩니다.)

 a

 파일을 이어 쓰기 모드로 열어서 돌려 줍니다. (기존 파일이 존재하지 않으면 새 파일을 생성합니다.)

 x

 파일을 이어 쓰기 모드로 열어서 돌려 줍니다. (기존 파일이 존재하지 않으면 예외가 발생됩니다.)

 b

 파일을 바이너리 모드로 돌려 줍니다.

 +

 파일을 업데이트 모드로 돌려 줍니다.



파일 읽기 예제


>>> f = open('test.txt')

>>> data = f.read()

>>> f.close()


data에 파일 내용이 들어 갑니다.



파일 쓰기 예제


>>> f = open('test.txt', 'w')

>>> f.write("test")

>>> f.close()


test.txt 파일에 문자열 "test" 가 저장됩니다.



반응형

'프로그래밍 > Python' 카테고리의 다른 글

decorator 사용하기  (0) 2024.06.06
9. 파일 관리  (0) 2019.02.21
7. 정규 표현식  (0) 2019.01.09
6. 문자열 다루기  (0) 2019.01.08
5. 사전 (Dictionary)  (0) 2019.01.07
반응형

* 이 포스트는 "파이썬 프로그래밍으로 지루한 작업 자동화하기" 의 내용을 참조해서 작성하였습니다.

* 파이썬 3.3을 기준으로 작성하였습니다.



정규표현식으로 텍스트 패턴 검색


정규식 객체 만들기


re 패키지를 import 합니다.


>>> import re



정규표현식을 나타내는 문자열 값을 re.compile()에 전달하여 Rebex 패턴 객체 (혹은 Regex 객체)를 생성합니다.


>>> phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')

(참고로 미국 전화번호 포맷은 000-000-0000 형식입니다.)



Regex 객체를 이용한 패턴 검색


위에서 생성한 패턴 객체에 search 매써드를 이용해서 match 객체를 돌려 받습니다.


>>> mo = phoneNumRegex.search('My number is 212-555-1234.')



Match 객체에 group 매써드를 이용해서 결과를 확인합니다.


>>> print (mo.group())

212-555-1234




정규표현식을 사용한 더 많은 패턴 검색


괄호로 묶기


패턴 중의 일부를 분리해서 사용하는 경우 (전화번호에서 지역 코드를 나머지 번호로부터 분리하고 싶은 경우)


>>> phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)')

>>> mo = phoneNumRegex.search('My number is 212-555-1234.')

>>> print (mo.group(1))

212

>>> print (mo.group(2))

555-1234

>>> print (mo.group(0))

212-555-1234

>>> print (mo.group())

212-555-1234

>>> print (mo.groups())

(212, 555-1234)



파이프로 여러 그룹 검색하기


'|' 글자를 파이프라고 합니다.

여러 가지 표현 중 하나만 일치해도 되는 곳에 사용 (or)

처음으로 일치하는 텍스트가 Match 객체로 반환됩니다.


>>> testRegex = re.compile(r'AAA|BBB')

>>> mo1 = testRegex.search('AAA and BBB')

>>> mo1.group()

'AAA'


>>> mo2 = testRegex.search('BBB and AAA')

>>> mo2.group()

'BBB'



물음표와 선택적 검색


해당 부분이 없거나 한 번만 나타나는 경우


>>> testRegex = re.compile(r'Super(wo)?man')

>>> mo1 = testRegex.search('The world of Superman')

>>> mo1.group()

'Superman'


>>> mo2 = testRegex.search('The world of Superwoman')

>>> mo2.group()

'Superwoman'



* 및 + 를 이용한 선택적 검색


* 표시는 0개 또는 그 이상과 일치를 의미

+ 표시는 1개 또는 그 이상과 일치를 의미


>>> testRegex = re.compile(r'Super(wo)*man')

>>> mo1 = testRegex.search('The world of Superman')

>>> mo1.group()

'Superman'


>>> mo2 = testRegex.search('The world of Superwoman')

>>> mo2.group()

'Superwoman'


>>> mo3 = testRegex.search('The world of Superwowowoman')

>>> mo3.group()

'Superwowowoman'


>>> testRegex = re.compile(r'Super(wo)+man')

>>> mo1 = testRegex.search('The world of Superman')

>>> print mo1

None


>>> mo2 = testRegex.search('The world of Superwoman')

>>> mo2.group()

'Superwoman'


>>> mo3 = testRegex.search('The world of Superwowowoman')

>>> mo3.group()

'Superwowowoman'



중괄호를 이용하여 특정 횟수 반복 패턴 검색


(A){3} # A가 정확하게 3회 반복

(A)(A)(A)


(A){3,5} # A가 3회 ~ 5회 반복

((A)(A)(A)|(A)(A)(A)(A)|(A)(A)(A)(A)(A))


>>> aRegex = re.compile(r'(A){3}')

>>> mo1 = aRegex.search('AAA')

>>> mo1.group()

'AAA'




최대 일치와 최소 일치


(A){3,5} 정규식은 'AAAAA' 문자열에서 'AAA', 'AAAA', 'AAAAA' 와 일치할 수 있다. 최대 일치는 'AAAAA', 최소 일치는 'AAA" 인데, 파이썬의 정규표현식은 기본적으로 최대 일치되는 값을 돌려줍니다. 최소 일치되는 값을 돌려받고 싶다면, 중괄호 뒤에 '?' 기호를 적어주면 됩니다.


>>> aRegex = re.compile(r'(A){3,5}')

>>> mo1 = aRegex.search('AAAAA')

>>> mo1.group()

'AAAAA'


>>> aRegex = re.compile(r'(A){3,5}?')

>>> mo2 = aRegex.search('AAAAA')

>>> mo2.group()

'AAA'




전체 패턴 검색


findall() 매써드 사용


>>> phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)')

>>> phoneNumRegex.findall('Cell: 212-555-1234 Work: 212-555-5678')

[('212', '555-1234'), ('212', '555-5678')]




문자 클래스


 짧은 문자

클래스 의미 

 \d

 0에서 9까지의 임의의 숫자 - (0|1|2|3|4|5|6|7|8|9) 혹은 [0-9]

 \D

 0에서 9까지의 숫자를 제외한 문자열

 \w

 문자, 숫자 혹은 '_' (word)

 \W

 문자, 숫자 혹은 '_' 가 아닌 모든 글자 

 \s

 빈칸, 탭 또는 줄바꿈 문자 (white space)

 \S

 빈칸, 탭 또는 줄바꿈 문자가 아닌 모든 글자




사용자 정의 문자 클래스 만들기


대괄호를 이용하여 사용자 정의 문자 클래스를 정의할 수 있습니다. 

예를 들어 대소문자 구분없이 영어의 소문자 하나를 매치시키고 싶다면, 아래와 같이 정의하면 됩니다.


>>> vowelRegex = re.compile(r'[aeiouAEIOU]')



하이픈을 사용하면 범위를 포함시킬 수 있습니다. 


>>> alnumRegex = re.compile(r'[a-zA-Z0-9]')




캐럿과 달러 기호 글자


^ - 텍스트의 시작

$ - 텍스트의 끝


>>> beginsWithHello = re.compile(r'^Hello')




와일드카드 문자


정규식에서 '.' 은 와일드카드라고 하며 줄바꿈을 제외한 모든 문자와 일치한다.


>>> atRegex = re.compile(r'.at')

>>> atRegex.findall('The cat in the hat sat on the flat mat.')

['cat', 'hat', 'sat', 'lat', 'mat']




대소문자를 구분하지 않고 일치시키기


>>> regex = re.compile(r'test', re.I)




문자열 매치해서 치환하기


>>> namesRegex = re.compile(r'Agent \w+')

>>> namesRegex.sub('CENSORED', 'Agent Alice gave the secret documents to Agent Bob')

'CENSORED gave the secret documents to CENSORED'


일치하는 텍스트 그 자체를 대체할 텍스트의 일부로 사용해야 하는 경우에는 \1, \2, \3 등과 같이 입력하면 Match 객체의 그룹 1, 2, 3 등으로 대체 됩니다.

>>> namesRegex = re.compile(r'Agent (\w)\w*')

>>> namesRegex.sub(r'\1****', 'Agent Alice gave the secret documents to Agent Bob')

'A**** gave the secret documents to B****'





반응형

'프로그래밍 > Python' 카테고리의 다른 글

9. 파일 관리  (0) 2019.02.21
8. 파일 읽고 쓰기  (0) 2019.02.21
6. 문자열 다루기  (0) 2019.01.08
5. 사전 (Dictionary)  (0) 2019.01.07
4. 리스트와 튜플  (0) 2019.01.06
반응형

* 이 포스트는 "파이썬 프로그래밍으로 지루한 작업 자동화하기" 의 내용을 참조해서 작성하였습니다.

* 파이썬 3.3을 기준으로 작성하였습니다.



문자열 리터럴


문자열은 ' 로 시작해서 ' 로 끝난다. 혹은 " 로 시작해서 " 로 끝난다.



이스케이프 문자


문자열 안에 넣을 수 없는 글자를 사용하기 위해서 사용한다.

백슬래시(\) 다음에 문자열에 넣고 싶은 글자를 두는 방식으로 구성된다.


 이스케이프 문자 

 출력되는 글자 

 \'

 홑따옴표

 \"

 겹따옴표 

 \t

 탭 

 \n

 줄바꿈 

 \\

 백슬래시 



원시 문자열


문자열을 시작하는 따옴표 앞에 r을 사용하면 문자열을 원시 문자열로 만들 수 있다.

원시 문자열은 모든 이스케이프 문자를 완전히 무시하고 문자열에 나타나는 백슬래시를 인쇄한다.



세겹 따옴표를 사용하는 여러 줄에 걸친 문자열


문자열에 줄바꿈을 넣으려면 \n 이스케이프 문자를 사용할 수도 있지만 여러 줄 문자열을 사용하는 것이 더 편할 때가 많다. 파이썬에서 여러 줄 문자열은 세 개의 홑따옴표로 시작하고 끝난다.



여러 줄 주석


여러 줄 주석은 세 개의 겹따옴표로 시작하고 끝난다.



문자열 인덱스와 슬라이스


문자열은 리스트처럼 인덱스와 슬라이스를 사용한다.

문자열을 리스트로 생각하고 문자열의 각 글자는 인덱스에 상응하는 아이템으로 생각할 수 있다.



문자열에 in 또는 not in 연산자 사용하기


in 또는 not in 연산자는 리스트 값과 마찬가지로 문자열에서도 쓸 수 있다.



쓸모 있는 문자열 메소드


 메소드 

 기능 

 upper()

 문자열을 대문자로 변환한 새로운 문자열을 돌려준다. 

 lower()

 문자열을 소문자로 변환한 새로운 문자열을 돌려준다.  

 isupper()

 문자열의 모든 영문자가 대문자면 True 아니면 False를 돌려준다.

 islower()

 문자열의 모든 영문자가 소문자면 True 아니면 False를 돌려준다.

 isalpha()

 문자열이 문자로만 구성되어 있으며 빈칸이 없으면 True를 돌려준다. 

 isalnum()

 문자열이 문자와 숫자로만 구성되어 있으며 빈칸이 없으면 True를 돌려준다.

 isdecimal() 문자열이 숫자로만 구성되어 있으며 빈칸이 없으면 True를 돌려준다. 
 isspace()

 문자열이 빈칸, 탭, 줄바꿈 문자로만 구성되어 있지만 비어 있지 않으면 True를 돌려준다.

 istitle() 문자열이 단어들로만 구성되어 있으며, 각 단어는 대문자로 시작하고 그 뒤에 따라오는 글자들은 소문자로 되어 있으면 True를 돌려준다.
 startwith()

 메소드를 호출한 문자열 값이 메소드에 전달된 문자열로 시작되면 True를 돌려준다.

 endwith()

 메소드를 호출한 문자열 값이 메소드에 전달된 문자열로 끝나면 True를 돌려준다. 

 join()

 리스트를 하나의 문자열 값으로 연결해서 새로운 문자열을 돌려준다. 

 split()

 호출한 문자열을 지정한 값을 구분자로 분할해서 리스트를 만들어서 돌려준다. 

 rjust()

 호출한 문자열을 오른쪽으로 정렬하고 왼쪽에 공백을 채운 문자열을 돌려준다. 

 ljust()

 호출한 문자열을 왼쪽으로 정렬하고 오른쪽에 공백을 채운 문자열을 돌려준다.

 center()

 호출한 문자열의 좌우에 공백을 채우고 가운데로 정렬한 문자열을 돌려준다.

 strip()

 양쪽 끝에 있는 공백 문자를 제거하고 새로운 문자열을 돌려준다. 

 rstrip()

 오른쪽 끝에 있는 공백 문자를 제거하고 새로운 문자열을 돌려준다.

 lstrip()

 왼쪽 끝에 있는 공백 문자를 제거하고 새로운 문자열을 돌려준다.



반응형

'프로그래밍 > Python' 카테고리의 다른 글

8. 파일 읽고 쓰기  (0) 2019.02.21
7. 정규 표현식  (0) 2019.01.09
5. 사전 (Dictionary)  (0) 2019.01.07
4. 리스트와 튜플  (0) 2019.01.06
3. 함수  (0) 2019.01.06
반응형

* 이 포스트는 "파이썬 프로그래밍으로 지루한 작업 자동화하기" 의 내용을 참조해서 작성하였습니다.

* 파이썬 3.3을 기준으로 작성하였습니다.




사전 데이터 타입

리스트와 마찬가지로 사전은 많은 값의 모음이다.
리스트의 인덱스와는 달리 사전의 인덱스는 다양한 데이터 유형을 사용할 수 있다.
사전의 인덱스를 키라고 하며, 키와 그에 연관된 값을 키-값 쌍이라고 한다.
코드에서 사전은 중괄호 {}로 정의된다.


사전과 리스트

리스트와는 달리 사전의 아이템들은 순서가 없다.
사전은 순서가 없지만 키로 임의의 값을 쓸 수 있다.


사전 메소드

 메소드 

 기능 

 keys()

 사전의 키를 튜플로 돌려준다.

 values()

 사전의 값을 튜플로 돌려준다.

 items()

 사전의 키 - 값 쌍을 튜플로 돌려준다.

 get()

 키에 해당하는 값을 가져온다. 존재하지 않을 때 돌려줄 값을 설정할 수 있다.

 setdefault()

 특정 키에 값이 존재하지 않는 경우에 돌려줄 값을 설정한다. 





반응형

'프로그래밍 > Python' 카테고리의 다른 글

7. 정규 표현식  (0) 2019.01.09
6. 문자열 다루기  (0) 2019.01.08
4. 리스트와 튜플  (0) 2019.01.06
3. 함수  (0) 2019.01.06
2. 흐름 제어  (0) 2019.01.04
반응형

* 이 포스트는 "파이썬 프로그래밍으로 지루한 작업 자동화하기" 의 내용을 참조해서 작성하였습니다.

* 파이썬 3.3을 기준으로 작성하였습니다.




리스트 


- 순서를 가진 여러 가지 값의 배열

- [] (대괄호) 로 표기

- 쉼표를 구분자로 하여 리스트에 아이템들을 초기화 할 수 있음

- 아이템들의 타입이 달라도 상관 없음


>>> [1, 2, 3]

>>> ['a', 'b', 'c']

>>> [1, True, 'A', [1, 2, 3]]



인덱스를 이용해서 리스트의 개별 아이템 얻기


리스트 이름에 대괄호를 사용해서 0부터 시작하는 정수로 순차적인 접근이 가능하다.


>>> test = ['a', 'b', 'c']

>>> test[0]

'a'

>>> test[1]

'b'

>>> test[2]

'c'


리스트 값의 개수를 초과하는 인덱스를 사용하면 IndexError 오류가 발생한다.


인덱스는 정수값만 가능하며, 그 이외의 타입에는 TypeError 오류가 발생한다.


음수 인덱스도 사용이 가능하며, -1은 리스트의 마지막 값을 뜻하고, -2는 리스트의 끝에서 두 번째 값을 의미힌다.



부분 리스트


- 슬라이스를 이용해서 부분 리스트를 얻을 수 있다.

- 리스트 이름 [시작 인덱스 : 포함하지 않는 마지막 인덱스] 으로 정의 한다.


>>> test = ['a', 'b', 'c']

>>> test[0:3]

['a', 'b', 'c']

>>> test[0:2]

['a', 'b']

>>> test [1:3]

['b', 'c']

>>> test [0:-1]

['a', 'b', 'c']


콜론(:)을 기준으로 앞의 값을 비워두면 앞의 값은 0으로 처리된다.

콜론(:)을 기준으로 뒤의 값을 비워두면 뒤의 값은 리스트 길이 혹은 -1로 처리된다.



리스트 변경


인덱스를 지정해서 할당을 하면 값이 변경된다.


>>> test = [1, 2, 3]

>>> test[0] = 'a'

>>> test

['a', 2, 3]



리스트 병합


>>> [1, 2, 3] + ['a', 'b', 'c']

[1, 2, 3, 'a', 'b', 'c']


>>> ['a', 'b'] * 2

['a', 'b', 'a', 'b']



리스트 값 제거


del 명령어를 사용한다.


>>> test = [1, 2, 3]

>>> del test[1]

>>> test

[1, 3]



다중 할당


한 줄의 코드로 리스트 안에 있는 값을 여러 변수에 할당한다.


>>> test = [1, 2, 3]

>>> a, b, c = test

>>> a

1

>>> b

2

>>> c

3



리스트 메소


메소드는 함수와 기능은 같지만 객체 내에 정의되어 있는 멤버 함수를 메소드라고 한다.


 메소드 

 기능 

 index()

 리스트 내에 있는 값의 첫번째 인덱스를 리턴한다. 

 append()

 리스트에 새 값을 마지막에 추가한다.

 insert()

 리스트에 새 값을 지정한 인덱스에 추가한다.

 remove()

 리스트 내에서 값을 찾아서 첫번째로 나오는 값을 제거한다. 

 sort()

 리스트 안의 값을 정렬한다. (reverse 키워드로 역순 정렬 가능)



튜플 (tuple)


- 리스트와 비슷하지만 한 번 정의되면 변경이 불가능하다.

- () 로 표기



리스트와 튜플의 전환


list() 함수를 이용하면 튜플에서 리스트를 생성해 준다.


>>> list(('a', 'b', 'c'))

['a', 'b', 'c']


tuple() 함수를 이용하면 리스트에서 튜플을 생성해 준다.


>>> tuple([1, 2, 3])

(1, 2, 3)



참조 전달


정수형, 숫자형, 문자열 값을 매개 변수로 함수를 호출하는 경우, 해당 값은 파라미터 변수로 복사된다.

그 외의 타입을 매개 변수로 함수를 호출하면, 해당 타입의 참조가 파라미터로 전달된다. 

(참조 값은 복사되어도 같은 실제 값을 가리키게 된다.)



copy() vs deepcopy()


리스트 등의 데이터의 사본을 만들기 위해서는 copy 라이브러리에 있는 copy() 혹은 deepcopy() 명령어를 사용할 수 있다.

리스트의 모든 아이템이 정수형, 숫자형, 문자열 값으로만 되어 있다면 copy() 를 쓰는 것으로 충분하지만, 아이템에 다른 리스트나 튜플 등이 들어 있다면 deepcopy() 를 사용해야 제대로 사본이 생성된다. 




반응형

'프로그래밍 > Python' 카테고리의 다른 글

6. 문자열 다루기  (0) 2019.01.08
5. 사전 (Dictionary)  (0) 2019.01.07
3. 함수  (0) 2019.01.06
2. 흐름 제어  (0) 2019.01.04
1. 파이썬 기초  (0) 2019.01.04
반응형

* 이 포스트는 "파이썬 프로그래밍으로 지루한 작업 자동화하기" 의 내용을 참조해서 작성하였습니다.

* 파이썬 3.3을 기준으로 작성하였습니다.



함수



파이썬에서는 여러 가지 내장 함수를 제공하지만, 필요한 함수를 직접 만들어 쓸 수도 있다.


함수를 사용하는 목적은, 코드의 묶음을 여러 차례 실행시키는 것이다. 함수를 사용하지 않으면 필요할 때마다 매번 코드를 복사해서 써야 하는데, 중복되는 부분이 많아지면, 코드의 가독성이 떨어지고, 디버깅도 어려워진다. 중복을 제거하면 프로그램은 짧아지고, 읽기 쉽고, 고치기 쉬워진다.



함수 정의 하기


def 구문을 이용해서 함수를 정의한다.


def hello():
    print ('Hello')



함수에 매개변수 추가하기


def hello(name):
    print ('Hello', name)



반환값과 return 문


def hello(name):
    return 'Hello ' + name


None 값


파이썬에는 None 이라는 값이 있다. 이는 값이 없음을 의미한다. 



키워드 매개변수와 print()


print() 함수에 다음과 같은 매개 변수 사용이 가능하다.


print ('Hello', end='')            # 출력 후 줄바꿈을 하지 않음
print ('a', 'b', 'c', sep=',')     # 출력시 구분자로 ',' 로 사용



지역 및 전역 범위


- 전역 범위의 코드는 지역 변수를 사용할 수 없다.

- 지역 범위는 전역 변수를 사용할 수 있다.

- 함수의 지역 범위 안에 있는 코드는 다름 지역 범위의 변수를 사용할 수 없다.

- 범위가 서로 다르다면 같은 이름의 지역 변수를 사용할 수 있다.



global 문


함수 안에서 전역 변수를 수정해야 하는 경우 사용



예외 처리


try: ~ except: 구문을 이용하여 예외를 처리한다.


def test(div):
    try:
        return 100 / div
    except ZeroDivisionError:
        print ('Error')










반응형

'프로그래밍 > Python' 카테고리의 다른 글

6. 문자열 다루기  (0) 2019.01.08
5. 사전 (Dictionary)  (0) 2019.01.07
4. 리스트와 튜플  (0) 2019.01.06
2. 흐름 제어  (0) 2019.01.04
1. 파이썬 기초  (0) 2019.01.04

+ Recent posts