WIL #1 | Python (from replit)

신승호·2021년 4월 15일
0

WIL

목록 보기
2/20

🤷 기간 : 2021.04.15 ~ 2021.04.18
🤷 자료 : replit.com
🤷 내용: python


함수 쓸 때 참고해

- 함수 만들 때 인수 지정을 안했을 때

def shin():		
    return a+b

a = 1			# 함수 안의 값 들을 지정해 두면 된당
b = 2
print(shin())		# 3 나옴
- 함수 만들 때 인수 지정 했을 때
def shin(a,b):		
    return a+b

print(shin(1, 2))	# 3 나옴 / 프린트 할때 해주면 된다
- 
def shin():
    return a+b

print(shin(1, 2))	# 에러 뜸 / a,b 값을 미리 지정해 둬야된당 

Literal string interpolation

  • 언제 사용하나요 ?
    • 길고 복잡한 문자열을 출력 할 때 유용
  • 사용 방법
    • print(f"{ } 문자ABC")
    >>> name = "shin"
    >>> print(f"hello, {name}")		# 변수 여러개를 해서 추가할 수도 있다.
    hello, shin

Comparison Operators

  • > : 숫자 뿐 아니라 문자(str)에도 사용이 가능하다
if character > "b":
    print("b 보다 크면 c 혹은 그 다음 알파벳들중 하나 이겠군요?")
if character < "b":
    print("b 보다 작으면 a 이겠네요!")

Assignment #25

수학 ..^^ 와이리 어렵누 ^^ 잘못 생각하고 있었넹 ㅋㅎ

다음의 방정식을 해결하는 프로그램을 구현 하세요. x값을 구해야 합니다.

ax = b

결과 출력물은 다음과 같아야 합니다.

  • Input 으로 주어진 a 와 b 값으로 위의 방정식을 충족하는 단 하나의 정수가 존재한다면 해당 정수를 출력하면 됩니다
  • 만일 a 와 b 값으로 위의 방정식을 충족하는 정수가 없다면 "No Solution"을 출력해주세요.
  • a 와 b 값으로 위의 방정식을 충족하는 정수가 많다면 "Many Solutions"을 출력해주세요.

Hint:

- a 나 b 는 0이 될 수 있습니다.

Examples:

- 만일 a = 1, b = -2 라면 결과값으로 -2가 출력이 되어야 합니다.
- 만일 a = 2, b = -1 라면 결과값으로 "No Solution"이 출력이 되어야 합니다.

제출완료

