설치 1강 2강 3강 4강 5강 6강 7강

3강

python을 실행시키는 다양한 방법

  • REPL 방식

    • 명령을 하나 하나 입력하고(Read) 실행하면서(Evaluate) 변수의 값을 인쇄하여 살펴보는(Print) 것을 반복(Loop)하면서 코드를 만드는 방법
    • 변수 이름만 쳐도 변수의 값이 그대로 출력한다.
    • 우리가 사용하는 jupyter notebook의 방식.
    • 처음 공부할때에는 이 방식이 도움이 많이 된다.
  • Script 실행방식

    • 변수 이름을 쳐도 변수의 값이 그대로 출력되지는 않는다. 반드시 print명령을 통해서만 나타난다.
    • 긴 파일을 작성해야하는 경우에 사용한다.

참고자료

편집기를 이용하여 Script 실행방식으로 실행

- Pycharm : 통합개발 툴
    - 편집기하나로 모든 개발이 가능한 통합개발 툴
    - python 전용 
    - 처음 사용할 때 좋음. 하지만 프로그램 자체가 무거움
- vscode : 에디터
    - 여러 언어를 사용할 수 있는 에디터
    - 패키지 설치를 통해 통합개발툴처럼 이용가능함.
    - 가벼움
- Atom : 에디터
    - 여러 언어를 사용할 수 있는 에디터
    - 패키지 설치를 통해 통합개발툴처럼 이용가능함.
    - 가벼움
 - 처음은 jupyter를 통해 공부하고, 더 긴 코드를 작성할 경우에는 위의 에디터를 통해 실행시키는 것을 권장함.

함수

  • 코드 중복을 제거하는 유용한 문법
  • 함수의 구성
    • 함수명(필수)
    • 인자값(옵션)
    • 반환값(옵션) 단, 반환값이 없으면 None을 반환합니다.
    • 반환구문(return 구문)을 만나면 함수 실행을 곧바로 끝냄.
  • 인자와 반환값이 모두 있는 일반적인 함수
In [8]:
def myfn1(a,b,c):
    result= a+b+c**2
    return result
In [9]:
print(myfn1(1,2,3))
12
  • 인자가 없는 함수
In [10]:
def myfn2():
    """인자가 없는 함수 예시
    이 부분이 함수에 대한 설명입니다.
    보통 docstring이라고도 합니다.
    함수를 선언하고 가장 첫번째에 문자열로 적습니다.
    """
    return 10
In [11]:
print(myfn2())
10
In [12]:
print(help(myfn2))
Help on function myfn2 in module __main__:

myfn2()
    인자가 없는 함수 예시
    이 부분이 함수에 대한 설명입니다.
    보통 docstring이라고도 합니다.
    함수를 선언하고 가장 첫번째에 문자열로 적습니다.

None
In [13]:
myfn2?
# 주피터에서만 사용되는 문법 : docstring을 보여줌
In [14]:
myfn2??
# 주피터에서만 사용되는 문법 : docstring및 소스코드를 보여줌

잠깐 Tip!

  • python은 코드를 간단하게 하는 다양한 함수, 객체들이 있다.
  • 하지만 코드를 짧게 하는 것보다는 코드를 이해하기 쉽게 적는 것이 매우 중요하다.
  • 코드를 간결하게 한다는 것은 코드의 알고리즘을 빠르게 하는 것이지 짧게 적는 것이 아니다.
  • 그런 의미에서 주석, Docstring의 활용은 매우 중요한 습관이다.
In [15]:
print(help(range)) # 함수의 설명
Help on class range in module builtins:

class range(object)
 |  range(stop) -> range object
 |  range(start, stop[, step]) -> range object
 |  
 |  Return an object that produces a sequence of integers from start (inclusive)
 |  to stop (exclusive) by step.  range(i, j) produces i, i+1, i+2, ..., j-1.
 |  start defaults to 0, and stop is omitted!  range(4) produces 0, 1, 2, 3.
 |  These are exactly the valid indices for a list of 4 elements.
 |  When step is given, it specifies the increment (or decrement).
 |  
 |  Methods defined here:
 |  
 |  __contains__(self, key, /)
 |      Return key in self.
 |  
 |  __eq__(self, value, /)
 |      Return self==value.
 |  
 |  __ge__(self, value, /)
 |      Return self>=value.
 |  
 |  __getattribute__(self, name, /)
 |      Return getattr(self, name).
 |  
 |  __getitem__(self, key, /)
 |      Return self[key].
 |  
 |  __gt__(self, value, /)
 |      Return self>value.
 |  
 |  __hash__(self, /)
 |      Return hash(self).
 |  
 |  __iter__(self, /)
 |      Implement iter(self).
 |  
 |  __le__(self, value, /)
 |      Return self<=value.
 |  
 |  __len__(self, /)
 |      Return len(self).
 |  
 |  __lt__(self, value, /)
 |      Return self<value.
 |  
 |  __ne__(self, value, /)
 |      Return self!=value.
 |  
 |  __new__(*args, **kwargs) from builtins.type
 |      Create and return a new object.  See help(type) for accurate signature.
 |  
 |  __reduce__(...)
 |      helper for pickle
 |  
 |  __repr__(self, /)
 |      Return repr(self).
 |  
 |  __reversed__(...)
 |      Return a reverse iterator.
 |  
 |  count(...)
 |      rangeobject.count(value) -> integer -- return number of occurrences of value
 |  
 |  index(...)
 |      rangeobject.index(value, [start, [stop]]) -> integer -- return index of value.
 |      Raise ValueError if the value is not present.
 |  
 |  ----------------------------------------------------------------------
 |  Data descriptors defined here:
 |  
 |  start
 |  
 |  step
 |  
 |  stop

None
In [16]:
# 주피터에서만 가능한 문법
range?
  • 반환값이 없는 함수
In [17]:
def myfn3(a,b):
    result=a+b
In [18]:
print(myfn3(1,2))
None
  • 인자와 반환값이 모두 없는 함수
In [19]:
def myfn4():
    print("hello")
In [20]:
print(myfn4()) # 함수를 실행시키고 반환값을 출력(print)하세요.
hello
None

hello가 출력되었는데 반환값이 없다?

In [21]:
k=myfn4()
hello
In [22]:
print(k) 
None

Scope (변수의 유효범위)

  • 지역변수: 함수안에서 선언, 함수내에서만 활용가능
  • 전역변수: 함수밖에서 선언, 전체적으로 활용가능 (함수안에서 선언할 수도 있다. 특별한 명령어 필요)
In [23]:
def scope_local():
    loc_v = 2
    return loc_v
In [24]:
print(scope_local())
2
In [25]:
print(loc_v)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-25-88e2c8b6d609> in <module>()
----> 1 print(loc_v)

NameError: name 'loc_v' is not defined
In [26]:
glo_v=2
In [27]:
def scope_global():
    return glo_v
In [28]:
print(scope_global())
2
In [29]:
def scope_global2():
    glo1 = "지역변수"
    global glo2
    glo2 = "함수내에서 선언된 전역변수"
    return glo_v
In [30]:
print(glo1)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-30-b1ff3244e114> in <module>()
----> 1 print(glo1)

NameError: name 'glo1' is not defined
In [31]:
print(glo2)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-31-f29c5cc044c8> in <module>()
----> 1 print(glo2)

NameError: name 'glo2' is not defined
In [32]:
scope_global2()
Out[32]:
2
In [33]:
print(glo2) # 함수 호출 시점에 변수 생성
함수내에서 선언된 전역변수

함수내부에서 전역변수를 호출하는 문법(Global)은 가능한 쓰지 말자!!

  • 코드의 유지 및 debug가 어려워질 수 있다.
  • 전역변수 자체를 쓰지 않는 것이 좋다. 유효범위를 최소화하여 지역변수를 사용하는 것이 버그 발생률을 낮춘다!!

인자(Arguments)의 적용

  • Positional Arguments (위치에 기반한 인자)
In [34]:
def fn_arguments(name,age):
    print("당신의 이름은 {}이며, 나이는{}입니다.".format(name,age))
