[210708, 210709 TIL] Python

Choi Rim·2021년 7월 9일
0

Python

목록 보기
7/20
post-thumbnail

print와 return의 차이

print

  • Print는 원하는 값을 화면 상에 '출력' 만 하는 용도이다.
  • print는 함수를 대체할 수 없다.
  • 만약 함수에 return 이 정의되어 있지 않다면 파이썬 내부적으로 return None이 함수 가장 마지막에 쓰여있다고 가정하게 된다.

return

  • Return은 다른 함수가 사용할 수 있게끔, 값을 '반환' 즉 실제로 가져다 주는 것이다.
  • Return은 함수를 대체 할 수 있다.

파이썬 예외처리

  • SyntaxError : 잘못된 문법
  • NameError : 참조변수 없음
  • ZeroDivisionError : 0으로 나눌 수 없음
  • IndexError : 인덱스 범위 벗어남
  • ValueError : 참조 값이 없음
  • KeyError : 키 없음 에러 (주로 딕셔너리 사용시)
  • AttributeError : 모듈, 클래스의 잘못된 속성 사용함
  • FileNotFoundError : 파일 못 찾음
  • TypeError : 타입 안 맞음

중첩 if 문

Assignment

다음의 방정식을 해결하는 프로그램을 구현 하세요. 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:
  if b == 0:
    print("Many Solutions")
  else:
    print("No Solution")
elif b % a == 0:
  print(b/a)
else:
  print("No Solution")
  • a가 0일 때는 b가 0이면 어떤 값을 집어넣어도 0이니 많은 결과가 나온다.
  • a가 0일 때 b가 0이 아니면 결과가 나오지 않는다.
  • a가 b의 배수일 때 결과가 출력된다.
  • 그 외의 값들은 결과가 출력되지 않는다.
    힌트 없었으면 못 풀었을뻔... 감동

함수

def 함수명(parameter):
    문장1
    문장2
    ...
    문장N
    [return 리턴값]
  • parameter와 return은 optional이다.
    • Input parameter가 없는 함수도 있을 수 있으며, return 값이 없는 함수도 있을 수 있다.
    • return 값은 함수에서 해당 함수를 호출한 주체(invoker)에게 결과값(output)을 보내주는 것이다.

Function Parameters

  • Positional arguments : 순서 지켜야 됨
  • keyword argument : 순서 지키지 않아도 됨
  • Parameter Default Value : 함수 매개변수에 Default 값을 정해 줄 수도 있다.
    • 주의해야 할 점
      default 값이 정의된 parameter가 default 값이 정의 되지 않은 parameter보다 먼저 위치해 있으면 안된다.
    • 만일 default value parameter를 non-default value parameter 앞에 선언하면 syntax error가 난다.

default value parameternon-default value parameter 앞에 정의 하면 안 되는 이유

default value parameter

def student(student1, student2="최혜림"):
    print(열심히 하자! {student1}, {student2})
  • default value parameter를 줄 때는, 앞에 위치하면 안된다. 무조건 맨 뒤에 위치해야 한다. 왜일까?
    • argument를 parameter에게 전달할 때, default값이 이미 정해져 있으니 하나의 argument만 주게 되는데, argument는 차례대로 parameter에게 전달되기 때문에 default 값을 앞에 두면 argument가 parameter에게 제대로 전달될 수 없다.

위치 인수(positional arguments)와 가변 인수(variable length arguments)의 순서

def func_param_with_var_args(name, *args, age):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)

func_param_with_var_args("정우성", "01012341234", "seoul", 20)

Traceback (most recent call last):
File "C:/Users/user/Desktop/wecode/python test/3.py", line 6, in
func_param_with_var_args("정우성", "01012341234", "seoul", 20)
TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'

  • 함수에 매개 변수를 넣는 순서는 일반 매개 변수 - 가변 매개 변수 - 기본 매개 변수 순이다.
  • 위에서는 가변 매개 변수가 일반 매개 변수의 앞에 위치해서 에러가 발생한다.
  • TypeError: func_param_with_var_args() missing 1 required keyword-only argument:'age'
    • TypeError: func_param_with_var_args()에 1개의 필수 키워드 전용 인수가 누락되었습니다.
    • age의 인수가 누락되었다는 타입 에러가 발생한다
    • 가변 매개 변수는 인수의 개수와 상관없이 값을 출력해 준다.
def func_param_with_var_args(name, age, *args):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)

func_param_with_var_args("정우성", 20, "01012341234", "seoul")

name=정우성
args=('01012341234', 'seoul')
age=20

  • 위처럼 매개변수들의 순서를 바꿔주고 인수의 위치를 바꿔주면 정상적으로 출력된다.

가변 키워드 인수 (variable length keyword arguments)의 위치

def func_param_with_kwargs(name, age, **kwargs, address=0):
    print("name=",end=""), print(name)
    print("age=",end=""), print(age)
    print("kwargs=",end=""), print(kwargs)
    print("address=",end=""), print(address)

func_param_with_kwargs("정우성", "20", mobile="01012341234", address="seoul")
  • 위의 식은 syntax 에러가 발생한다.

  • **kwargs란 키워드 인수 받는다는 것을 뜻한다.

  • 기본 매개변수 address 가 이미 존재하는데 키워드 인수 address도 존재해서 에러가 발생하게 된다.

def func_param_with_kwargs(name, age, address, **kwargs):
    print("name=",end=""), print(name)
    print("age=",end=""), print(age)
    print("kwargs=",end=""), print(kwargs)
    print("address=",end=""), print(address)

func_param_with_kwargs("정우성", "20", mobile="01012341234", address="seoul")  

name=정우성
age=20
kwargs={'mobile': '01012341234'}
address=seoul

  • 기본매개변수 address를 일반매개변수로 바꿔주고, **kwargs와 위치를 바꿔주면 잘 실행된다.
  • 인수는 키워드 인수이기 때문에 순서가 상관없다. 순서를 지키는position 인수앞에만 오지 않으면 된다.

위치 인수와 키워드 가변 키워드 인수 (variable length keyword arguments)의 위치

def mixed_params(name="아이유", *args, age, **kwargs, address):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)
    print("kwargs=",end=""), print(kwargs)
    print("address=",end=""), print(address)

mixed_params(20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")
  • invalid syntax라는 문법 오류가 발생한다.
  • 처음부터 position 인수는 길을 잃었다..
  • 인수들의 위치를 찾아주자

def mixed_params(age, name="아이유", *args, address, **kwargs):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)
    print("kwargs=",end=""), print(kwargs)
    print("address=",end=""), print(address)

mixed_params(20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")  
  • 위 그림의 순서에 따라 매개변수들을 잘 배치해주면 에러가 발생하지 않는다.
  • keyword-Only Arguments는 *arg와 **kwargs 사이에 위치해야 한다!
    도움 주신 승훈님 감사합니다..

<참고>

profile
https://rimi0108.github.io/

0개의 댓글