파이썬의 filter()함수 PYTHON

VBA의 Filter()함수를 쓰다 보니 파이썬의 filter()함수를 말하지 않을 수가 없다. 파이썬의 filter()함수는 map(), reduce()처럼 매개변수로서 함수를 받아서 처리하는 함수이다. filter()함수는 이름에서 알 수 있듯이 연산의 결과에서 몇몇 요소들을 걸러내는 함수이다. 즉 함수와 리스트를 받아서 리스트의 원소를 매개변수로 전달한 함수(이를 필터라고 하는데, 연산의 결과를 True 또는 False값으로 돌려주는 함수이다)에 넣어 결과가 참인 리스트를 돌려주는 함수이다.

filter( function, iterable_object )

다음은 짝수인지 아닌지 판별하는 함수(filterEven)와 1~15까지의 리스트를 filter()함수에 전달하고 결과를 출력하는 예이다.
>>> myNum = range(1,16)
>>> myNum
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

# A very simple filter
>>> def filterEven(num):
... if num % 2 == 0:
... return True
... else:
... return False
...

# Output
>>> print filter(filterEven, myNum)
[2, 4, 6, 8, 10, 12, 14]



그동안 무시했던 매크로 보안수준 EXCEL/VBA

업무에서 VBA를 활용하지 않고 그냥저냥 사용하는 사용자들에게 VBA로 짠 프로그램을 배포하거나 VBA를 가르쳐주려면 가장 먼저 하는 작업이 매크로 보안수준을 낮추는 것이다. 기본값은 '모든 매크로 제외(알림표시)'이다.

보통 귀찮아서 '모든 매크로 포함' 옵션을 선택하는데,사실 FM대로 하자면 그러는 거 아니다. 잠깐 시간을 내어 매크로 보안옵션을 설명하자면
  1. 모든 매크로 제외(알림 표시 없음) : 신뢰할 수 있는 위치에 있는 파일을 제외하고 모든 매크로를 실행할 수 없음
  2. 모든 매크로 제외(알림 표시) : 매크로가 포함된 파일을 열면 '보안 경고'메시지가 나타나고 '콘텐츠 사용'버튼을 클릭해야 파일에 포함된 매크로를 사용할 수 있다.
  3. 디지털 서명된 매크로만 포함 : '모든 매크로 제외(알림 표시)' 설정과 동일하지만 디지털 서명된 매크로만 실행가능하다.
  4. 모든 매크로 포함 : '보안 경고' 메시지도 표시하지 않고 모든 매크로를 사용할 수 있다.
근데 여기서 신뢰할 수 있는 문서란 '보안 경고'없이 사용할 수 있는 문서를 의미하는데, [보안 센터]의 옵션중 '신뢰할 수 있는 게시자', '신뢰할 수 있는 위치', '신뢰할수 있는 문서' 옵션에 해당하는 것들이다.

게을러서 이제 알아버린 Filter()함수 EXCEL/VBA

VBA는 구문상의 변화는 없는데, 은근 버전이 올라가면서 새로운 함수가 추가되고 있다. Filter()함수는 아마 2010버전부터 추가된 것으로 보이는데, 일단 배열인덱스가 0으로 시작되는 배열을 돌려주며, 이 배열에는 매칭되거나 또는 매칭되지 않는 값이 있다.

URL:MSDN의 Filter함수설명

백문이 불여일견이라고 사용 예를 한번 보자,
    Dim arr()
Dim arrFiltered

arr = Array("One", "Two", "Three")
두 개의 Variant형 변수를 선언하였고, 배열인 arr변수에는 Array()함수를 사용하여 "One", "Two", "Three" 세 개의 문자열을 넣어 두었다. 1번째 사용 예는 다음과 같다.
    arrFiltered = Filter(arr, "T", True)
Debug.Print Join(arrFiltered, vbCr)
"T"가 들어간 문자열 원소를 포함(True)시켜 필터링하여 Two와 Three를 돌려준다. 그럼 이번에는 반대로 "T"가 들어간 문자열 원소를 배제(False)한 경우 다음과 같다.
    arrFiltered = Filter(arr, "T", False)
Debug.Print Join(arrFiltered, vbCr)
One을 돌려줄 것이다. 기본적으로 대소문자를 구분하므로 다음의 실행은 아무것도 돌려줄 게 없다.
    arrFiltered = Filter(arr, "t", True)
Debug.Print Join(arrFiltered, vbCr)
기본적으로 문자열만 돌려주는 것이지만 숫자도 가능하다. 단 연산의 대상인 숫자로 처리하는 것이 아니라 숫자형태의 문자열로 처리한다. 다음은 1과 10을 돌려줄 것이다.
    arr = Array(1, 2, 3, 10)
arrFiltered = Filter(arr, 1)
Debug.Print Join(arrFiltered, vbCr)


VBA 배열에 대한 몇 가지 (3) EXCEL/VBA

Split()함수의 반대는 ? Join()함수이다. Split()함수는 문자열을 쪼개고, Join()함수는 문자열을 합친다. Split()함수가 결과를 알아서 배열에 돌려주듯이, Join()함수는 배열을 합쳐 하나의 문자열로 만들어 주지 않을 까? 다음은 Join()함수의 그러한 예이다.
Dim strFriends(0 To 6) As String

strFriends(0) = "Bianca"
strFriends(1) = "Jeana"
strFriends(2) = "Sam"
strFriends(3) = "Jenna"
strFriends(4) = "Erin"
strFriends(5) = "Carolyn"
strFriends(6) = "Kate"

Debug.Print Join(strFriends, ", ")

VBA 배열에 대한 몇 가지 (2) EXCEL/VBA

지난 번 포스팅에서 Split()함수의 신박한 사용법을 보여 주었는데, 이번에는 그와 비슷한 기능의 함수를 소개한다.
Function CreateTextArrayFromSourceTexts(ParamArray SourceTexts() As Variant) As String()
Dim SourceTextsCellNumber As Long

ReDim TargetTextArray(0 To UBound(SourceTexts)) As String

For SourceTextsCellNumber = 0 To UBound(SourceTexts)
TargetTextArray(SourceTextsCellNumber) = SourceTexts(SourceTextsCellNumber)
Next

CreateTextArrayFromSourceTexts = TargetTextArray
End Function
CreateTextArrayFromSourceTexts()함수는 문자열 배열을 돌려주는 함수인데, 매개변수로서 텍스트들을 갯수를 정하지 않고 받는 함수이다. 그래서 ParamArray라는 게 사용되었다. 다음은 사용하는 예이다.
Sub demoCreateTextArrayFromSourceTexts()
Dim TT() As String

TT = CreateTextArrayFromSourceTexts("hi", "bye", "hi", "bcd", "bYe")

Dim i As Long

For i = LBound(TT) To UBound(TT)
Debug.Print TT(i)
Next

End Sub


1 2 3 4 5 6 7 8 9 10 다음