a = int(input("첫 번째 숫자를 입력해주세요: "))
b = int(input("두 번째 숫자를 입력해주세요: "))
`
if a == 0 and b == 0:		# 둘다 0 이면 x값이 암꺼나 나와도 되니까
  print("Many Solutions")	# 매니솔류션
elif a ==0 and b != 0:		# a만 0이면 뭘 넣어도 안되니까
  print("No Solution")		# 값이 없지
elif a != 0 and b == 0:		# b만 0이면 x값은 0만 나올 수 있징? 
  print(0)			# 그래서 0
elif a != 0 and b != 0:		# 둘다 0이 아닐때
  print(b/a)			# x값 출력 하고
  if b%a != 0:			# 나머지 값이 0이 아니면 = 실수(float) 이면
    print("No Solution")	# 답없당 ~

Function Parameter

  • Positional Parameter:
    • 가장 기본적인 형태, 순서가 바뀌면 출력값도 바뀌겠지 당요니 ?
def love_you(my_name, your_name): 
   print(f"{my_name} loves {your_name}") 
 
love_you("정우성", "아이유")			# 순서에 맞게 값을 넣어 준다.

정우성 loves 아이유
  • Keyword Arguments:
    • 이름으로 맞추어서 값을 전해줄 수 있으며, 순서가 뒤바껴도 됌
def love_you(my_name, your_name): 
   print(f"{my_name} loves {your_name}") 
 
love_you(your_name="아이유", my_name="정우성")	# 순서가 아니라 이름에 맞게 넣어줘서 값은 위와 똑같당

정우성 loves 아이유
  • Mixing positional arguments and keyword arguments:
    • keyword arguments 는 순서가 바뀌어도 상관 없지만 / positional arguments 부분은 순서를 지켜줘야 한다는 것입니다.
def love_you(my_name, your_name): 
   print(f"{my_name} loves {your_name}") 
   
   love_you(your_name = "아이유", "정우성")	# 키워드 아규먼트는 위치 상관 ㄴㄴ, 근데 "정우성"이 my_name쪽에 있으려면 앞으로 가야 겠지? 그래서 이게 안되는거약/ 요건 your_name이 값이 2개가 되는 느낌이지

오류..
def love_you(my_name, your_name): 
   print(f"{my_name} loves {your_name}") 

love_you("정우성", your_name = "아이유")

정우성 loves 아이유
  • Parameter Default Value :값이 넘겨지 않은 경우 default 값이 자동넘어간다
    • 문제는 default 값이 정의된 parameter가, default 값이 정의 되지 않은 parameter보다 먼저 위치해 있으면 안된다
    • 일단 어떻게 default값을 주나 ?
def love_you(my_name, your_name="아이유"): 	# 함수에 미리 때려박아 놓는거지 이때 인수 순서가 바뀌면 안되용
    print(f"{my_name} loves {your_name}")

love_you("정우성")
정우성 loves 아이유

[Parameter order]

  • def func(Regular Positional Arguments, Default Arguments, Variable Length Positional Arguments, Keyword-only Argument or Keyword-only Argument with default, Variable Length Keyword Arguments )
  • 예제
    • def func(a, b, c = "shin", *args, a(keyword) or man=True(keyword), kwargs)

Set

  • list 와 다른점 ?

    • 요소들이 순서대로 저장되어 있지 않습니다. 즉 ordering이 없다.
  • 그에따른 특이점 ?

    • for 문에서 읽어들일때 요소들이 순서대로 나오는게 아니라 무작위 순서대로 나옴.
    • 순서가 없으므로 indexing도 없음
    • 중복된 값을 저장할 수 없음. -> 새로 저장하려고 하는 요소와 동일한 값의 요소가 존재한다면 새로운 요소가 이 전 요소를 치환(replace) 한당
    >>> set1 = {1, 2, 3, 1}
    >>> print(set1)
    {1, 2, 3}
    
    >>> set2  = set([1, 2, 3, 1])
    >>> print(set2)
    {1, 2, 3}
  • Look up 가능띠

    • if 문에서 in키워드 사용해서 찾아보자 ~ ?
    my_set = {1, 2, 3}
    
    if 1 in my_set:
        print("1 is in the set")
    > 1 is in the set
    
    if 4 not in my_set:
        print("4 is not in the set")
    > 4 is not in the set
  • set의 사용 함수 ~

    • add() : append()는 리스트에서나 쓰고 여기선 add()
    my_set = {1, 2, 3}
    my_set.add(4)
    print(my_set)
    
    > {1, 2, 3, 4}
    • remove(): 사용법은 같아 ~
    my_set = {1, 2, 3}
    my_set.remove(3)
    print(my_set)
    
    > {1, 2}
    • & 키워드 또는 intersection() : 교집합 찾을 때
    set1 = {1, 2, 3, 4, 5, 6}
    set2 = {4, 5, 6, 7, 8, 9}
    
    print(set1 & set2)
    > {4, 5, 6}
    
    print(set1.intersection(set2))
    > {4, 5, 6}
    • | 키워드 혹은 union() : 합집합 찾을 때
    print(set1 | set2)
    > {1, 2, 3, 4, 5, 6, 7, 8, 9}
    print(set1.union(set2))
    > {1, 2, 3, 4, 5, 6, 7, 8, 9}

Nested Function(중첩 함수)

> 함수 또한 함수안에 중첩으로 사용이 가능하다 !

  • 내부 함수(child function)는 는 상위 부모 함수(parent function) 안에서만 호출 가능
  • 사용법
def parent_function():
    def child_function():
        print("this is a child function")
 
    child_function()
 
parent_function()		# child_function 함수는 parent_function 안에서만 호출이 가능합니다.
> "this is a child function"

> 왜 쓰는거야 ?

가독성

  • 함수를 사용하는 이유 ?

    • 반복되는 코드블럭을 함수로 지정해서 효과적으로 관리하여 가독성 높히기 위해서
  • 중첩 함수를 사용하는 이유 ?

    • 함수와 같이 함수 내부에 반복되는 코드가 있다면, 그걸 중첩함수로 만들어서 관리하여 가독성 높히려구
    def print_all_elements(list_of_things):
      ## 중첩함수 선언
      def print_each_element(things):
          for thing in things:
              print(thing)
    
      if len(list_of_things) > 0:
          print_each_element(list_of_things)
      else:
          print("There is nothing!")

Closure

  • Closure는 사전적의미는 폐쇄임..ㅇ

  • 왜 폐쇄하고 격리해서 사용하려는 거야 . ?

    • 중첩함수부모 함수의 변수나 정보를 가두어서 사용하려고 한다 이것이 closure
    • 즉,
      • 중첩 함수부모 함수변수나 정보를 중첩 함수 내에서 사용한다.
      • 부모 함수return 값으로 중첩 함수return한다.
      • 그리하면 부모함수변수외부로부터 직접적인 접근은 격리하면서도, 중첩 함수를 통해서 격리된 부모 함수변수를 사용한 연산은 가능하게 해주는 것입니다.
  • 언제 사용하는건데 ?

    • 어떠한 정보를 기반으로 연산을 할껀데 / 기반이 되는 정보에 접근을 제한하여 노출이 되거나 수정이 되지 못하게 하고 싶을때 사용
    • 주로 factory(=공장) 패턴 = 뭔가 생성해 내는 패턴을 구현할 때
      • factory안에서 뭔가 생성해 낼 때, 설정해 놓은 설정값을 수정 불가능하게 놓고 계속 연산 해서 생성해 내게 할때 이걸 쓰는거지
    • 주어진 어떠한 숫자의 수(數) 을 구하는 함수

      def calculate_power(number, power):
        return number ** power
      
      calculate_power(2, 7)
      > 128
    • 2의 승을 구하는 함수 ( 이건 2의 승만 구할 수 있음)

    def calculate_power_of_two(power):
      return 2 ** power
    
    calculate_power_of_two(7)
    > 128
    calculate_power_of_two(10)
    > 1024
    • 설정되는 수의 승을 구하는 함수
    def generate_power(base_number):
      def nth_power(power):
          return base_number ** power
    
      return nth_power
    
    calculate_power_of_two = generate_power(2)
    calculate_power_of_two(7)
    > 128
    calculate_power_of_two(10)
    > 1024
     
    calculate_power_of_seven = generate_power(7)
    calculate_power_of_seven(3)
    > 343
    calculate_power_of_seven(5)
    > 16907
  • 이해해봐라 ㅡ ㅡ

Decorator

  • 사전적의미는 장식 / 뭔가 장식 관련된 걸 껄 ?

  • 왠 파이선에 장식 ? 몬솔이야 ? 할꺼겠지만 한번 알아봅시다.

    • 대박 주식 정보를 리턴하는 함수
    def jackpot_stock_information():
      return "계시가 내려졌습니다. 삼성전자를 사세요!
    • 이 정보는 유료회원만 받을 수 있다고 치고 / 해당 유저가 유료 회원인지 확인해 주는 함수
    def is_paid_user():
      return True
    • 항상 is_paid_user 함수 jackpot_stock_information 함수 보다 먼저 호출 되야 되겠지 당연히 확인 먼저 해야하니까 ?
    if is_paid_user():
      jackpot_stock_information()
    • 근데 개발자가 사람이니까 위 함수를 여러곳에 쓸 때 헷깔려서 잘못 할 수도 있겠지 ?
      -> 그럼 자동으로 먼저 호출되게 할 수 있는 방법은 없나 !?
      • 이때 Decorator 쓴다 ! ! ! !
  • Decorator 사용법

    • @ 사용 / () 는 따로 안씀
    • 아래 식을 봐라 !
      @is_paid_user		# 장식(`@`)으로 달린 함수가 먼저 호출이 되고 난 후에 본 함수가 호출
      def jackpot_stock_information():
        return "계시가 내려졌습니다. 삼성전자를 사세요!"
  • 어떻게 구현하냐 ? 암꺼다 다돼 ?

    • 암꺼나 안돼고 ㅡ ㅡ ,
    • Decorator로 장식할 수 있는 함수는 중첩 함수(nested function)return하는 함수만 decorator 함수로 사용
  • 즉 , decorator = chain of functions

    • func1 => func2 => func3 => ... => funcN
    • 만일 다음 함수를 리턴하지 않고 다른 값을 리턴해버리면 그 다음 함수로 넘어가지 못하고 그냥 함수 실행이 종료되기 때문에 decorator 함수는 그 다음 함수를 리턴해줘야함
    •  is_paid_user 함수decorator로 만들어 볼까요 ? ?
    def is_paid_user(func):
     user_paid = True # 간단화 하기 위해 무조건 True
    
     def wrapper(*args, **kwargs):
         if user_paid:
             func() 
         else:
             return
    
     return wrapper		# 중첩함수"is_paid_user(func)"는 다음 함수인 "wrapper( )"를 리턴하지요  ?

    -> 방금 만든 is_paid_user 함수decorator@해주면 끝

     @is_paid_user
    def jackpot_stock_information():
      return "계시가 내려졌습니다. 삼성전자를 사세요!"

실 사용법

decorator 사용

def trace(func):                             # 호출할 함수를 매개변수로 받음
    def wrapper():
        print(func.__name__, '함수 시작')    # __name__으로 함수 이름 출력
        func()                               # 매개변수로 받은 함수를 호출
        print(func.__name__, '함수 끝')
    return wrapper                           # wrapper 함수 반환
 `
