AttackOnNunu

Once more into the fray


  • 홈

  • About

  • 태그

  • 카테고리

  • 아카이브

  • 검색

(PYTHON) input() & raw_input()

작성일 2020-01-23 In LANGUAGE 🚀 , PYTHON , TERMINOLOGY 댓글:

Reference

  • PEP 3111 - Python 3.8.1 Documentation
  • Python2 지원 종료 - Sunsetting Python 2
  • 파이썬 input - ksg97031님의 블로그

개인적인 생각과 상상으로 작성한 내용들이 포함되어 있습니다
PEP = Python Enhancement Proposals



다른 사람들의 코드를 읽다보면 raw_input() 함수를 사용하는 것을 생각보다 자주 볼 수 있다
input() 함수와 raw_input() 함수의 차이는 무엇일까?

Python 2? 3?

Python은 2.x 버전과 3.x 버전이 있고 서로 사소한 부분들에 있어 조금씩 차이가 나기 때문에 초보자 입장에서는 자꾸 헤매게된다

2가지 버전이 같이 사용되었던 이유는,
2000년도에 Python 2.0을 공개하였고 성능 향상을 위한 지속적인 개선 과정 중 근본적인 변화가 필요하다고 느껴서 2006년 Python 3.0을 공개하게 되었다
하지만 언제나 새로운 것을 적용하는 것은 쉬운 일이 아니다
Python 2에서 3으로 업그레이드 해달라는 파이썬 재단의 수 많은 요청에도 기존 2버전에 익숙한 사용자들은 응하지 않았다
그래서 어쩔 수 없이 2가지 버전을 모두 지원하고 있었던 것이다
실제로 2008년, 공식적으로 2015년에 지원을 중단하겠다고 발표를 했었지만 많은 곳에서 업그레이드를 하지 않아 2014년, 지원 중단일을 2020년으로 미루기로 결정한 것이다

(이제는 시계가 멈추었지만) Python 2.7 will retire in…
여기서 남은 시간을 볼 수 있었다

이제 마음 편히 Python 3만 배우고 익히면 된다

Python 2의 입력 함수

  • input()
    입력된 값의 형식에 맞게 자동으로 타입을 변환 시킨다
    (문자열 값은 “”, ‘’을 붙여야 한다. 없으면 문자로 인식 못함)
obj = input('입력해주세요: ')
print(type(obj))
print(obj)

# output

# 입력해주세요: 'hi hi'

# <type 'str'>

# hi hi

#

# 입력해주세요: hi hi

# SyntaxError: Unexpected EOF while parsing

#

# 입력해주세요: 2010

# <type 'int'>

# 2010

#

# 입력해주세요: 20.10

# <type 'float'>

# 20.10

  • raw_input()
    모든 입력 값을 문자열 타입으로 받는다
obj = raw_input('입력해주세요: ')
print(type(obj))
print(obj)

# output

# 입력해주세요: 'hi hi'

# <type 'str'>

# hi hi

#

# 입력해주세요: 2010

# <type 'str'>

# 2010

#

# 입력해주세요: 20.10

# <type 'str'>

# 20.10

Python 3의 입력 함수

결론부터 이야기 하자면 Python3에서는 input() 함수만 존재한다
input() 함수는 모든 입력을 문자열 타입으로 받는다

Python 2에서 3으로 바뀌면서 입력 함수에 변화가 있었다
Python 2에서는 input() 함수와 raw_input() 함수 2가지가 존재했다

하지만 Python 3의 공식 문서를 살펴보면 PEP 3111 에 명시되어 있듯이
Python 2의 raw_input() 함수의 이름이 input() 으로 바뀐 것이다

없어진게 아니라 이름이 바뀐 것이다.
즉, python 3의 input은 python 2의 raw_input 과 같은 기능을 한다

(PYTHON) Day - 5 Strings(1)

작성일 2020-01-23 In LANGUAGE 🚀 , PYTHON , HACKERRANK 댓글:

Reference

  • 문제 출처 - HackerRank
  • 파이썬 연습 - Practice - Python

개인적인 생각과 상상으로 작성한 내용들이 포함되어 있습니다
문제를 풀고 Discussion Tab을 참고하며 코드 스타일을 개선하려고 노력하고자 합니다



HackerRank

Numpy 패키지와 관련된 내용은 수학적 내용들과 함께 다루기 위해 나중에 다시 정리하기로 했다.

HackerRank의 Python 연습문제들은 아래와 같은 카테고리로 분류 된다:

Subdomain

  • Introduction
  • Basic Data Types
  • Strings
  • Sets
  • Math
  • Itertools
  • Collections
  • Date and Time
  • Errors and Exceptions
  • Classes
  • Built-Ins
  • Python Functionals
  • Regex and Parsing
  • XML
  • Closures and Decorators
  • Numpy
  • Debugging


