# '#'으로 시작하면 한 줄 주석 => 컴파일러나 인터프리터가 번역하지 않는다.
# ''' 부터 ''' 사이에 코딩하면 범위 주석으로 지정할 수 있다.

# print() 함수는 ()안의 내용을 출력하고 줄을 바꾼다.
print("Hello Python")
print('안녕 파이썬')
print("제2외국어를 배운 호랑이가 '야옹' 했습니다.")
print('제2외국어를 배운 고양이가 "어흥" 했습니다.')
print("제2외국어를 배운 호랑이가 \"야옹\" 했습니다.")
print('제2외국어를 배운 고양이가 \'어흥\' 했습니다.')

# print() 함수로 출력 후 줄을 변경하지 않으려면 아래와 같이 end 옵션을 지정한다.
# end 옵션은 print() 함수로 출력한 후 출력할 내용을 지정한다. => end 옵션을 생략하면 '\n'이 기본값으로 사용된다.
# => '\n'은 new line(줄바꿈)을 의미한다.
print("Hello \nPython", end='')
print('안녕 파이썬')

# print() 함수로 2개 이상의 데이터를 출력하려면 ','나 '+'로 구분해 출력한다.
# ','로 데이터를 구분하면 sep 옵션으로 지정한 내용이 데이터 사이에 출력된다. => sep 옵션을 생략하면 공백이 기본값으로 사용된다.
print("Hello Python", '안녕 파이썬', sep='^^;')
# '+'로 구분하면 데이터가 연결되서 출력된다.
print("Hello Python" + '안녕 파이썬')
# print() 함수에서 문자열 뒤에 '*' 연산자를 사용하면 지정된 숫자 만큼 문자열을 반복해서 출력한다.
print('*' * 80)


#### '%'와 서식 문자를 사용해서 출력 서식 지정하기 ####
# 서식문자
# d(정수), f(실수), s(문자열)를 사용해서 출력 서식을 지정할 수 있다. => 출력 서식 문자를 제외한 나머지 문자는 입력한 그대로 출력된다.
# 출력 서식의 형식
# %[-][0][n][.m]서식문자 => []안의 내용은 생략할 수 있다. => 필요한 경우 사용한다.
# -  : 전체 자리수가 지정된 경우 데이터를 왼쪽에 맞춰 출력한다. => 전체 자리수를 지정하면 데이터가 오른쪽에 맞춰 출력된다.
# 0  : 전체 자리수가 지정된 경우 숫자 데이터의 왼쪽 남는 자리에 '0'을 채워 출력한다. => 문자에서는 무시된다.
# n  : 전체 자리수
# .m : 실수를 출력할 경우 소수점 아래 자리수
print(100)
print(1)
print(10000)

# print('출력 서식' % 출력할 데이터)
print('%5d' % 100)
print('%5d' % 1)
print('%-5d' % 1)
print('%05d' % 1)
print('%5d' % 10000)

print('abc')
print('a')
print('abcde')

print('%5s' % 'abc')
print('%5s' % 'a')
print('%-5s' % 'a')
print('%05s' % 'a')                     # 파이썬은 문자열 서식에서 '0'이 무시된다.
print('%5s' % 'abcde')

print('%6.2f' % 123.45)
# 소수점 아래 숫자는 잘리는 자리에서 반올림해서 출력한다. => 원래 데이터는 변경되지 않는다.
print('%6.2f' % 123.456)
print('%6.2f' % 123.4)                  # 남는 자리에는 '0'이 채워져셔 출력된다.
print('%4.0f' % 59.5)
print('%4.0f' % 60.4)

