Python 내포용법, 함수, 전역변수

comprehension(내포용법)

  • 자료구조 안에 제어문(조건문, 반복문)

  • 자료구조를 생성할 때 사용한다.
  • 한 줄로 자료구조를 생성할 수 없을까?

리스트 컴프리헨션

  • 원소가 앞에 온다.
  • for num in range(100):
        nums.append(num+1)
  • nums = [ num+1 for num in range(100) ]

for문 + if문 + else 내포시키기

  • 원소가 1개, 원소는 앞으로 보내자.
  • for var in vars:
        if var > 0:
            pos.append(var)

    pos = [ var for var in vars if var > 0 ]


  • 원소가 2개 오면 어떡하지?  원소 2개 이상인 덩어리를 통으로 앞으로 보내자.
  • for var in vars:
        if var > 0:
            abs.append(var)
        else:
            abs.append(var*-1)

    abs = [ var if var > 0    else var*-1    for var in vars ]


  • 원소가 3개 오면 어떡하지?   단, 내포에서 elif는 지원하지 않는다.
  • 첫번째 원소 1개만 앞에 나머지는 순서대로
  • for var in vars:
        if var == 0:
            txts.append('zero')
        else:
            if var % 2 == 0:
                txts.append('even')
            else:
                txts.append('odd')
  • txts = [ 'zero' if var == 0 else     'even' if var%2 == 0 else 'odd'     for var in vars ]

이중 for문 내포시키기

num = []
for i in range(2):
    for j in range(3):
        if i%2 == 0:
            num.append(i)
        else:
            num.append(j)
num = [ i if i%2 == 0 else j for i in range(2) for j in range(3) ]

딕셔너리 컴프리헨션

  • 값을 콜론으로 구분한다. 
  • dict = { key : value for ~ }
  • for movie, rating in zip(movies, ratings):
      data[movie] = rating
  • rating_dict = { key : value for key, value in zip(movie, rating) }


집합 컴프리헨션도 동일하다.



튜플 컴프리헨션은 지원하지 않는다.

  • 관련 문법은 제너레이터를 생성하는 문법이다.
  • num = (i for i in range(10))
    print(num) #<generator object <genexpr> at 0x7f123d17e550>


def 함수명():

함수는 재사용하기 위해 사용한다.

  • 인자:
    • def 함수명(인자1, 인자2):

    • 인자 여러 개 가능

    • 인자 default 가능
      • def 함수명(인자1 = default )

    • *, packing - 가변인자(가별인자!)
      • 인자의 개수가 자유롭다.
      • def 함수명(*인자)  #가변인자의 방식은 tuple이다.
      • tuple인데 원소가 하나인 경우 (원소, ) 로 표시된다.

  • 호출
    • 함수명(값1, 값2)

    • 함수명(인자2=값2)  #특정 인자에 넣고 싶은 경우

    • *, unpacking
      • iterable 을 벗긴다.
      • 함수명( *( a, b, c) ) == 함수명( a, b, c ) 
      • dictionay를 벗길 때에는 ** 사용

  • return:
    • return 리턴값
    • 리턴 여러 개 가능

람다 함수 (람브다함수, 한줄 함수)

  • def even_num(*args):
        return [num for num in args if num % 2 == 0]
  • even_num = lambda *args: [num for num in args if num % 2 == 0]
    • 함수명 = lambda 인자: 출력(return)

전역변수

  • 지역변수가 있다면, 함수 내에서는 지역변수를 우선한다.
  • 지역변수가 없다면, 함수 내에서도 전역변수를 참조한다.
  • 함수내에서 전역변수를 호출하여 값을 수정할 수 있다.
    • global 변수: 전역변수 끌어와서 수정하기.
# 모든 변수명을 a로 선언해보자.
a = 5 # 전역변수

def fun1():
  a = 1 # 지역변수 1
  print(a) # -> 이 a 는 누구일까?

def fun2():
  a = 2 # 지역변수 2
  print(a) # -> 이 a 는 누구일까?

def fun3():
  print(a) # -> 이 a 는 누구일까? 지역 변수가 없으므로 전역변수를 찾는다.

def fun4(): # 전역변수를 함수 안에서 수정까지 하려면
  global a # 전역변수 a를 끌어온다.
  a = 4 # 전역변수
  print(a) # 이 a 는 누구일까?









댓글 쓰기

다음 이전