Strings

Problem

  • sWAP cASE
  • String Split and Join
  • What’s Your Name?

기본 개념

sWAP cASE

대문자는 소문자로, 소문자는 대문자로 바꾸는 문제

  • INPUT
  • OUTPUT

HackerRank.com presents “Pythonist 2”.

hACKERrANK.COM PRESENTS “pYTHONIST 2”.

반사적으로 떠오르는 풀이 방법, 문자열의 문자 하나하나를 반복문을 통해 확인하며 대소문자를 바꿈
하지만 이는 굉장히 비효율적인 방법이다
String 타입은 immutable하기 때문에, 반복문을 지나면서 기존의 ans 변수가 수정되는 것이 아니라
새로운 String 객체를 만들어서 ans 변수에 선언되는 것이다

def swap_case(s):
ans = ""
for letter in s:
if letter.isupper() is True:
ans += letter.lower()
else:
ans += letter.upper()
return ans

if **name** == '**main**':
s = input()
result = swap_case(s)
print(result)

list comprehension을 사용한 방법과,
내장함수 swapcase() 를 사용하는 방법도 있다

각 수행시간을 측정해보면, list를 사용한 것이 가장 빠른 것을 알 수 있다

import time

def swap_case_1(s):
ans = ""
for letter in s:
if letter.isupper() is True:
ans += letter.lower()
else:
ans += letter.upper()
return ans

def swap_case_2(s):
ans = [i.lower() if i.isupper() else i.upper() for i in s]
return ''.join(ans)

def swap_case_3(s):
return s.swapcase()

if **name** == '**main**':
s = input()

start_1 = time.time()
result_1 = swap_case_1(s)
end_1 = time.time()

start_2 = time.time()
result_2 = swap_case_1(s)
end_2 = time.time()

start_3 = time.time()
result_3 = swap_case_1(s)
end_3 = time.time()

print('result_1: ', end_1 - start_1) # 5.4836273193359375e-05
print('result_2: ', end_2 - start_2) # 2.574920654296875e-05
print('result_3: ', end_3 - start_3) # 4.9114227294921875e-05

String Split and Join

입력되는 문자열의 띄어쓰기 부분을 - 문자로 대체하는 문제
split() 과 join() 함수를 사용하는 간단한 문제

  • INPUT
  • OUTPUT

this is a string

this-is-a-string

split() 함수는 파라미터 값 주어진 구분자(delimiter)로 문자열을 잘라 list 타입 으로 반환한다
(default값은 ‘ ‘ 공백이다)
join() 함수는 문자열을 붙여주는데, 문자 사이 특정한 구분자를 넣고 싶으면 함수 앞에 (''.join() 여기서 ‘’ 부분) 넣어주면 된다

def split_and_join(line):
letters = line.split()
return '-'.join(letters)

if **name** == '**main**':
line = input()
result = split_and_join(line)
print(result)

join() 함수를 사용하지 않아도,
print() 함수 안에서 unpacking을 통해 문자열을 합칠 수 있다
(join() 함수를 사용하지 않는 것이 실행속도가 더 빠른 것을 볼 수 있다)

letters = [‘a’, ‘b’, ‘c’, ‘d’] 가 있을 때,
print(*letters) 를 하면
print(‘a’, ‘b’, ‘c’, ‘d’) 로 해석되기 때문에
a b c d 로 출력된다

import time

def split_and_join(line):
letters = line.split()
return '-'.join(letters)

if **name** == '**main**':
line = input()
start_1 = time.time()
print(split_and_join(line))
end_1 = time.time()

start_2 = time.time()
print(*line.split(), sep='-')
end_2 = time.time()

print('result_1: ', end_1 - start_1) # 7.891654968261719e-05
print('result_2: ', end_2 - start_2) # 5.412101745605469e-05

**


What’s Your Name

이름(first name, last name)을 입력받고 아래 문장에 넣어서 출력하는 문제
Hello firstname lastname! You just delved into python.

  • INPUT
  • OUTPUT

Ross
Taylor

Hello Ross Taylor! You just delved into python.

format() 함수를 사용하는 간단한 문제

def print_full_name(a, b):
print('Hello {} {}! You just delved into python.'.format(a, b))

if **name** == '**main**':
first_name = input()
last_name = input()
print_full_name(first_name, last_name)

old한 방식으로 %를 사용하는 방법과 그냥 쉼표 , 로 구분하는 방법이 있지만
그냥 format() 함수를 사용하는게 자료형을 생각하지 않아도 되고 가독성도 좋다

