akxltmzk
1/25/2020 - 7:29 AM

제어플로와 코드구조

// 주석문

"""
여기는 주석입니다 아무거나 사용해도 됩니다.
"""
----
#이것은 한줄 주석입니다 아무거나 써도 됩니다.
================================================================================
// 한줄이 길어질 경우
-> back slash를 쓰고 줄바꿈을 해라! 아니면 ()로 묶던가!
s = 'aaaaaaaaaaaaaaaaaaaaaaaaaaa' |
    + 'bbbbbbbbbbbbbbbbbbbbbbbbbbb'
print(s)
================================================================================
// if문
x = -10
if x < 0:
    print('negative')
elif x == 0
    print('zero')
else:
    print('positive')
------------------
->if문은 반드시 텝두번으로 띄어쓰기 간격을 맞춰야한다 아니면 에러가난다!
a = 5
b = 10 
if a > 0:
    print('a is positive')
    if b>0:
        print('b is positive')   
================================================================================
// 논리 연산자
-> 다른 부분은 &&->and ||-> or 일뿐
if a > 0 and b <5 :
    print('a는 양수이고 b는 5보다 작은 수입니다')
================================================================================
// IN과 NOT의 쓰임

y = [1,2,3]
x = 1
if x in y :
    print('in')
if 100 not in y:
    print('not in')
-----
is_ok = True
if not is_ok :      ->if is_ok != True 와 같은거다
    print('hello')
================================================================================
// 값이 들어있지 않다는 판정 테크닉
is_ok = '아무숫자혹은 문자,혹은 리스트가 들어있으면'
#False 판정은 0,0.0,''',[],() 일때 
if is_ok :
  print('ok') -> js에서는 bool 값일경우 true임을 확인하는거지만 파이썬에서는 어떤 순자라도 초기화가 되어있으면 true라고 본다!
================================================================================
// None 판정
-> Null은 파이썬에서는 None이다
is_empty = None
if is_empty is None:
    print('None!!!!')
--------------
print(1==True) -> True
print(1 is True)-> False
-> is는 오브젝트 끼리를 비교하는 것이기 때문에 False가 나온다
-> 즉 None 판정은 is를 쓰면 좋다!
================================================================================
// While, Continue, break
count = 0
while count < 5:
    print(count)
    count += 1
--------
count = 0
while True:
  if count > - 5:
      break  -> while 에서 나오려면 break
  if count ==2:
      count += 2
      continue -> continue는 while에서 나오는 것이 아니라 밑부분을 생략하고 while의 맨처음으로 돌려보낸다!!!!
  print(count)
  count += 1  
================================================================================
//while else문
count = 0
while count < 5:
    print(count)
    count += 1
else:       -> 즉, While 문에 break이 없을때 else를 실행하고 끝내라!
    print('Done')
================================================================================
//input함수
while True:
    word = input('Enter:') ->putchar같은거임(콘솔에서 입력받을 수 있게됨 만약 유저가 ok로 치면 while에서 나갈수있음)
    if(word == 'ok')
        break
    print('next')
================================================================================
//for문,break문,continue문
array = [1,2,3,4,5]
for i in array :
    print(i)
---------
for word in ['my','name','is','hyunwoo']:
    if word == 'name' :
        break -> my 찍고 출력 끝
    if word == 'is' :
        continue -> my name hyunwoo
    print(word)
================================================================================
// for else 문
for word in ['apple','banana','orange'] :
    print(word)
else :
    print('배열이 끝났습니다') -> break이없이 다돌았으면 호출된다.
================================================================================
//range함수
for i in range(2,10):
    print(i) -> 2,3,4,5,6,7,8,9
------------    
for i in range(2,10,3):
    print(i) -> 2,5,8(2부터 10전까지 3씩 띄어서 출력해주세요)
-------------    
for _ in range(10):
    print('hello') -> i대신 _를 쓰면 i는 이 for 문에서 쓰지 않는다는 명시적인 정보를 줄수있음
================================================================================    
//enumerate 함수
for i, fruit in enumerate(['apple','banana','orange']):
    print(i,fruit) -> 0 apple / 1 banana / 2 ornage(구조기억!)
================================================================================
// zip 함수
days = ['Mon','Tue','Wed']
fruits = ['apple','banana','orange']
drinks = ['coffee','tea','beer']

for day,fruit,drink in zip(days,fruits,drinks)
  print(day,fruit,drink) -> Mon apple coffee / Tue banana tea / Wed orange beer
================================================================================
// items 함수 
d ={'x' : 100 , 'y' : 200}
for v in d :
    print(v) -> x / y(key만 출력되어버린다))
------
for k,v in d.items():
    print(k ,':', v) -> x:100/y:200(items 메서드를 이용해 값도 출력 가능)
    