In [35]:
fn_arguments('철수',10)
당신의 이름은 철수이며, 나이는10입니다.
In [36]:
fn_arguments(20,'미애') #순서가 중요
당신의 이름은 20이며, 나이는미애입니다.
  • Keyword Arguments (이름에 기반한 인자)
In [37]:
fn_arguments(age=20,name="수지")
당신의 이름은 수지이며, 나이는20입니다.
In [38]:
fn_arguments(name="호동",age=40) #순서와 상관없음.
당신의 이름은 호동이며, 나이는40입니다.

함수를 정의할 때 기본값을 지정하는 방법

In [39]:
def fn_default(name="하하",age="99"):
    print("당신의 이름은 {}이며, 나이는{}입니다.".format(name,age))
In [40]:
fn_default("지효",31)
당신의 이름은 지효이며, 나이는31입니다.
In [41]:
fn_default(name="석진")
당신의 이름은 석진이며, 나이는99입니다.

입력값을 몇 개가 될지 모를 때는 어떻게 할까?

  • 정해지지 않은 개수의 수를 받아서 모두 더하는 함수를 만들어보자

def 함수이름(*매개변수): 수행할 문장

In [42]:
def sum_many(*args):
    sum=0
    for i in args:
        sum = sum + i 
    return sum
In [43]:
sum_many(1,2,3)
Out[43]:
6

위에서 args는 임의의 이름으로 바꿔도 됨. 하지만 관례상 args를 씀. 위의 args는 tuple이 됨. tuple처럼 사용하면 됨

In [44]:
def sum_many2(*args):
    sum=0
    print('args=',args)
    print(type(args))
    for i in args:
        sum = sum + i 
    return sum
In [45]:
sum_many2(1,2)
args= (1, 2)
<class 'tuple'>
Out[45]:
3
In [ ]:
 

Anonymous Function (익명함수)

  • lambda 인자 : 실행값
  • 대개 1줄함수를 간단하게 만들때(재사용이 필요없을 때) 사용하는 식
  • return을 따로 지정하지 않고 : 뒤의 값이 return 된다.
In [46]:
lambda x,y :x*y
Out[46]:
<function __main__.<lambda>>
In [47]:
def mysum1(x,y):
    return x*y
In [48]:
mysum2 = lambda x,y : x*y
In [49]:
print(mysum1(2,3))
6
In [50]:
print(mysum2(2,3))
6
In [51]:
(lambda x,y :x*y)(1,2)
Out[51]:
2
In [52]:
mylist = [lambda a,b:a+b, lambda a,b:a*b]
In [53]:
mylist
Out[53]:
[<function __main__.<lambda>>, <function __main__.<lambda>>]
In [54]:
mylist[0]
Out[54]:
<function __main__.<lambda>>
In [55]:
mylist[0](1,2)
Out[55]:
3

(심화)그 외에 공부하면 좋은 것들

  • packing,unpacking, 가변인자, 1급 객체

연습문제 0

digit 함수는 자연수를 전달받아 몇자리 수인지 출력하는 합니다. 예를 들어 num = 1236 이면 4를 return하면 됩니다. mydigit 함수를 완성해보세요.

In [60]:
def mydigit(num):
    """자리수 반환함수"""

sum_digit함수는 자연수를 전달 받아서 숫자의 각 자릿수의 합을 구해서 return합니다. 예를들어 number = 123이면 1 + 2 + 3 = 6을 return하면 됩니다. sum_digit함수를 완성해보세요.

In [61]:
def sum_digit(number):
    '''number의 각 자릿수를 더해서 return하세요'''
   
In [62]:
# 아래는 테스트로 출력해 보기 위한 코드입니다.
print("결과 : {}".format(sum_digit(123))); # 결과는 6이 나와야 함.
결과 : None

1 ~ 10 사이의 어떤 수로도 나누어 떨어지는 가장 작은 수는 2520입니다.

그러면 1 ~ 20 사이의 어떤 수로도 나누어 떨어지는 가장 작은 수는 얼마입니까?


blog comments powered by Disqus