def print_full_name(a, b):
print('(Hello %s %s! You just delved into python.') % (a, b)) # 쉼표로 구분할 때 띄워쓰기가 들어가는 것을 주의! + 기호로 띄워쓰기를 생략할 수 있다 # print("Hello",a,b+"! You just delved into python.")

if **name** == '**main**':
first_name = input()
last_name = input()
print_full_name(first_name, last_name)


(PYTHON) Day - 4 Basic Data Types

작성일 2020-01-22 In LANGUAGE 🚀 , PYTHON , HACKERRANK 댓글:

Reference

  • 문제 출처 - HackerRank
  • 파이썬 연습 - Practice - Python
  • 파이썬 기본 자료형 - w3schools.com

개인적인 생각과 상상으로 작성한 내용들이 포함되어 있습니다
문제를 풀고 Discussion Tab을 참고하며 코드 스타일을 개선하려고 노력하고자 합니다



HackerRank

Numpy 패키지와 관련된 내용은 수학적 내용들과 함께 다루기 위해 나중에 다시 정리하기로 했다.

HackerRank의 Python 연습문제들은 아래와 같은 카테고리로 분류 된다:

Subdomain

  • Introduction
  • Basic Data Types
  • Strings
  • Sets
  • Math
  • Itertools
  • Collections
  • Date and Time
  • Errors and Exceptions
  • Classes
  • Built-Ins
  • Python Functionals
  • Regex and Parsing
  • XML
  • Closures and Decorators
  • Numpy
  • Debugging


Basic Data Types

Problem

  • Lists
  • Tuples
  • List Comprehensions
  • Find the Runner-Up Score!
  • Nested Lists
  • Finding the percentage

개념 공부

파이썬의 기본 데이터 타입들에 대해 알아보자

  • Built-in Data Types
  • Getting the Data Type
  • Setting the Data Type
categories python code
Text Type: str
Numeric Types: int, float, complex
Sequence Types: list, tuple, range
Mapping Type: dict
Set Types: set, frozenset
Boolean Type: bool
Binary Types: bytes, bytearray, memoryview
  • type() 함수를 통해 객체의 데이터 타입을 알 수 있다
    x = 5
    print(type(x))
    # output
    # <class 'int'>
  • Python에서는 변수에 값을 할당하면 자동으로 데이터 타입이 결정된다.
Example Data type
x = “Hello World” str
x = 20 int
x = 20.5 float
x = 1j complex
x = [“apple”, “banana”, “cherry”] list
x = (“apple”, “banana”, “cherry”) tuple
x = range(6) range
x = {“name” : “John”, “age” : 36} dict
x = {“apple”, “banana”, “cherry”} set
x = frozenset({“apple”, “banana”, “cherry”}) frozenset
x = True bool
x = b”Hello” bytes
x = bytearray(5) bytearray
x = memoryview(bytes(5)) memoryview

Lists

  • INPUT
    입력받을 커맨드 개수 n을 입력받는다
    n 줄에 거쳐 커맨드를 입력받는다

    1 insert i e: Insert integer at position .
    2 print: Print the list.
    3 remove e: Delete the first occurrence of integer .
    4 append e: Insert integer at the end of the list.
    5 sort: Sort the list.
    6 pop: Pop the last element from the list.
    7 reverse: Reverse the list.

if-else문이나 switch문을 사용하면 되는 간단한 예제
하지만 python에는 switch문이 없기 때문에 dict 자료형으로 정리해서 적용하는 스타일로 코딩

if **name** == '**main**':
N = int(input())

my*list = []
command = {
'insert': my_list.insert,
'print': lambda : print(my_list),
'remove': my_list.remove,
'append': my_list.append,
'sort': my_list.sort,
'pop': my_list.pop,
'reverse': my_list.reverse
}
for * in range(N):
usr_c, \*args = input().split()

command[usr_c](*map(int, args))

@lordmauve 사용자의 말에 따르면,

  • ‘if/else문’ 은 많은 반복성과 유지/보수성이 떨어진다
  • ‘eval()’ 함수를 사용하는 것은 보안과 성능 면에서 모두 떨어진다
  • ‘dict 자료형’ 에 명령어들을 담아서 사용하는 것은 나쁘지 않으나,
    모든 메소드들을 정확히 입력해야하며 약간의 반복성을 띈다
  • 확장성을 위해 ‘getattr()’를 사용하는 것을 권장 (하는데 아직은 잘 이해가 안된다)
    (print() 메소드를 따로 설정하는 것을 봤을 때,
    아마 내장함수 list의 네임스페이스에 명령어들이 이미 포함되어 있어서 그런 것 같다)
mylist = []
for \_ in range(int(input())):
inst = input().split()
if inst[0] == 'print':
print(mylist)
else:
getattr(mylist, inst[0])(\*map(int, inst[1:]))

