In [1]:
def interval_point(a, b, x):
if a < b:
return (b-a)*x + a
else:
return a - (a-b)*x
In [2]:
interval_point(0, 1, 0.5)
Out[2]:
In [3]:
interval_point(3, 2, 0.2)
Out[3]:
In [4]:
while True:
try:
x = float(raw_input("Please type a new number: "))
inverse = 1.0 / x
print("The inverse of {} is {}.".format(x, inverse))
break
except ValueError:
print("You should have given either an int or a float")
except ZeroDivisionError:
print("The input number is {} which cannot be inversed.".format(int(x)))
콤마(',')로 구분된 문자들이 저장되어 있는 파일을 csv(comma separated value) 파일이라 부른다.
숫자들로만 구성된 csv 파일을 인자로 받아서 각 줄별로 포함된 숫자들과 숫자들의 합을 계산하여 보여주는 함수
print_line_sum_of_file
과 관련된 문제이다.
예를 들어 test.txt
파일에 아래 내용이 들어 있다고 가정하면 아래의 결과가 나와야 한다.
1,3,5,8
0,4,7
1,18
In [1]: print_line_sum_of_file("test.txt")
out[1]: 1 + 3 + 5 + 8 = 17
0 + 4 + 7 = 11
1 + 18 = 19
text.txt
파일을 생성하는 방법은 다음과 같다.
In [5]:
f = open("test.txt", 'w')
f.write("1,3,5,8\n0,4,7\n1,18")
f.close()
또한 print_line_sum_of_file
을 예를 들어 다음과 같이 작성할 수 있다.
In [6]:
def print_line_sum_of_file(filename):
g = open("test.txt", 'r')
h = g.readlines()
g.close()
for line in h:
sum = 0
k = line.strip().split(',')
for i in range(len(k)):
if i < len(k) -1:
print(k[i] + " +"),
else:
print(k[i] + " ="),
sum = sum + int(k[i])
print(sum)
위 함수를 이전에 작성한 예제 파일에 적용하면 예상된 결과과 나온다.
In [7]:
print_line_sum_of_file("test.txt")
그런데 위와 같이 정의하면 숫자가 아닌 문자열이 포함되어 있을 경우 ValueError가 발생한다. ValuError가 어디에서 발생하는지 답하라.
이제 데이터 파일에 숫자가 아닌 문자열이 포함되어 있을 경우도 다룰 수 있도록
print_line_sum_of_file
를 수정해야 한다.
예를 들어 숫자가 아닌 문자가 포함되어 있는 단어가 있을 경우 단어의 길이를 덧셈에 추가하도록 해보자.
예제:
test.txt
파일에 아래 내용이 들어 있다고 가정하면 아래 결과가 나와야 한다.
1,3,5,8
1,cat4,7
co2ffee
In [1]: print_line_sum_of_file("test.txt")
out[1]: 1 + 3 + 5 + 8 = 17
1 + cat4 + 7 = 12
co2ffee = 7
예를 들어 다음과 같이 수정할 수 있다. 빈 칸 (A)와 (B)를 채워라.
f = open("test.txt", 'w')
f.write("1,3,5,8\n1,cat4,7\nco2ffee")
f.close()
def print_line_sum_of_file(filename):
g = open("test.txt", 'r')
h = g.readlines()
g.close()
for line in h:
sum = 0
k = line.strip().split(',')
for i in range(len(k)):
if i < len(k) - 1:
print(k[i] + " +"),
else:
print(k[i] + " ="),
try:
(A)
except ValueError:
(B)
print(sum)
In [8]:
def linear_1(a, b):
return a + b
def linear_2(a, b):
return a * 2 + b
동일한 방식을 반복하면 임의의 자연수 n
에 대해 linear_n
함수를 정의할 수 있다. 즉,
linear_n(a, b) = a * n + b
이 만족되는 함수를 무한히 많이 만들 수 있다. 그런데 그런 함수들을 위와같은 방식으로 정의하는 것은 매우 비효율적이다. 한 가지 대안은 변수를 하나 더 추가하는 것이다.
In [9]:
def linear_gen(n, a, b):
return a * n + b
위와 같이 linear_gen
함수를 정의한 다음에 특정 n
에 대해 linear_n
이 필요하다면 아래와 같이 간단하게 정의해서 사용할 수 있다.
예를 들어 n = 10
인 경우이다.
In [10]:
def linear_10(a, b):
return linear_gen(10, a, b)
그런데 이 방식은 특정 linear_n
을 사용하고자 할 때마다 def
키워드를 이용하여 함수를 정의해야 하는 단점이 있다. 그런데 고계함수를 활용하면 def
키워드를 한 번만 사용해도 모든 수 n
에 대해 linear_n
함수를 필요할 때마다 사용할 수 있다.
예를 들어 아래 등식이 만족시키는 고계함수 linear_high
를 정의할 수 있다.
linear_10(3, 5) = linear_high(10)(3, 5)
linear_15(2, 7) = linear_high(15)(2, 7)
아래 코드가 위 등식을 만족시키도록 빈자리 (A)와 (B)를 채워라.
def linear_high(n):
def linear_n(a, b):
(A)
return (B)
def linear_high_lambda(n):
return (A)
In [11]:
names = ["Koh", "Kang", "Park", "Kwon", "Lee", "Yi", "Kim", "Jin"]
K
로 시작하는 이름으로만 구성된 리스트는
파이썬 내장함수 filter
를 이용하여 만들 수 있다.
In [12]:
def StartsWithK(s):
return s[0] == 'K'
K_names = filter(StartsWithK, names)
K_names
Out[12]:
K_names = []
for name in names:
if (A) :
(B)
else:
(C)
K_names.(D)
In [13]:
map(lambda x : x ** 2, range(5))
Out[13]:
map
함수를 사용하지 않는 방식은 다음과 같다.
In [14]:
def list_square(num):
L = []
for i in range(num):
L.append(i ** 2)
return L
list_square(5)
Out[14]:
def list_square_comp(num):
return (A)
In [15]:
cities = ['A', 'B', 'C', 'D', 'E']
populations = [20, 30, 140, 80, 25]
도시이름과 인구수를 쌍으로 갖는 리스트를 구현하는 방법은 아래와 같다.
In [16]:
city_pop = []
for i in range(len(cities)):
city_pop.append((cities[i], populations[i]))
city_pop
Out[16]:
city_pop
를 이용하여 예를 들어 C
도시의 인구수를 확인하는 방법은 다음과 같다.
In [17]:
city_pop[2][1]
Out[17]:
def show_pop_city(s):
(A)
.