@trace    # @데코레이터
def hello():
    print('hello')
 `
@trace    # @데코레이터
def world():
    print('world')
 `
hello()    # 함수를 그대로 호출
world()    # 함수를 그대로 호출
hello 함수 시작
hello
hello 함수 끝
world 함수 시작
world
world 함수 끝

decorator 사용 안한거

decorator_closure.py
def trace(func):                        # 호출할 함수를 매개변수로 받음
    def wrapper():                      # 호출할 함수를 감싸는 함수
        print(func.__name__, '함수 시작')	# __name__으로 함수 이름 출력
        func()                          # 매개변수로 받은 함수를 호출
        print(func.__name__, '함수 끝')
    return wrapper                      # wrapper 함수 반환
 `
def hello():
    print('hello')
 `
def world():
    print('world')
 `
trace_hello = trace(hello)			 # 데코레이터에 호출할 함수를 넣음
trace_hello()             			 # 반환된 함수를 호출
trace_world = trace(world)			 # 데코레이터에 호출할 함수를 넣음
trace_world()             			 # 반환된 함수를 호출
hello 함수 시작
hello
hello 함수 끝
world 함수 시작
world
world 함수 끝

decorator 2개 사용

def decorator1(func):
    def wrapper():
        print('decorator1')
        func()
    return wrapper
 `
