-
[Python] 파이썬 입문 5(반복문, 함수, 생성기)CSE/Python 2015. 12. 18. 13:27
1. 파이썬 입문
1-1. 반복과 루프
가장 널리 사용되는 루프 관련 구조물은 for문입니다. for문은 항목들의 모임에 대해 반복 수행하는데 사용됩니다. 반복은 파이썬에서 가장 풍부한 기능을 제공하는 기능 중 하나입니다. 가장 널리 사용되는 반복의 형태는 간단히 문자열, 리스트, 튜플같은 순서열의 모든 구성 요소에 대해 루프를 도는 것입니다. 다음은 한 예입니다.
123for n in [1, 2, 3, 4, 5, 6, 7, 8, 9]:print "2 to the %d power is %d" % (n, 2**n)cs 앞의 예에서, 변수 n에는 각 반복마다 리스트 [1,2,3,4,...,9]에 있는 다음 항목이 할당됩니다. 정수 범위에 대해 루프를 도는 일은 상당히 잦으므로 다음과 같이 간단히 작성할 수 있습니다.
123for n in range(1, 10):print "2 to the %d power is %d" % (n, 2**n)cs range(i, j[, 폭]) 함수는 i에서 j - 1 까지의 값을 가지는 정수 범위를 표현하는 객체를 생성합니다. 초기 값이 생략되면 초기 값으로 0이 사용됩니다. 추가로 세 번째 인수로 폭을 지정할 수 있습니다.
12345a = range(5) # a = 0, 1, 2, 3, 4b = range(1, 8) # b = 1, 2,3, 4, 5, 6, 7c = range(0, 14, 3) # c = 0, 3, 6, 9, 12d = range(8, 1, -1) # d = 8, 7, 6, 5, 4, 3, 2cs for 문은 정수 순서열뿐 아니라 문자열, 리스트, 사전, 파일 등 많은 종류의 객체들에 대해 반복 수행하는데 사용될 수 있습니다. 다음은 각 종류의 객체를 출력하는 예제입니다.
* forExam.py
12345678910111213141516a = "Hello Python"for c in a:print cb = ["Jack", "Sofie", "Jolie", "Park"]for name in b:print namec = { 'Samsung': 500.10, 'Apple': 950.95, 'LG': 10.0 }for key in c:print key, c[key]cs for문에 값들의 순서열을 제공하는 반복자 객체나 생성기 함수를 직접 만들 수 있기 때문에 for 루프는 파이썬에서 제공하는 가장 강력한 언어 기능 중 하나입니다.
1-2. 함수
다음 예처럼 함수는 def문을 사용해 생성합니다.
1234def remainder(a,b):q = a // b # //는 끝 수를 버리는 나누기r = a - q * breturn rcs 함수를 호출하려면 result = remainder(37, 15)처럼 함수 이름을 쓰고 이어서 인수들을 괄호로 둘러싸주면 됩니다. 함수는 단일 인자 뿐아니라 튜플을 사용해 여러 값을 반환할 수도 있습니다.
함수 인수에 기본 값을 할당하려면 대입문을 사용하면 됩니다.
12def connect(hostname, port, timeout=300):# Function bodycs 함수 정의에 기본 값을 주어지면 이어지는 함수 호출에서 해당 값을 생략할 수 있습니다. 생략된 값은 기본 값을 가지게 됩니다.
12connect('palpit.tistory.com', 8080)cs 함수 안에 변수가 생성되거나 값이 대입되면 이 변수의 유효 범위는 지역 범위를 갖습니다.즉, 변수는 함수 몸체 안에서만 정의되고 함수가 반환되면 변수는 사라집니다. 함수 안에서 전역 변수의 값을 수정하려면 다음과 같이 global 문을 사용하면 됩니다.
123456count = 0...def sumCalc():global countcount += 1cs 1-3. 생성기(Generator)
함수는 단일 값을 반환하는 대신, yield 문을 사용해 일련의 결과를 생성할 수도 있습니다. 다음은 한 예를 보여줍니다:
12345def countdown(n):print "Counting down"while n > 0:yield nn -= 1cs yield를 사용하는 함수를 생성기라고 부릅니다. 생성기 함수를 호출하면, next() 메서드(파이썬 3에서는 __next__())를 반복적으로 호출할 때 일련의 결과를 반호나하는 객체가 생성됩니다. 다음은 한 예입니다.
next()호출하면 생성기 함수는 다음 yield 문에 도달할 때까지 실행됩니다. 이때, yield에 전달된 값이 next()에 의해 반환되고 생성기 함수는 실행이 잠시 중단됩니다.
보통 앞에서 본 것처럼 next()를 직접 호출하는 일이 거의 없습니다. 대신 다음과 같이 for 루프를 연결시켜 사용합니다.
12for i in countdown(5):print i,cs 생성기는 처리 파이프라인, 스트림, 데이터 흐름에 기반한 프로그램을 작성할 때 강력한 위력을 발휘합니다. 예를 들어, 다음 생성기 함수는 로그 파일을 검토하는데 흔히 사용되는 유닉스의 tail -f 명령의 동작을 흉내냅니다.
12345678910import timedef tail(f):f.seek(0, 2)while True:line = f.readline()if not line:time.sleep(0.1)continueyield linecs 다음은 일련의 라인에서 특정 부분 문자열을 찾는 생성기입니다.
123def grep(lines, searchtext):for line in lines:if searchtext in line: yield linecs 두 생성기를 연결시켜 간단한 처리 파이프라인 생성하는 예입니다.
12345678# 유닉스 "tail -f | grep python" 의 파이썬 구현wwwlog = tail(open("access-log"))pylines = grep(wwwlog, "python")for line in pylines:print line,cs 생성기와 관련해서 알아두어야 할 것은 생성기는 보통 리스트나 파일 같은 다른 반복자 객체와 함께 섞일 수 있다는 점입니다. 특히, for item in s 같은 문장에서 s는 아이템 리스트, 파일의 줄들, 생성기 함수 결과 똔느 반복을 지원하는 어떤 객체든 될 수 있습니다. s에 어떤 객체든 올 수 있기 때문에 확장성 있는 프로그램 작성이 가능합니다.
* 이 강좌는 '파이썬 완벽 가이드' 서적을 참고로 작성했습니다.
'CSE > Python' 카테고리의 다른 글
[Python] 파이썬 어휘 규약과 구문 (0) 2015.12.18 [Python] 파이썬 입문 6(코루틴, 객체, 예외) (0) 2015.12.18 [Python] 파이썬 입문 4(튜플, 집합, 사전) (0) 2015.12.18 [Python] 파이썬 입문 3(문자열, 리스트) (0) 2015.12.11 [Python] 파이썬 입문 2 (0) 2015.12.11 [Python] 파이썬 입문 (0) 2015.12.11