Tuples

  • tuple 보다는 hash() 함수에 대해 궁금해지는 문제…
  • tuple의 해시 값을 알아내는 문제
    if **name** == '**main**':
    n = int(input())
    integer_list = tuple(map(int, input().split()))

    print(hash(integer_list))

List Comprehensions

  • 직육면체의 크기(차원)를 나타내는 세 정수 (x, y, z)를 입력 받고 비교값 N을 입력받는다
    3차원 공간에서 해당 직육면체 범위 안의 값들 중 임의의 (i, j, k) 좌표를 가져왔을 때,
    i + j + k의 값이 N과 다른 모든 좌표값을 출력하는 문제
    (문제 설명부터 길다…)

    • INPUT
    • OUTPUT

    1
    1
    1
    2

    [[0, 0, 0], [0, 0, 1], [0, 1, 0], [1, 0, 0], [1, 1, 1]]

    • python의 comprehension은 반복적으로 생성가능한 객체를 생성하는 방법이다
      본 예제에서 사용되는 list 외에도 set, dict, generator expression에서 사용될 수 있다
        if **name** == '**main**':
      x, y, z, n = (int(input()) for \_ in range(4))

      print([[i, j, k] for i in range(0, x+1) for j in range(0, y+1) for k in range(0, z+1) if (i+j+k != n)])

Find the Runner-Up Score

  • Runner up이 2등을 말한다는걸 처음 알게 되었다
    그냥 단순히 1등, 2등, 3등을 first prize, second prize, third prize로만 알고 있었는데
    1등을 grand prize 혹은 winner라고 표현하듯이 2등도 runner up이라는 표현이 있었다
    (3등까지 표현하고 싶다면, 2등을 first runner up 3등을 second runner up 이라고 한다)

  • 몇 명의 주자가 있는지 n으로 입력 받고
    각 주자들의 성적(score)을 배열에 입력 받아 2등의 성적을 출력하는 문제

    • INPUT
    • OUTPUT

    5
    2 3 6 6 5

    5

    • 2등만 찾으면 되기 때문에 최대값(1등)을 제거하고 다시 최대값을 찾는 방식으로 접근했다
        if **name** == '**main**':
      n = int(input())
      arr = list(map(int, input().split()))

      winner_score = max(arr)
      runner_up_score = max([runner for runner in arr if runner != winner_score])
      print(runner_up_score)

Nested Lists

  • 물리 수업을 듣는 학생 수 N을 입력 받고, 학생 이름과 성적을 n번 반복하며 입력 받음
    성적이 밑에서 2번째인 학생을 출력하는 문제 (성적이 같은 학생은 알파벳 순으로 출력)
    (nested list를 사용해야 함)

    • INPUT
    • OUTPUT

    5
    Harry
    37.21
    Berry
    37.21
    Tina
    37.2
    Akriti
    41
    Harsh
    39

    Berry
    Harry

    • dict 자료형으로 접근하려고 했는데 key, value로 정렬하는 등 아직 익숙하지 못해서 에러가 많이 발생함
      2번째로 낮은 값을 찾는데 set() 집합을 이용하는 것이 좋다는 것을 복습함
      if **name** == '**main**':
      marksheet = []

      for _ in range(0,int(input())):
      marksheet.append([input(), float(input())])

      second_highest = sorted(list(set([marks for name, marks in marksheet])))[1]

      print('\n'.join([a for a,b in sorted(marksheet) if b == second_highest]))

Finding the percentage

  • 학생 수 N을 입력 받고,
    각 학생의 이름과 수학, 물리, 화학 성적을 입력 받는다
    마지막 줄에 입력받은 학생의 이름의 성적의 평균을 출력하는 문제
    (dict 자료형을 꼭 사용하라고 나와있다)
  • INPUT
  • OUTPUT

3
Krishna 67 68 69
Arjun 70 98 63
Malika 52 56 60
Malika

56.00

  • 출력을 소수점 2번째 자리까지 지정해 줘야 하는 것을 주의!
    {0:.2f}.format() 복습 복습
    if **name** == '**main**':
    n = int(input())
    student*marks = {}
    for * in range(n):
    name, \*line = input().split()
    scores = list(map(float, line))
    student_marks[name] = scores
    query_name = input()

    target = student_marks[query_name]

    sum = 0
    for num in target:
    sum += float(num)

    print("{0:.2f}".format(sum/len(target)))
1…141516…33
NUNU

NUNU

개인적으로 공부하면서 정리한 내용들을 블로그에 남기고 있습니다.
99 포스트
18 카테고리
53 태그
RSS
Creative Commons
© 2021 NUNU
Powered by Hexo v3.9.0
|
Theme – NexT.Mist v7.2.0