def decorator2(func):
    def wrapper():
        print('decorator2')
        func()
    return wrapper
 `
# 데코레이터를 여러 개 지정
@decorator1
@decorator2
def hello():
    print('hello')
 `
hello()
decorator1
decorator2
hello

replit 53번 문제 답

def welcome_decorator(func):
  def wrapper():
    a = "welcome to WECODE!"
    b = func()
    return (b+a)			# 위는 그냥 해도 됬었는데 이건 ;; 뭐지 근데 리턴값이 나와야하니까 여기 꼭 리턴값은 써주자
  return wrapper
`
@welcome_decorator
def greeting():
    return "Hello, "
 `
greeting()

Scope(범위)

  • 프로그래밍 언어에서 scope은 어떠한 객체 (변수, 함수 등)가 유효한 범위를 이야기 하며, 범위를 벗어나면 해당 객체는 사용될 수 없습니다.

  • Python에서 scope은 항상 객체가 선언된 지점에서 위로는 상위 객체 까지, 아래로는 모든 하위 객체들과 그 안에까지가 범위 입니다.

4가지 Scope

  • Local Scope (가장 좁은 범위)
  • Enclosed Scope
  • Global Scope
  • Built-in Scope (가장 넓은 범위)

Local Scope

  • 변수함수혹은객체`는 *특정(local) 범위**에서만 유효
    • 함수안에 들어가 있는 변수함수그 함수 안에서만 유효한다.

Enclosed Scope

  • 중첩함수가 있을때 적용되는 Scope

    • 부모 함수에서 선언된 변수중첩함수 안에서도 유효
  • 위의 방법을 ìdle 출력하면 1,7,none 이렇게 나옴

  • 아래로 하면 값만 딱 얻을 수 있당 ~ 참고해

    def outer():
     a=5
    
     def inner():
         b=7
         return a * b	
    
     return inner
     `
     test = outer()
     print(test())
    35

Global Scope

  • 함수 안에서 선언된것이 아닌 함수 밖에서 선언된 변수함수
    • 변수함수들이 해당 파일에서 가장 바깥쪽에서 선언되므로 해당 파일에서 선언된 지점 아래로는 다 유효한 범위를 가지고 있습니다

Built-in Scope

  • 가장 광범위한 scope
  • 파이썬이 제공하는 함수 또는 속성들이 built-in scope
  • 따로 선언이 없이도 모든 파이썬 파일에서 유효한다
    ex) len()

Shadowing

  • def shadowing()
    • 동일한 이름의 변수들이 서로 다른 scope에서 선언되었을떄, 더 넓은 범위에 있는 변수를 가지고 들이댄다
profile
신승홉니다

0개의 댓글

관련 채용 정보