print('%d + %d = %d' % (5, 3, 5 + 3))   # 덧셈
print('%d - %d = %d' % (5, 3, 5 - 3))   # 뺄셈
print('%d * %d = %d' % (5, 3, 5 * 3))   # 곰셈
# 파이썬은 '/' 연산자로 나눗셈을 하면 소수점 아래까지 계산된다.
# 나눗셈 => 나눗셈 결과를 %d를 사용해서 정수로 출력하라 했으므로 정수만 출력된다.
print('%d / %d = %d' % (5, 3, 5 / 3))
print('%d / %d = %f' % (5, 3, 5 / 3))
# 나눗셈 결과 중 '몫'만 계산하고 싶다면 '//' 연산자를 사용한다.
print('%d // %d = %d' % (5, 3, 5 // 3))
print('%d // %d = %f' % (5, 3, 5 // 3))
# 출력 서식을 지정할 때 '%' 자체를 출력하고 싶다면 연속해서 2개를 써야한다.
print('%d %% %d = %d' % (5, 3, 5 % 3))      # 나머지
print('%d의 %d승 = %d' % (2, 10, 2 ** 10))   # 거듭제곱
print('루트 %d = %f' % (2, 2 ** 0.5))

# 산술 연산자 우선순위 : () => ** => *, /, // => +, -

# 문자열 출력 서식을 지정하는 format() 메소드와 {}를 사용해서 출력하기
print('%d + %d = %d' % (5, 3, 5 + 3))
print('{} + {} = {}'.format(5, 3, 5 + 3))
print('{} - {} = {}'.format(5, 3, 5 - 3))
print('{} * {} = {}'.format(5, 3, 5 * 3))
print('{} / {} = {}'.format(5, 3, 5 / 3))
print('{} // {} = {}'.format(5, 3, 5 // 3))
print('{} % {} = {}'.format(5, 3, 5 % 3))
print('{}의 {}승 = {}'.format(2, 10, 2 ** 10))
print('루트 {} = {}'.format(2, 2 ** 0.5))

print('{} {}'.format('홍길동', '바보'))
# 인덱스를 지정하지 않은 상태에서 {}와 출력할 데이터의 개수가 다를({}가 남을) 경우 에러가 발생된다.
#print('{} {} {}'.format('홍길동', '바보'))      # 에러
print('{}'.format('홍길동', '바보'))             # 남는 데이터는 무시된다.

# format() 메소드와 출력할 데이터의 인덱스를 사용해서 출력하기 => 인덱스는 0부터 시작된다.
print('{0} {1}'.format('홍길동', '바보'))
print('{1} {0}'.format('홍길동', '바보'))
# 인덱스가 지정되면 출력할 데이터와 {}의 개수가 다르더라도 인덱스의 범위만 벗어나지 않으면 정상
# 출력된다.
print('{0} {1} {0}'.format('홍길동', '바보'))
# {} 안에 지정한 인덱스가 범위를 벗어나서 지정되면 에러가 발생된다.
#print('{0} {1} {2}'.format('홍길동', '바보'))   # 에러
# 인덱스를 부분적으로 지정하면 {}의 개수와 데이터의 개수가 같더라도 에러가 발생된다.
#print('{0} {}'.format('홍길동', '바보'))        # 에러

#### 출력 서식과 format() 메소드로 출력할 데이터의 인덱스를 사용해서 출력하기 ####
# {인덱스:출력서식} => 출력 서식 앞에 '%'는 붙이지 않는다.
print('%s님은 %d살 입니다.' % ('홍길동', 20))
print('{}님은 {}살 입니다.'.format('홍길동', 20))
print('{0}님은 {1}살 입니다.'.format('홍길동', 20))
print('{0:s}님은 {1:d}살 입니다.'.format('홍길동', 20))
print('{0:10s}님은 {1:05d}살 입니다.'.format('홍길동', 2000))

# '<', '>', '^'를 사용해서 문자열 출력시 정렬 방법을 지정할 수 있다. => '<'가 생략시 기본값으로 사용된다.
print('{0:10s}님은 {1:05d}살 입니다.'.format('홍길동', 2000))
print('{0:<10s}님은 {1:05d}살 입니다.'.format('홍길동', 2000))   # 왼쪽 정렬
print('{0:>10s}님은 {1:05d}살 입니다.'.format('홍길동', 2000))   # 오른쪽 정렬
print('{0:^10s}님은 {1:05d}살 입니다.'.format('홍길동', 2000))   # 가운데 정렬

# '<', '>', '^'를 사용해서 문자열 출력시 남는 공백에 채워지는 채움 문자를 지정할 수 있다.
print('{0:_<10s}님은 {1:05d}살 입니다.'.format('홍길동', 2000))
print('{0:#>10s}님은 {1:05d}살 입니다.'.format('홍길동', 2000))
print('{0:*^10s}님은 {1:05d}살 입니다.'.format('홍길동', 2000))

# f 접두어를 사용한 출력
name = '임꺽정'
age = 35
print(f'{name}님은 {age}살 입니다.')