================================================================================
//함수의 인수와 반환값의 선언
def add_num(a:int,b:int) ->int :   -> (a와 b는 정수이며 반환값도 정수입니다(다른걸 넣어도 실행은 된다.)
    print(a+b)
================================================================================
//위치 인수,키워드 인수, 디폴트 인수
def menu(entree, drink, dessert ='beer') : ->인수가 없을때는 default값을 미리 줄수있다,
    print(entree)
    print(drink)
    print(dessert)

menu(entree='beer', dessert = 'ice') -> 순서방지를 위해서 네임을 줄수 있다.
================================================================================
// 위치 인수의 튜플화 
def say_something(word,*args) :
  print(word)
  print(args)
    
say_something('Hi!','Mike', 'Nancy') -> 'Hi' ('Mike','Nancy')
================================================================================
// 키워드 인수의 사전화
def menu(**kwargs):
  print(kwargs)
  
menu(entree='beef',drink='coffe') -> {'entree' : 'beef', 'drink' : 'coffee'}(**kwargs는 들어오는 파라미터들을 사전형으로 만들어준다)
------
def menu(**kwargs):
  for k, v in kwargs.items():
    print(v,k)
    
menu(entree='beef',drink='coffe')-> entree beef   drink coffee
------
d = {
  'entree' : 'beef',
  'drink' : 'ice coffe',
  'dessert' : 'ice'
}

menu(**d) -> **를 부텨 사전형 d를 전개해서 넘기면 **kwargs가 다시 사전형으로 만들고 for문을 돌리게 된다
------
def menu(food, *args, **kwargs):
  print(food)
  print(args)
  print(kwargs)

menu('banana','apple','orange',entree='beef',drink='coffee') -> banana ('apple','orange') {'entree':'beef','drink':'coffee'}
                                                                (다만 *args **kwargs 순서로 써야지 반대로는 안된다!!!!)
                                                            
================================================================================                                                              
// Dogstrings
def example_func(param1, param2):
  """Example function with types documented in the docstring. ->function의 설명
  Args:
    param1(int): The first parameter                          -> parameter값 설명 
    param2(str): The second parameter
  Returns:                                                    -> return값 설명
    bool: The return value, True for success, False otherwise
  """
  print(param1)
  print(param2)
  return True
  
print(example_func._doc_) -> 코멘트 출력
================================================================================
// 함수 내 함수
def outer(a,b):
  def plus(c,d):
    return c + d
  r1 = plus(a,b)
  r2 = plus(b,a) -> 여러모로 유용
  print(r1+r2) -> inner function은 보통 이 함수 안에서만 필요한 함수일때 안에 넣어버린다

outer(1,2) -> 6
================================================================================
// 클로저

def outer(a,b):
  def inner():
    return a+b
  return inner

outer(1,2) -> function outer.<locals>.inner~~blahblha(이건 즉, inner()를 시킨적이 없기 때문에 함수가 리턴된다)

f = outer(1,2)
r = f()
print(r) -> 3 (즉 지금은 1+2를 하고 싶지 않으니, f에 저장해뒀다가 나중에 실행 시키고 싶을 때 사용
               클로저는 상황 자체를 기억하고 있다. 1,2가 들어왔던 상황 
               )
-----------
def circle_area_func(pi):
  def circle_area(radius):
    return pi*radius*radius
  
  return circle_area

cal1 = circle_area_func(3.14)
cal2 = circle_area_func(3.141592)

print(cal1(10)) -> 314.0
print(cal2(20)) -> 314.1592(파이를 결정해두고 나중에 용도에 따라 쓰임을 다르게 할때 이렇게 클로저에 저장해놓는다)
================================================================================
//데코레이터 -> 데코레이션은 함수마다 앞뒤에 다른 함수를 실행 시키고 싶을때 사용
def print_more(func):
  def wrapper(*args,**kwargs):
    print('func:',func.__name__)
    print('args:',args)
    print('kwargs:',kwargs)
    result = func(*args,**kwargs)
    print('result:',result)
    return result
  return wrapper

def print_info(func):
  def wrapper(*args,**kwargs):
    print('start')
    result = func(*args,**kwargs)
    print('end')
    return result
  return wrapper

@print_info 
@print_more       
def add_num(a,b):
  return a+b

add_num(10 , 20) -> start
                    func: add_num
                    args: (10, 20)
                    kwargs: {}
                    result: 30
                    end

================================================================================
//람다
l = ['Mon','tue','Wed','thu']
def changewords(words,func):
  for word in words:
    print(func(word))

sample_func = lamda word: word.capitalize() ->앞글자를 대문자로 만들기(lamda 인수: return값)
sample_func2 = lamda word: word.lower() -> 소문자로 만들기
changewords(l,sample_func)
================================================================================
//제너레이터
def greeting():
  yield 'Good morning'
  yield 'Good afternoon'
  yield 'Good night'

g = greeting()
print(next(g)) -> Good morning
print('중간에 무언가를 넣을 수 있습니다')
print(next(g)) -> Good afternoon
print(next(g)) -> Good night
================================================================================
 //리스트의 내포 표기 
 t = (1,2,3,4,5)
 l = []
 for i in t:
   if i%2 == 0:
    l.append(i)
  
  print(l)

  l = [ i for i in t if i % 2 == 0] -> 위에것을 한방에 써버리기.
  print(l)
  ----------
t = (1,2,3,4,5)
 t2 = (5,6,7,8,9,10)
 
  l = []
  for i in t:
    for j in t2:
      l.append(i*j)
  
  print(l)
  
  l = []
  l = [i*j for i in t for j in t2] -> 이중포문도 한번에 써버리기
================================================================================
// 사전 내포 표기
w = ['mon','tue','wed']
f = ['coffee','milk','water']

d={}
for k,v in zip(w,f):
  d[k] = v

print(d)

d={k:v for k,v in zip(w,f)} ->위에꺼 한방에 써버리기
print(d)
================================================================================
//집합 내포 표기
s = set()
for i in range(10):
  if i % 2 ==0:
    s.add(i)
  
print(s)

s = {i for i in range(10) if i % 2 ==0} ->집합형 한방에 써버리기