소프트웨어는 수학 계산을 주목적으로 처음에 만들어 졌지만, 지금은 다양한 분야에서 활용이 됩니다.
기본적으로 사람이 접할 수 있는 모든 정보를 컴퓨터에 저장할 때, String은 '정수/실수와 같은 숫자 외'에 글자들입니다.
이번에는 글자 혹은 글자들을 Python 언어에서 어떻게 다루는지에 대해서 배웁니다.
문자열(String)은 앞서 공부한 정수 혹은 실수와 다르게 글자(들)을 저장하는 변수 타입입니다.
실제 변수를 공부할 때 언급되었던 type()
함수를 수행하면, str
타입으로 결과값을 돌려주는 변수 타입입니다.
문자열에는 알파벳, 한글을 포함한 글자(들)과 숫자 그리고 다양한 기호들이 포함될 수 있습니다.
문자열을 일반적으로 '
'
혹은 "
"
의 인용 구문 기호로 앞뒤를 감싸는 것으로 표현합니다.
예를 들면 'Aristotle' 혹은 "Issac Newton"과 같은 방식입니다.
아래의 입력창에 다음의 작업들을 차례로 프로그래밍하면서, 결과 값을 print()
문법으로 출력해 보세요.
nameVar1
을 만들고, 'Issac'를 대입한 후, print()
문법으로 출력해 보세요. nameVar1
을 만들고, 'Newton'를 대입한 후, print()
문법으로 출력해 보세요.nameVar1 = 'Issac'
nameVar2 = 'Newton'
print(nameVar1)
print(nameVar2)
Issac Newton
정수/실수에 대해서 배울때에 다양한 Python 기본 연산자가 있었습니다.
문자열의 경우에도 Python은 이미 다양한 기능의 기본 연산자와 내장 함수를 지원합니다.
대표적인 사례는 다음과 같습니다.
len()
: 입력 파라메타로 전달받은 문자열의 길이를 결과값으로 돌려줌 (예제: len( 문자열
))
+
: 입력 파라메타로 전달받은 두개의 문자열을 하나의 문자열로 연결하여 결과값으로 돌려줌 (예제: 문자열1
+ 문자열2
)
*
: 입력 파라메타로 전달받은 문자열과 숫자를 기반으로, 문자열을 숫자만큼 반복한 형태의 문자열을 결과값으로 돌려줌 (예제: 문자열1
= 문자열2
*10)
int()
: 입력 파라메타로 전달받은 문자열이 숫자로만 이루어진 경우, 정수 타입으로 변환된 결과값으로 돌려줌 (예제: int( 문자열
))
float()
: 입력 파라메타로 전달받은 문자열이 숫자로만 이루어진 경우, 실수 타입으로 변환된 결과값으로 돌려줌 (예제: float( 문자열
))
아래의 입력창에 다음의 작업들을 차례로 프로그래밍하면서, 결과값은 print()
문법으로 출력해 보세요.
nameVar1
변수의 크기를 출력해 보세요.nameVar3
변수를 새롭게 정의하고, 여기에 nameVar1
와 nameVar2
의 이름을 +
연산자로 더한 결과값을 저장해 보세요.nameVar4
변수를 새롭게 정의하고, 여기에 123
의 문자열을 저장한후, int()
함수로 정수 결과값으로 변환해 보세요.nameVar5
변수를 새롭게 정의하고, 여기에 123.0
의 문자열을 저장한후, float()
함수로 실수 결과값으로 변환해 보세요.print(len(nameVar1))
nameVar3 = nameVar1+nameVar2
print(nameVar3)
nameVar4=123
print(int(nameVar4))
nameVar5=123.0
print(float(nameVar5))
5 IssacNewton 123 123.0
프로그래밍을 하다보면, 문자열을 의미하는 '
'
혹은 "
"
의 문자열 내부에서, 다시 문자열을 포함해야 하는 경우가 발생합니다.
단순하게 "Mr.Suhyun is 'Good'" 혹은 'Mr.Suhyun is "Good"'과 같은 경우가 있을수 있습니다.
위처럼 '
'
문자열 안에 "
"
문자열이 있거나, 혹은 반대의 경우는 전혀 문제가 없습니다.
이를 실제로 실험해 보기 위해서, 아래의 입력창에 다음의 코드를 입력하고 실행해 봅니다.
strTemp = "Mr.Suhyun is 'Good'"
print(strTemp)
strTemp = 'Mr.Suhyun is "Good"'
print(strTemp)
strTemp = "Mr.Suhyun is 'Good'"
print(strTemp)
strTemp = 'Mr.Suhyun is "Good"'
print(strTemp)
Mr.Suhyun is 'Good' Mr.Suhyun is "Good"
위의 예제처럼 Single 혹은 Double 인용구문 기호로 열고 닫힌 문자열 안에 마찬가지로 인용구문 기호로 열고 닫힌 문자열은 문제가 없지만,
만약 하나의 인용구문 기호가 문자열 안에 나타나는 경우는 문제가 발생할 수 있습니다.
즉, Mr.Suhyun's dog is excellent
과 같이 문자열이 아닌 경우에 사용하는 '
기호의 활용입니다.
이 문장을 다음과 같이 실행하면 Python은 구문(syntax) 에러를 발생 시킵니다.
strTemp = 'Mr.Suhyun's dog is excellent'
print(strTemp)
아래의 입력창의 위의 구문을 입력하고 실행하여, 실제 에러가 발생하는 것을 확인해 봅니다.
strTemp = 'Mr.Suhyun's dog is excellent'
print(strTemp)
File "<ipython-input-2-e3e1450a8d77>", line 1 strTemp = 'Mr.Suhyun's dog is excellent' ^ SyntaxError: invalid syntax
이런 경우는 어떻게 처리해야 할까? 다양한 방법이 가능한데,
첫번째 방법은, 전체 문장을 '
'
인용구문이 아닌 "
"
인용구문으로 감싸는 방법입니다.
# Approach.1
strTemp = "Mr.Suhyun's dog is excellent"
print(strTemp)
print(len(strTemp))
두번째 방법은, Escape sequence를 통한 해결입니다.
키보드의 Backslash(\
) 기호를 escape 글자라고 칭하며, \X
처럼 X
에 해당하는 위치에 글자 하나를 더해서 나타내는 표현을 escape sequence라고 합니다.
Escape sequence는 지금처럼 문자열 안에 특수 기호를 나타내거나, 혹은 눈으로 볼수 없는 특수기호를 프로그래밍 언어에서 표현하고자 하는 경우에 활용합니다.
이 방법을 사용하여 위의 에러를 제거하면 다음과 같은 형태로 프로그래밍 하면 됩니다.
# Approach.2
strTemp = 'Mr.Suhyun\'s dog is excellent'
print(strTemp)
print(len(strTemp))
여기서 주의할 사항은 Escape sequence인 \X
을 포함하는 문자열의 크기에 \
기호는 카운트 되지 않습니다.
실제로 위의 두가지 방법에서 출력하는 strTemp
문자열의 길이는 동일합니다.
아래의 입력창의 위의 두가지 방법에 의하여 개선한 프로그래밍 코드를 입력하고 실행하여, 실제 에러가 제거된 것을 확인해 봅니다.
strTemp = "Mr.Suhyun's dog is excellent"
print(strTemp)
print(len(strTemp))
Mr.Suhyun's dog is excellent 28
strTemp = 'Mr.Suhyun\'s dog is excellent'
print(strTemp)
print(len(strTemp))
Mr.Suhyun's dog is excellent 28
Escape sequence는 다양한 기호들에 대해서 존재합니다.
아래의 표는 대표적인 Python의 escape sequence들에 대해서 표로 표현한 것입니다.
Escape Sequence | Description |
---|---|
\' | Single quote |
\" | Double quote |
\ | Backslash |
\t | Tab |
\n | Newline |
\r | Carriage return |
print()
함수 자세히 이해하기¶print()
함수에 대해서 자세히 알기 위하여, 아래의 입력창에 help(print)
를 입력하고 실행해 봅니다.
help(print)
Help on built-in function print in module builtins: print(...) print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False) Prints the values to a stream, or to sys.stdout by default. Optional keyword arguments: file: a file-like object (stream); defaults to the current sys.stdout. sep: string inserted between values, default a space. end: string appended after the last value, default a newline. flush: whether to forcibly flush the stream.
print()
함수의 설명을 하나 하나 해석하면 다음과 같습니다.
Help on built-in function print in module builtins
: print()
함수가 내장 함수로서 이에 대한 설명을 기술한다는 의미임
print(...)
: 입력 파라메타를 여러개 줄수 있다는 의미이며, 입력 파라메타가 여러개인 경우는 ,
기호로 구분하면 됨
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
: 입력 파라메타(들)에 대한 자세한 설명으로, 아래와 같은 의미임
value, ...
: 실제 출력을 하고자 하는 값 자체 혹은 값(들)을 가지고 있는 변수(들)를 의미하며, ,
기호로 구분하여 여러개를 줄수 있음sep=' '
: 입력 파라메타로 전달받은 값(혹은 변수) 들 사이에 넣을 기호로서, 초기설정 값은 '공란 한칸(space)' 임end='\n'
: 입력 파라메타들을 모두 출력한 마지막 부분에 삽입할 기호로서, 초기설정 값은 '한 줄 바꾸기(new line)' 임file
과 flush
는 이후 관련 내용의 수업에서 설명함실제 동작을 확인해 보기 위하여, 다음의 코드를 아래의 입력창에 한줄씩 실행해 봅니다.
print(1, 2, 3)
print(1, '2', "3")
print(1, '2', "3", sep=" : ", end=" {endl} \"")
print(1, 2, 3)
print(1, '2', "3")
print(1, '2', "3", sep=" : ", end=" {endl} \"")
1 2 3 1 2 3 1 : 2 : 3 {endl} "
input()
함수 이해하기¶input()
함수에 대해서 알기 위하여, 아래의 입력창에 help(input)
를 입력하고 실행해 봅니다.
help(input)
Help on method raw_input in module ipykernel.kernelbase: raw_input(prompt='') method of ipykernel.ipkernel.IPythonKernel instance Forward raw_input to frontends Raises ------ StdinNotImplentedError if active frontend doesn't support stdin.
input()
함수는 Python 언어의 내장 함수로서, 사용자에게서 키보드를 통하여 값을 입력 받는 기능으로 사용합니다.
Python 언어 내부적으로는 raw_input()
로 불리기도 하며, 입력 파라메타를 줄수도 안줄수도 있습니다.
input()
함수는 결과값(return하는 값)으로 문자열을 돌려주기에, 필요한 경우에는 타입의 형변환이 필요합니다.
일반적인 예제로서, 사용자로부터 두개의 정수 a와 b를 입력 받아, 이의 합을 출력하는 간단한 프로그램을 아래와 같이 작성할 수 있습니다.
print("Enter 'a' as integer number: ")
a = int(input())
print("Enter 'b' as integer number: ")
b = int(input())
print("a + b = ", a + b)
아래의 입력창의 위의 예제 코드를 실제로 입력하고 실행해서 결과를 확인해 봅니다.
print("Enter 'a' as integer number: ")
a = int(input())
print("Enter 'b' as integer number: ")
b = int(input())
print("a + b = ", a + b)
Enter 'a' as integer number: 3 Enter 'b' as integer number: 4 a + b = 7
앞서의 input()
함수에 대한 설명에서 입력 파라메타를 받을수 있는 것을 확인하였습니다.
이는 input()
함수의 입력 파라메타인 prompt
값을 지정해 주는 것으로서, 입력을 받을때 보여줄 글자 혹은 문자열을 input()
함수 실행시 지정하는 것입니다.
이를 이용하여, 앞에서 작성한 예제를 다음과 같이 수정할 수 있습니다.
a = int(input(prompt="Enter 'a' as integer number: "))
b = int(input(prompt="Enter 'b' as integer number: "))
print("a + b = ", a + b)
아래의 입력창의 위의 예제 코드를 실제로 입력하고 실행해서 결과를 확인해 봅니다.
a = int(input(prompt="Enter 'a' as integer number: "))
b = int(input(prompt="Enter 'b' as integer number: "))
print("a + b = ", a + b)
Enter 'a' as integer number: 5 Enter 'b' as integer number: 6 a + b = 11
프로그래밍을 하는데 있어 때로는 문장의 특정 부분만 바꿔서 반복적으로 출력해야하는 경우가 있습니다. 이런경우 사용하는 함수가 format이며 다음과 같이 사용할수 있습니다.
print("Suhyun is 26 years old")
print("Suhyun is {} years old".format('26'))
Suhyun is 26 years old Suhyun is 26 years old
다음과 같이 원하는 위치를 중괄호{}로 치환하고 그 내용을 뒤에 적을수 있습니다.
input_name = input(prompt="당신의 이름을 입력하세요 : ")
input_age = input(prompt="당신의 나이를 입력하세요 : ")
print("당신의 이름은 {}이며, 당신은 {}살 입니다.".format(input_name,input_age))
당신의 이름을 입력하세요 : suhyun 당신의 나이를 입력하세요 : 26 당신의 이름은 suhyun이며, 당신은 26살 입니다.
한 스트링에서 다양한 부분을 치환해야한다면 다음과같이 필요한 만큼의 중괄호를 넣어주고 뒤에 갯수만큼 넣으면 됩니다.
Python은 하나의 문자열 안에 있는 글자와 글자들을 처리하기 위하여 다양한 방법을 제공하며, 문자열 슬라이싱(Slicing String)은 이 중 하나입니다.
그러면 다음과 같이 변수 a
에 문자열 You only live once.
가 저장되어 있다고 가정해 봅시다.
a = "You only live once."
변수 a
를 저장하는 컴퓨터 메모리 공간을 들여다 본다면, 다음의 그림처럼 순서대로 글자들이 저장되어 있는 것을 볼수 있습니다.
문자열 안의 글자 혹은 글자(들)을 접근하기 위해서 우리는 변수명인 a
의 뒤에 [
]
기호를 사용합니다.
a[n]
은 a
문자열의 첫번째 글자를 0
번째 글자라고 부를때, n
번째에 해당하는 글자를 의미합니다.
위의 예제에서 a[2]
는 글자 u
가 되는 것이지요.
a[s:e]
의 의미는 a
문자열의 s
번째에 해당하는 글자를 시작으로 해서, e-1
번째에 해당하는 글자까지를 포함하는 새로운 문자열을 의미합니다.
위의 예제에서 a[9:12]
는 문자열 liv
가 되는 것이지요.
이 경우, s
혹은 e
만 숫자를 기술하는 것도 가능합니다.
a[s:]
로 되면, s
번째에 해당하는 글자를 시작으로 해서, 문자열의 끝 글자까지의 글자들을 포함하는 새로운 문자열을 의미합니다.
위의 예제에서 a[10:]
는 문자열 ive once.
가 되는 것이지요.
a[:e]
로 되면, e-1
번째에 해당하는 글자를 끝으로 해서, 문자열의 첫 글자부터의 글자들을 포함하는 새로운 문자열을 의미합니다.
위의 예제에서 a[:7]
는 문자열 You onl
이 되는 것이지요.
익숙하지 않은 표현 일수 있지만, 아래의 그림과 같이 문자열 a
의 마지막 글자의 위치를 -1
로 지정하여, 첨자를 주는 것도 가능합니다.
예를 들어, a[-1]
은 .
, a[12:-2]
는 e onc
와 같은 방식으로 처리하는 것입니다.
아래의 입력창에 직접 a
문자열을 생성하고, 문자열 슬라이싱 기법을 이용해서, 원하는 글자 혹은 글자들을 읽고 써보기 바랍니다.
그리고 새로운 문자열 b
를 문자열 "I"와 a
문자열의 "only live once."를 활용하여 만들어 보기 바랍니다.
a = "You only live once."
print(a[:3])
You
문자열은 한번 값을 대입하면 수정이 불가능합니다..
따라서 특정 문자열의 값을 바꾸고자 하는 등의 목적이 있을때에는, 반드시 새로운 문자열을 만들어서 기존 문자열의 일부 값을 취하는 형태를 해야 합니다.
사용자로부터 5글자의 문자열을 입력받아서 앞뒤를 뒤집는 프로그램을 만들어 봅니다.
즉, 사용자가 "hello"라는 5글자를 입력하면, "olleh"와 같이 앞뒤가 바뀐 문자열을 화면에 출력합니다.
이를 위해서, reverseString()
함수를 작성하며, 입력 파라메타는 사용자가 입력한 문자열을 받고, 결과값으로 앞뒤가 바뀐 문자열을 돌려줍니다.
아래 입력창에 reverseString()
함수와 함께 이 프로그램을 작성하고 실행해 보세요.
def reverseString(input_string):
return input_string[::-1]
[자가진단] 본인이 만든 LAB 프로그램이 제대로 동작하는지 확인합니다.
아래의 입력창을 수정하지 않고, 그대로 실행해서, 아래와 동일하게 나온다면 제대로 작성한 것입니다.
만약 그렇지 않다면, reverseString()
함수를 수정하여 에러가 없도록 다시 작성합니다.
assert reverseString("hello") == "olleh"
assert reverseString("world") == "dlrow"
assert reverseString("12345") == "54321"
사용자로부터 이름과 나이를 입력 받아서, 10년후와 2100년에서의 나이를 출력하는 프로그램을 만들어 봅니다.
아래의 예시처럼 사용자 이름이 Jane
이고 현재 20
살인 경우에 결과처럼 출력하는 것입니다.
이를 위해서 calcAge()
함수를 만들고, 입력 파라메타로 1) 현재의 나이와 함께, 2) 현재년도, 그리고 3) 나이를 계산하고 싶은 미래년도를 전달합니다.
calcAge()
함수는 반드시 앞서의 입력 파라메타를 순서대로 받도록 합니다.
calcAge(
) 함수는 미래년도와 현재년도의 차를 토대로, 미래년도에서의 나이를 계산하여 결과값으로 돌려줍니다.
Hello, what’s your name? Jane
How old are you? 20
Years of this year (ex: 2019) ? 2019
Jane is 20 years old.
Jane becomes 30 years old after 10 years.
Jane becomes 98 years old in 2098.
아래 입력창에 calcAge()
함수와 함께 이 프로그램을 작성하고 실행해 보세요.
def calcAge(age,now,after):
return age+(after-now)
[자가진단] 본인이 만든 LAB 프로그램이 제대로 동작하는지 확인합니다.
아래의 입력창을 수정하지 않고, 그대로 실행해서, 아래와 동일하게 나온다면 제대로 작성한 것입니다.
만약 그렇지 않다면, calcAge()
함수를 수정하여 에러가 없도록 다시 작성합니다.
assert calcAge(20, 2019, 2029) == 30
assert calcAge(20, 2019, 2097) == 98
assert calcAge(22, 2019, 2029) == 32
assert calcAge(22, 2019, 2097) == 100
사용자로부터 주민등록번호 앞자리를 입력 받아서, "당신의 생일은 OOOO년 OO월 OO일 입니다"라고 출력하는 프로그램을 만들어 봅니다.
이를 위해서, makeBirthdayString()
함수를 개발합니다.
조건문을 배우지 않은 관계로, 모든 사용자는 1900년대에 태어난 것으로 가정합니다.
이 함수는 입력 파라메타로 사용자가 입력한 주민등록번호를 받아서, 출력값으로 "당신의 생일은 OOOO년 OO월 OO일 입니다"과 동일한 문자열을 돌려줍니다.
자가진단을 위하여 아래 예제의 모든 입출력 글자가 정확하게 동일하도록 만들어 보십시오.
주민등록번호 앞자리 6자리를 입력해 주세요: 900216
당신의 생일은 1990년 2월 16일 입니다
아래 입력창에 makeBirthdayString()
함수와 함께 이 프로그램을 작성하고 실행해 보세요.
def makeBirthdayString(value):
year = "19"+value[:2]
month = str(int(value[2:4]))
day = value[4:]
return "당신의 생일은 "+year+"년 " +month+"월 " +day+"일 입니다"
value = input(prompt="주민등록번호 앞자리 6자리를 입력해 주세요: ")
print(makeBirthdayString(value))
주민등록번호 앞자리 6자리를 입력해 주세요: 900216 당신의 생일은 1990년 2월 16일 입니다
[자가진단] 본인이 만든 LAB 프로그램이 제대로 동작하는지 확인합니다.
아래의 입력창을 수정하지 않고, 그대로 실행해서, 아래와 동일하게 나온다면 제대로 작성한 것입니다.
만약 그렇지 않다면, makeBirthdayString()
함수를 수정하여 에러가 없도록 다시 작성합니다.
assert makeBirthdayString("900216") == "당신의 생일은 1990년 2월 16일 입니다"
assert makeBirthdayString("720222") == "당신의 생일은 1972년 2월 22일 입니다"
당신의 생일은 1990년 2월 16일 입니다
마트에서 파는 물품의 종류와 가격이 다음과 같이 주어질때,
사용자에게 위에서 아래의 품목에 대해서 몇개를 구매할 건지 차례대로 물어본 후, 총액을 계산하여 알려주는 프로그램을 만들어 봅니다.
이를 위하여, calcProductSum() 함수를 개발하며, 해당 함수는 상품별 주문 갯수를 표에 적힌 순서대로 입력 받아서, 출력값으로 총액을 돌려줍니다.
품목 | 가격 |
---|---|
사과 | 3000 |
바나나 | 2500 |
멜론 | 10000 |
복숭아 | 5000 |
포도 | 4000 |
아래 입력창에 calcProductSum()
함수와 함께 이 프로그램을 작성하고 실행해 보세요.
def calcProductSum(apple,banana,melon,peach,graph):
return 3000*apple + 2500*banana+10000*melon+5000*peach + 4000*graph
[자가진단] 본인이 만든 LAB 프로그램이 제대로 동작하는지 확인합니다.
아래의 입력창을 수정하지 않고, 그대로 실행해서, 아래와 동일하게 나온다면 제대로 작성한 것입니다.
만약 그렇지 않다면, calcProductSum()
함수를 수정하여 에러가 없도록 다시 작성합니다.
assert calcProductSum(2,2,3,1,4) == 62000
assert calcProductSum(1,2,3,4,5) == 78000
Step_07_Conditional_Statement (0) | 2021.05.20 |
---|---|
Step_06_Boolean (0) | 2021.05.18 |
Step_04_Functions_Part_2 (0) | 2021.05.13 |
Step_03_Functions_Part_1 (0) | 2021.05.10 |
Step_02_Variables (0) | 2021.05.07 |
댓글 영역