공학자를 위한 Python 사용법 20
아주 오랜만에 글을 쓰는데요. 이번 글부터 당분간은 python 문법자체에 집중해서 몇가지를 설명해 보도록 하겠습니다.
특히 저처럼 오래전에 프로그램 짜는법을 배우고 MATLAB같은 응용 프로그램에 대부분의 시간을 보낸 사람에게 약간은 생소한 프로그램 문법에 대해 알아보도록 하겠습니다.
그 첫번째가 list입니다.
참고로 이 내용은 아래 링크에 있는 내용을 참고 했습니다:
http://www.python-course.eu/python3_list_comprehension.php
다음과 같이 “[ ]”안에 내용물을 넣으면 list가 만들어 집니다.
>> a = [1, 2, “abc”, [3,4,5]]
list의 각 내용물은 방금 예에서 보듯이 반드시 같은 자료 형태일 필요는 없습니다. a[0] = 1이고 a[2]=“abc”이고 a[3] = [3,4,5]입니다. 즉,
>> type(a)
list
>> type(a[0])
int
>> type(a[2])
str
>> type(a[-1])
list
입니다.
이미 만들어진 list를 이용해서 새로운 list를 만들수도 있습니다. a의 각 항을 제곱한 값을 갖는 list를 다음과 같이 만들면
>> b = [ x**2 for x in a]
되는데, 여기 “for x in a” 에서 x가 a에 있는 각각의 내용물로 순차적으로 대치됩니다. 즉, x=a[0] -> x = a[1] -> x = a[2] ...
그런데 위의 내용을 실행하면 오류가 발생합니다. 왜냐하면 a에는 정수만 있는 것이 아니고 문자열도 있고, list도 있는데 이것은 제곱이 안되기 때문입니다. 그래서 다음과 같이 하면
>> b = [x**2 for x in a[0:2]]
b = [1, 4] 되는데 a[0:2]가 a[0]과 a[1]로 x값에 정수값 1과 2를 넘겨주므로 프로그램이 오류없이 실행됩니다. 이것을 좀 더 자동으로 인식해서 정수일때만 넘겨주게 하려면 다음과 같이 하면 됩니다.
>> b = [x**2 for x in a if type(x)==int]
이와 같이 하면 x의 자료형이 정수일때만 x값이 x**2 연산으로 넘겨지게 됩니다.
세개의 for-loop를 조합해서 쓸 수도 있습니다:
>> [(x,y,z) for x in range(1,31) for y in range(x,31) for z in range(y,31) if x**2 + y**2 == z**2]
이렇게 하면 1부터 30까지 있는 모든 정수의 조합에서 피타고라스의 정리를 만족하는 세개의 정수쌍이 생성됩니다.
다음회에는 list와 밀접한 관련이 있는 generator에 대해 알아보겠습니다.








