1. 실습
1.1 문장을 입력받아 문법에 맞도록 결과를 출력하는 코드를 작성
- 마지막 문자는 .이 있을수도 있고, 없을수도 있음
- 논리적인 문제 해결 순서 -> 코드로 변경
- python IS the best language -> Python is the best language
1
2
3
4
5
6
7
8
9
# 문장을 입력받음
sentence = input('문장을 입력하세요 : ')
result = sentence.lower()
result = result[0].upper() + result[1:]
if result [-1] != '.':
result += '.'
result
1
2
문장을 입력하세요 : python is best language
'Python is best language.'
- 입력받은 문장의 offset index를 활용하여 맨 앞을 upper로 대문자로 바꾸고 나머지 뒤에 애들을 더함
- 그리고 만일 맨 뒤에 . 이 없다면 추가하는 if문을 추가함
1
2
3
4
5
6
7
8
9
10
# 문장을 입력받음
sentence = input('문장을 입력하세요 : ')
result = sentence.lower()
# result = result[0].upper() + result[1:]
result = result.capitalize()
if result [-1] != '.':
result += '.'
result
1
2
문장을 입력하세요 : python is best language
'Python is best language.'
- 위의 코드에서 upper 대신에 capitalize를 써도됨
1.2 로또 생성기
- 6자리 로또번호를 생성하는 코드 작성
- 6자리 번호는 중복 안됨
- 문자열, 숫자, 리스트는 무관
- while, not in, in, append, break, len
1
2
3
4
5
6
7
8
9
10
11
import random
lotto = []
while True:
number = random.randint(1,45)
if number not in lotto:
lotto.append(number)
if len(lotto) == 6:
lotto.sort()
break
lotto
1
[8, 19, 29, 32, 34, 43]
- random의 randint를 활용하여 1 ~ 45까지의 숫자를 생성
- append로 생성한 숫자를 넣으며, not in을 활용하여 기존에 append된 숫자가 나오면 append하지 않음
- 마지막으로 if문을 활용하여 lotto 리스트의 길이가 6이 되면 break하게 만듬
2. 함수(2)
2.1 학습할 함수들
- docstring
- scope
- inner function
- callback function
- lambda function
- map, filter, reduce
- decorlater
3. Docstring
3.1 Docstring이란?
- 함수의 설명을 작성하는거
1
2
3
def echo(msg):
'echo pring msg'
print(msg)
1
2
3
4
5
6
7
8
9
10
def echo(msg) :
"""
echo func return its input agument
The operation is
1. print msg parameter
2. return msg paremeter
param : msg : str
return : str
""" #여러줄로 docstirng 작성 멀티라인
print(msg)
- def로 함수선언과 코드 사이에 작성하면 docstring이 작성됨
- 여러줄로 작성하기 위해서는 “”” “”” 을 사용하면 됨
3.2 Docstring 보는법
1
echo?
1
2
3
4
5
6
7
8
9
10
[0;31mSignature:[0m [0mecho[0m[0;34m([0m[0mmsg[0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m
[0;31mDocstring:[0m
echo func return its input agument
The operation is
1. print msg parameter
2. return msg paremeter
param : msg : str
return : str
[0;31mFile:[0m ~/Desktop/DataScience/FastCampus/Datascienceschool12th/1semester/00. Python/01_Python_basic/<ipython-input-5-48f4f38cf256>
[0;31mType:[0m function
- 함수?
1
echo??
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[0;31mSignature:[0m [0mecho[0m[0;34m([0m[0mmsg[0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m
[0;31mSource:[0m
[0;32mdef[0m [0mecho[0m[0;34m([0m[0mmsg[0m[0;34m)[0m [0;34m:[0m[0;34m[0m
[0;34m[0m [0;34m"""[0m
[0;34m echo func return its input agument[0m
[0;34m The operation is[0m
[0;34m 1. print msg parameter[0m
[0;34m 2. return msg paremeter[0m
[0;34m param : msg : str[0m
[0;34m return : str[0m
[0;34m """[0m [0;31m#여러줄로 docstirng 작성 멀티라인[0m[0;34m[0m
[0;34m[0m [0mprint[0m[0;34m([0m[0mmsg[0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m
[0;31mFile:[0m ~/Desktop/DataScience/FastCampus/Datascienceschool12th/1semester/00. Python/01_Python_basic/<ipython-input-5-48f4f38cf256>
[0;31mType:[0m function
- 함수??
1
help(echo)
1
2
3
4
5
6
7
8
Help on function echo in module __main__:
echo(msg)
echo func return its input agument
The operation is
1. print msg parameter
2. return msg paremeter
param : msg : str
return : str
- help(함수)
1
print(echo.__doc__)
1
2
3
4
5
6
echo func return its input agument
The operation is
1. print msg parameter
2. return msg paremeter
param : msg : str
return : str
- print(함수.
__doc__
)
- 그 외 shift + tap
4. Scope
4.1 Scope(범위)
- 함수 안에서 선언되는 변수와 함수 밖에서 선언되는 변수의 범위가 다름
- global(전역), local(지역)
- 함수 호출시 우선 순위는 local
- 함수안의 변수는 함수가 호출되어야 메모리를 사용
- 함수안에서 local변수가 선언되어도 global 변수는 변동이 없음
- 위의 문제를 해결하기 위해 함수안에서 global + 변수의 예약어를 사용
4.2 Global
1
2
3
4
5
6
gv = 10 #global
def echo():
print(gv)
echo()
1
10
- 전역(global)으로 설정된 gv가 echo함수를 통해 print됨
4.3 Local
1
2
3
4
5
6
7
gv = 10 # global
def echo():
gv = 100 # local
print(gv)
echo()
1
100
- 전역으로 설정된 gv가 있어도, 함수 내부에 지역으로 설정된 gv가 우선순위가 되어 echo 함수를 실행하면 지역의 gv가 print됨
1
2
3
4
5
6
7
8
9
gv = 10
def echo():
global gv # global + 함수 예약어를 써주어야 global 변수가 변경됨
print(gv, 'global')
gv = 100 # local
print(gv, 'local')
echo()
1
2
10 global
100 local
- 만일 함수내부에서 전역 변수를 써야한다면 global이라는 예약어를 써주면됨
5.Inner Function
5.1 Inner Function이란
- 함수가 지역영역에 선언
- 함수 안에 함수가 선언
- 지역 함수는 전역 영역에서 사용이 불가함
1
2
3
4
5
6
7
def outer(a, b):
def inner(c, d):
return c + d
return inner(a, b)
outer(1, 2)
1
3
- outer 함수에 inner 함수를 선언하여 사용
- outer 함수를 실행하면 inner 함수까지 같이 실행됨
1
2
# 지역 함수는 전역영역에서 사용이 불가
inner(1, 2)
1
2
3
4
5
6
7
8
9
10
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-125-674f543a8bd9> in <module>
1 # 지역 함수는 전역영역에서 사용이 불가
----> 2 inner(1, 2)
NameError: name 'inner' is not defined
- 하지만 지역함수는 따로 전역영역에서 단독으로 사용이 불가능
1
2
3
4
5
6
7
# return으로 함수를 선안하면 전역에서도 함수를 사용가능 (단, 단독으로 사용은 안됨, 변수를 2개 선언해주어야함)
def outer(a, b):
def inner(c, d):
print(1, 2)
return c + d
return inner
1
outer(1, 2)(3, 4)
1
2
1 2
7
- return으로 함수를 선언하면 전역에서도 함수를 사용가능
- 하지만 단독으로 사용은 안됨
- 위의 코드는 outer(a,b)(c,d)로 실행됨
1
2
3
4
5
6
# 위의 함수와 똑같지만, outer 함수를 호출하면 global에서 inner를 찾기 때문에 메모리를 사용
def outer(a, b):
return inner(a, b)
def inner(c, d):
return c + d
1
outer(3, 4)
1
7
- 위의 함수와 똑같지만, outer 함수를 호출하면 global에서 inner를 찾기 때문에 메모리를 사용하게된다
- 메모리 이슈 때문에 inner 함수를 사용함
6. Callback Function
6.1 Callback Function이란
- 함수를 아규먼트 파라미터로 설정해서 사용
1
2
3
4
5
6
7
8
def calc(func, a, b):
return func(a, b)
def plus(a, b):
return a + b
def minus(a, b):
return a - b
1
calc(plus, 1, 2)
1
3
- Callback Function은 함수안에 파라미터로 함수를 받는것
- 위의 코드에서 calc는 Callback Function이고 plus는 일반 함수이다
7. Lambda Function
7.1 Lambda Function이란?
- 파라미터를 간단한 계산으로 리턴되는 함수 : 삼항연산자
1
2
3
def plus(a , b):
return a + b
plus(1, 2)
1
3
- 일반 함수로 만드는 코드
1
2
plus2 = lambda a, b : a + b
plus2(1, 2)
1
3
- (함수명) = lambda a, b(파라미터부문) : a + b(리턴되는 부분)
8. Map, Filter, Reduce
8.1 Map
- 순서가 있는 데이터 집합에서 모든 값에 함수를 적용시킨 결과를 출력
- map 으로 끝나면 그대로 출력이 안되서 형태 변환이 필요함
1
2
3
4
5
ls = [1, 2, 3, 4]
def odd_even(num):
return 'odd' if num % 2 else 'even'
odd_even(3), odd_even(4)
1
('odd', 'even')
1
map(odd_even, ls)
1
<map at 0x7fe1487783a0>
1
tuple(map(odd_even, ls))
1
('odd', 'even', 'odd', 'even')
1
list(map(odd_even, ls))
1
['odd', 'even', 'odd', 'even']
- map은 실행 뒤에 list, tuple로 변형시켜주어야 한다.
8.1.1 실습 - 숫자 정렬하기
- str.split(‘ ‘)리스트 만듬
- 만들어진 리스트의 값들을 int 형변환
1
2
3
4
5
numbers = input('insert numbers : ')
result = numbers.split(' ')
result = list(map(int, result))
result.sort()
result
1
2
insert numbers : 1 3 4 5 6 1 3 2 4 34 231 413 412 576 3432
[1, 1, 2, 3, 3, 4, 4, 5, 6, 34, 231, 412, 413, 576, 3432]
8.2 Filter
- 리스트 데이터에서 특정조건에 맞는 (True) 값만 남기는 함수
1
2
3
ls = range(10)
# 홀수만 출력해주는 함수
list(filter(lambda data : True if data % 2 else False, ls))
1
[1, 3, 5, 7, 9]
- 홀수만 출력해주는 함수를 lambda를 이용해서 만들고, filter로 해당 함수를 실행하여 true값만 나오게 만듬
8.3 Reduce
- 리스트 데이터를 처음부터 순서대로 특정 함수를 실행하여 결과를 누적시켜 주는 함수
1
from functools import reduce
1
2
ls = [3, 1, 2, 4, 5]
reduce(lambda x, y : x + y, ls)
1
15
- ls의 원소들을 하나씩 더하여 결과를 누적시킴
9. Decorator
9.1 Decorator란?
- 함수에서 코드를 바꾸지 않고 기능을 추가하거나 수정하고 싶을때 사용하는 문법
1
2
3
4
5
6
7
8
9
def a():
code_1
code_2
code_3
def b():
code_1
code_4
code_3
- 함수 선언
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def c(func):
def wrapper(*args, **kwargs):
code_1
result = func(*args, **kwargs)
code_3
return result
return wrapper
@c
def a():
code_2
@c
def b():
code_4
- Decorator의 사용(@c)
1
2
3
4
5
6
# a
def plus(a , b):
print('start') # code 1
result = a + b # code 2
print(f'result : {result}') # code 3
return result
1
2
3
4
5
6
# b
def minus(a, b):
print('start') # code 1
result = a - b # code 4
print(f'result : {result}') # code 3
return result
1
2
3
4
5
6
7
def disp(func):
def wrapper(*args, **kwargs):
print('start') # code 1
result = func(*args, **kwargs) # code 2, 4
print(f'result : {result}') # code 3
return result
return wrapper
- a함수, b함수와 Decorator함수(disp)를 생성
1
2
3
4
@disp
def plus(a, b):
result = a + b # code_2
return result
1
plus(1, 2)
1
2
3
start
result : 3
3
- Decorator @를 앞에 붙이고 함수명을 적으면 됨
9.1.1 Decorator 실습(1)
- 함수의 실행 시간을 출력하는 Decorator 함수를 작성
1
2
3
4
5
6
7
8
9
import time
def timer(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f'runnung time : {end_time - start_time}')
return result
return wrapper
- Decorator 생성
1
2
3
4
@timer
def test1(num1, num2):
data = range(num1, num2 + 1)
return sum(data)
1
2
3
4
5
6
@timer
def test2(num1, num2):
result = 0
for num in range(num1, num2 + 1):
result += num
return result
- Decorator를 사용한 함수 test1과 test2 생성
1
test1(1, 10000000)
1
2
runnung time : 0.15724921226501465
50000005000000
1
test2(1, 10000000)
1
2
runnung time : 0.47325921058654785
50000005000000
- Decorator를 적용한 함수 test1과 test2 실행
9.1.2 Decorator 실습(2)
- 패스워드를 입력받아야 함수가 실행되는 Decorator 작성
1
2
3
4
5
6
7
8
9
10
def check_password(func):
def wrapper(*args, **kwargs):
pw = '1234'
input_pw = input('insert pw : ')
if input_pw == pw:
result = func(*args, **kwargs)
else :
result = 'not allow'
return result
return wrapper
- Decorator 생성
- 패스워드를 설정하고 패스워드가 맞지않으면 not allow가 print되는 Decorator 함수
1
2
3
4
@check_password
def plus(a, b):
return a + b
plus(1, 2)
1
2
insert pw : 1234
3
- Decorator를 적용한 plus함수를 실행
- plus함수를 실행하면 Decorator가 실행되어 패스워드부터 체크를 함