리스트와 리스트 메소드



- 리스트

 앞에서 공부하면서 사용했던 리스트에 대해 알아보겠습니다. 리스트는 문자형처럼 시퀀스 자료형이지만 문자열과는 다르게 변경이 가능한 자료형입니다. 인덱싱, 슬라이싱, 연결, 반복, 멤버십 테스트 연산이 가능합니다.

 다음은 리스트의 추가, 삭제 예시입니다.

----------------------------------------------------------------------------------------

l1=range(10) # 0부터 9까지의 리스트 생성
print l1

del l1[2] # 2번째 인덱스 삭제
print l1

Sun,Mon,Tue,Wed,Thu,Fri,Sat=range(7) # 여러 변수에 한번에 리스트 생성 가능
print Sun,Mon,Tue,Wed,Thu,Fri,Sat
----------------------------------------------------------------------------------------
(실행 결과)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 3, 4, 5, 6, 7, 8, 9]
0 1 2 3 4 5 6
----------------------------------------------------------------------------------------

- 중첩 리스트
 중첩 리스트는 리스트를 인자로 가지는 리스트를 말합니다. 다음과 같이 사용합니다.
----------------------------------------------------------------------------------------
s=[2,3,4]
t=[1,s,5] # 리스트 s를 인자로 사용
print t
print t[1][1] # t리스트의 1번째 인덱스의 1번째 인덱스
----------------------------------------------------------------------------------------
(실행 결과)
[1, [2, 3, 4], 5]
3
----------------------------------------------------------------------------------------

- 리스트가 지원하는 메소드

 리스트가 지원하는 메소드는 아래와 같습니다. java와 메소드 이름이 비슷한 것 같습니다. 

1. append() : 리스트 마지막에 원소를 추가
문자열, 튜플, 사전도 추가가능
2. insert(위치,값) : 해당하는 인덱스의 위치에 원하는 값 추가
3. index(위치) : 해당하는 원소의 인덱스가 몇인지 반환
4. count(값) : 해당하는 값이 몇개가 존재하는지 반환
5. reverse() : 리스트의 순서를 뒤바꿔 줌(값 변경)
6. sort() : 리스트의 값을 정렬해서 값을 변경
7. remove(값) : 해당하는 값을 삭제하는데, 값이 여러개일 경우 첫 번째 값 삭제
8. extend(값) : 기존의 리스트에 값 자체를 추가(병합)

----------------------------------------------------------------------------------------
# append()
ap=[1,2,3,4]
ap.append(10) # 가장 뒤에 10 추가
print ap
print '*'*50

# insert()
ins=[1,2,4,5]
ins.insert(2,3) # 2번째 자리에 3 추가
print ins
print '*'*50

# index()
ind=[1,2,3,4,5,6]
print ind.index(3) # 3에 해당하는 인덱스 값 
print '*'*50

# count()
co=[1,2,3,2,2,2,7]
print co.count(2) # 2가 몇개인지
print '*'*50

# reverse()
re=[1,2,3,4]
re.reverse() # 순서를 거꾸로
print re
print '*'*50

# sort()
so=[11,-3,4,-50]
so.sort() # 정렬
print so
print '*'*50

# remove()
rem=[11,-3,4,-50,-3]
rem.remove(-3) # -3을 제거
print rem
print '*'*50

# extend()
s=[1,2,3,4]
t=[5,6,7]
s.extend(t) # s리스트에 t리스트를 추가(병합)
print s
# extend()와 append() 비교
s2=s.append(t) # append는 리스트 자체를 추가
print s2

----------------------------------------------------------------------------------------
(실행 결과)
[1, 2, 3, 4, 10]
**************************************************
[1, 2, 3, 4, 5]
**************************************************
2
**************************************************
4
**************************************************
[4, 3, 2, 1]
**************************************************
[-50, -3, 4, 11]
**************************************************
[11, 4, -50, -3]
**************************************************
[1, 2, 3, 4, 5, 6, 7]
----------------------------------------------------------------------------------------

- 리스트를 스택, 큐로 이용

 스택은 후입선출 구조, 큐는 선입선출 구조를 가집니다. 리스트의 메소드를 이용해서 스택과 큐처럼 사용할 수 있습니다. append()메소드와 pop()메소드를 이용합니다. pop()메소드는 기본적으로 마지막 원소를 꺼내고, 인자안에 인덱스를 적어주면 해당하는 인덱스의 값을 꺼냅니다.
----------------------------------------------------------------------------------------
# stack
s=[10,20,30,40,50]
s.append(60)
print s
print s.pop()
print s
print s.pop()
print s
print '*'*50

# queue
q=[10,20,30,40,50]
q.append(60)
print q
print q.pop(0)
print q
print q.pop(0)
print q
----------------------------------------------------------------------------------------
(실행 결과)
[10, 20, 30, 40, 50, 60]
60 # 가장 마지막 원소인 60을 꺼냄
[10, 20, 30, 40, 50]
50 # 가장 마지막 원소인 50을 꺼냄
[10, 20, 30, 40]
**************************************************
[10, 20, 30, 40, 50, 60]
10 # 가장 앞의 원소인 10을 꺼냄
[20, 30, 40, 50, 60]
20 #가장 앞의 원소인 20을 꺼냄
[30, 40, 50, 60]
----------------------------------------------------------------------------------------

출처 한국기술교육대학교 온라인평생교육원 파이썬프로그래밍



문자열 메소드와 포멧팅


- 문자열 메소드

 메소드란 기존의 프로그래밍 언어에서의 함수와 대응되는 개념으로, 객체의 상태 및 속성 변경과 같이 객체에 대해 수행할 수 있는 작업을 말합니다. 문자열 관련 메소드를 알아보겠습니다.


- 대·소문자 관련 메소드

1. upper() : 해당 문자들을 모두 대문자로 변환

2. lower() : 해당 문자들을 모두 소문자로 변환

3. swapcase() : 해당 문자들을 대문자는 소문자, 소문자는 대문자로 변환

4. capitalize() : 첫 문자만 대문자로 변환

5. tilte() : 문장의 각 단어의 첫문자를 대문자로 변환

----------------------------------------------------------------------------------------

a='i lovE socceR'
print a.upper()
print a.lower()
print a.swapcase()
print a.capitalize()
print a.title()
print a
----------------------------------------------------------------------------------------
(실행 결과)

I LOVE SOCCER # 모두 대문자로 변환됨

i love soccer     # 모두 소문자로 변환됨

I LOVe SOCCEr  # 대·소문자가 반전됨

I love soccer     # 첫문자 i만 대문자로 변환하고 나머지는 소문자 변환

I Love Soccer    # 각 단어의 첫문자는 대문자로 변환하고, 나머지는 소문자로 변환

i lovE socceR    # 문자열은 변경되지 않으므로 처음 a가 출력됨

----------------------------------------------------------------------------------------


- 문자열 관련 메소드

1. count() : 몇번 등장하는 지 반환
2. find() : 찾은 문자의 첫인덱스가 몇번째인지 반환
  찾는 문자가 없는 경우 -1 반환
3. startswith()/endswith() : 해당 문자로 시작하는 지 / 끝나는 지 확인해서 True/False 반환

4. strip() : 좌우 공백을 제거해서 반환

   - rstrip()/lstrip() : 각각 오른쪽/왼쪽 공백을 제거하고 반환

   - ()안에 문자를 넣으면 해당문자도 제거하며, 탭문자(\t)나 널문자(\n)도 공백으로 인정해서 제거

5. replace(a,b) : 첫번째 인자 a를 두번째 인자인 b로 대체

6. split() : 공백을 기준으로 분리해서 리스트로 반환하며, 기준을 넣으면 기준으로 분리

7. splitlines() : 라인 기준으로 분리하여 리스트로 반환

8. join() : 리스트의 인자들을 연결

9. zfill() : 인자만큼의 길이로 만들어지고 빈 공간을 0으로 채워서 반환


----------------------------------------------------------------------------------------

# count

a2="blue red sky blue red"

print a2.count('blue') # blue 문자의 수를 반환

print '*'*50


# find()

print a2.find("red") # red가 몇번째 인덱스에 존재하는지

print a2.find('red',6) # 6번째 인덱스 이후의 red가 몇번째 인덱스에 존재하는 지

print '*'*50


# stratswith/endswith

print a2.startswith("blue") # blue라는 문자로 시작하는지

print a2.endswith("blue") #  blue라는 문자로 끝나는지

print '*'*50


# strip()

b="  \t 보고싶다.    "

print b.strip() # 좌·우 공백 제거(문자와 문자 사이 공백은 제거하지 않음)

print b.rstrip() # 오른쪽 공백 제거

print b.lstrip() # 왼쪽  공백 제거

print '*'*50


# replace()

b=b.replace('\t','너무') # b의 탭문자를 너무로 변환하고 재할당해서

print b.replace("다.","은데 볼 수가 없다.") # 다시한번 문자를 변환해서 출력

print '*'*50


# split()

c="a b c"

print c.split() # 공백 기준으로 분리해서 리스트로 반환

c2="I \n Love \n You"

print c2.splitlines() # 개행 기준으로 분리해서 리스트로 반환

print '*'*50


# join()

l1=["red","blue","green"]

print ('-').join(l1) # 리스트의 원소들을 '-'문자로 연결

print '*'*50


# zfill()

e='abc'

print e.zfill(5)

----------------------------------------------------------------------------------------

(실행 결과)

2

**************************************************

5

18

**************************************************

True

False

**************************************************

보고싶다.

  보고싶다.

보고싶다.    

**************************************************

  너무 보고싶은데 볼 수가 없다.    

**************************************************

['a', 'b', 'c']

['I ', ' Love ', ' You']

**************************************************

red-blue-green

**************************************************

00abc

----------------------------------------------------------------------------------------


- 정렬

1. center() : 문자열을 해당하는 만큼의 공간을 확보하고 가운데 정렬

2. rjust()/ljust() : 문자열을 해당하는 만큼의 공간을 확보하고 오른쪽/왼쪽 정렬

----------------------------------------------------------------------------------------

d='warten'

print d.center(50)

print d.rjust(50)

print d.ljust(50)

----------------------------------------------------------------------------------------

(실행 결과)

                      warten                      

                                            warten

warten                                            

----------------------------------------------------------------------------------------

- 확인하는 메소드
 메소드의 이름을 보면 어느정도 추측이 가능한 메소드 들입니다. True/False를 반환합니다.
1. isdigit() : 숫자로만 쓰였는지 확인
2. isalpha() : 영문자로만 쓰였는지 확인
3. isalnum() : 영문자 또는 숫자로 쓰였는지 확인
4. islower() : 모두 소문자로만 쓰였는지 확인
5. isupper() : 모두 대문자로만 쓰였는지 확인
6. isspace() "모두 공백 문자인지 확인
7. istitle() : 각 첫단어들이 대문자인지 확인



- 문자열 포멧팅

 문자열 포멧팅은 C언어에서 %s,%c등을 사용하는것과 유사하게 사용합니다. 임의의 객체를 문자열로 변환하기위해 %를 사용합니다. 튜플과 사전을 이용하며, 다음과 같은 형태로 사용 합니다.
----------------------------------------------------------------------------------------
# -*- coding: utf-8 -*-

letter = u'''
안녕하세요 %s님
오늘 너무나도 보고싶은 날이네요
기다리고 있을게요
'''

name=u'홍길동'
print letter % name
print '*' * 50
    
names=(u'철수',u'영희') # 튜플을 이용
for name in names:
    print letter % name
    print '*' * 50

----------------------------------------------------------------------------------------
(실행 결과)
안녕하세요 홍길동님
오늘 너무나도 보고싶은 날이네요
기다리고 있을게요

**************************************************

안녕하세요 철수님
오늘 너무나도 보고싶은 날이네요
기다리고 있을게요

**************************************************

안녕하세요 영희님
오늘 너무나도 보고싶은 날이네요
기다리고 있을게요

**************************************************
----------------------------------------------------------------------------------------

 사전을 이용하는 방법도 동일하고, 사전형태는 순서가 바껴도 올바르게 상관이 없습니다.
----------------------------------------------------------------------------------------
print '%(이름)s -- %(나이)s' %{'이름':'홍길동','나이':10}
print '%(이름)s -- %(나이)s' %{'나이':50,'이름':'철수'}
----------------------------------------------------------------------------------------
(실행 결과)
홍길동 -- 10
철수 -- 50
----------------------------------------------------------------------------------------

출처 한국기술교육대학교 온라인평생교육원 파이썬프로그래밍




'언어 > Python' 카테고리의 다른 글

[파이썬] 리스트 활용  (4) 2017.02.07
[파이썬] 리스트와 리스트 메소드  (0) 2017.02.05
[파이썬] 문자열 정의 및 기초연산  (0) 2017.02.01
[파이썬] 제어문과 함수  (0) 2017.01.25
[파이썬] 각종 연산자  (0) 2017.01.21

문자열 정의 및 기초연산



- 시퀀스 자료형과 기초연산

 시퀀스 자료형에는 앞에서 공부한 문자열, 리스트, 튜플이 있고, 시퀀스 자료형이 아닌 자료형은 사전이 있습니다. 시퀀스 자료형은 공통적인 연산을 수행하는데 아래와 같은 연산이 있습니다. 앞에서 공부한 내용들이므로, 자세한 설명은 적지 않았습니다.

----------------------------------------------------------------------------------------

1. 인덱싱 
li=[1,2,3,4]
print li[0]
2. 슬라이싱
s='abcd'
print s[0:2]
3. 확장 슬라이싱
s2='abcdefg'
print s2[::] # 전체 출력
print s2[::2] # step이 2이므로, aceg 출력
4. 연결하기
s1='abc'
s2='def'
print s1+s2
5. 반복하기
s1='blue'
print s1*3
6. 멤버십 테스트
t=(1,2,3,4)
pirnt 3 in t
7. 길이정보
- len()함수 이용
s='asdf'
print len(s)
8. for-in문
color=["red","green","blue"]
for x in color:
    print x

----------------------------------------------------------------------------------------


- 문자열 정의

  문자열의 정의는 단일 따옴표('')와 이중따옴표("")를 이용해서 정의하는데, 3개를 동시에 사용할 때에는 자동으로 개행이 됩니다. 제가 좋아하는 노래의 가사를 단일따옴표와 이중따옴표를 이용해 정의해서 출력 해봤습니다.

----------------------------------------------------------------------------------------

# -*- coding: utf-8 -*-


s1=""" 이별밖에 할 수 있는게 없는 우리가 참 슬프지만

돌아선 네 맘을 돌리기엔 이미 늦은걸 알아서

"""

s2=''' 이별밖에 겨우 이것 밖에 할 수 없는 내가 너무 밉지만

함께여서 아픈 우리에겐 남은건 어쩔 수 없는 이별밖에'''

print s1

print s2

----------------------------------------------------------------------------------------

(실행결과)

 이별밖에 할 수 있는게 없는 우리가 참 슬프지만

돌아선 네 맘을 돌리기엔 이미 늦은걸 알아서


 이별밖에 겨우 이것 밖에 할 수 없는 내가 너무 밉지만

함께여서 아픈 우리에겐 남은건 어쩔 수 없는 이별밖에

----------------------------------------------------------------------------------------


- 이스케이프(Escape)문자


  이스케이프 문자는 특수한 문자를 사용하기 위해 사용하는 문자로 아래와 같은 문자들이 있습니다. 자주 사용하는 문자들만 예시를 들었습니다.

----------------------------------------------------------------------------------------

# 1. \ '를 출력하기위한 문자

s1='don\'t warry'

print s1

# 2.\t : 탭 문자

s2='abc\tdef\tghi'

print s2

# 3.\n : 개행

s3='waiting for\nyou'

print s3

----------------------------------------------------------------------------------------
(실행 결과)
don't warry # ' 문자가 출력됨
abc def ghi
waiting for
you
----------------------------------------------------------------------------------------

- 문자열 변경


 앞에서 공부할 때 문자열은 변경이 안된다고 공부했습니다. 그럼 문자열은 어떻게 변경할까요? 문자열의 변경은 문자열 자체를 변경하는게 아니라, 새로운 문자열을 생성해 재 할당 하는 방법을 이용합니다. 아래 코드는 ABDEF문자열을 ABCDEF로 변경하기 위한 코드입니다.
----------------------------------------------------------------------------------------
s='ABDEF'
print 'before s : '+s
s=s[0:2]+'C'+s[2:]
print 'after s  : '+s
----------------------------------------------------------------------------------------
before s : ABDEF
after s  : ABCDEF
----------------------------------------------------------------------------------------

- 유니코드


 다른 언어들과 마찬가지로 파이썬에서도 역시 유니코드를 지원합니다. 사용하려는 문자열 앞에 u라는 문자를 붙여주면 타입이 유니코드가 됩니다. 같은 안녕하세요 라는 문자열을 입력했을 때, 유니코드를 사용하면 한글의 길이도 정확히 출력하는 걸 확인할 수 있습니다.
----------------------------------------------------------------------------------------
h1="안녕하세요"
h2=u'안녕하세요'
print type(h1),len(h1)
print type(h2),len(h2)
----------------------------------------------------------------------------------------
(실행 결과)
<type 'str'> 15
<type 'unicode'> 5
----------------------------------------------------------------------------------------

 마지막으로 보통은 u를 붙여서 사용하지만, uincode()라는 내장 함수를 이용해서 사용할 수도 있습니다.
----------------------------------------------------------------------------------------
# unicode('문자열','인코딩 방식)
h=unicode('보고싶다.','utf-8')
----------------------------------------------------------------------------------------
(실행 결과)
보고싶다. <type 'unicode'>
----------------------------------------------------------------------------------------

출처 한국기술교육대학교 온라인평생교육원 파이썬프로그래밍



제어문



 파이썬에서 들여쓰기를 문법적으로 강제해서 들여쓰기를 의무적으로 하도록 합니다. 들여쓰기를 할때에는 탭과 공백을 섞어서 쓰지 않고, 탭만 이용합니다. 가장 바깥족의 코드는 반드시 1열에 시작해야합니다. 들여쓰기를 올바르게 하지않으면 syntax에러가 발생합니다.

----------------------------------------------------------------------------------------

a=1      # 가능
b=1 # 불가능

----------------------------------------------------------------------------------------


 파이썬에서의 제어문은 if문, for문, while문이 있습니다.

- if문


  if문의 사용 형태는 다음과 같습니다. elif와 else는 생략이 가능합니다. elif는 다른언어에서 else if와 같은 역할로, if가 만족하지않으면 elif 조건식들을 확인하고, if와 elif 전부 만족하지않는다면, else문을 수행합니다.

----------------------------------------------------------------------------------------

if 조건식 1:

statments

(elif 조건식n:) # if문이 만족하지 않을 경우 elif 수행(여러개 가능)

(else:) # if와 elif 모두 만족하지않을 경우 else 수행

----------------------------------------------------------------------------------------

 if문의 사용은 다음과 같습니다.
----------------------------------------------------------------------------------------
a=7
if a<5:
    print "small"
elif 5<a<10:
    print "regular"
else : 
    print "large"

----------------------------------------------------------------------------------------

(실행 결과)

regular

----------------------------------------------------------------------------------------


- for문


  for문은 타겟과 컨테이너 객체를 지정해서 반복을 할 때 사용하는 제어문으로, 아래와 같은 형태로 사용합니다. 컨테이너 객체에서 원소를 꺼내서 타겟에 삽입하는 형태입니다.

----------------------------------------------------------------------------------------

for <타겟> in <컨테이너 객체>:
statements
else:
statements
----------------------------------------------------------------------------------------

 for문의 사용은 다음과 같습니다.
----------------------------------------------------------------------------------------
color=["red",'blue','yellow']
for x in color:
    print len(x),x # 타겟의 글자수와 타겟 출력
----------------------------------------------------------------------------------------
(실행 결과)
3 red
4 blue
6 yellow
----------------------------------------------------------------------------------------

 이번에는 enumerate()라는 내장 함수에 대해 알아보겠습니다. enumerate() 내장 함수는 컨테이너 객체가 지닌 각 요소값 뿐만아니라, 인덱스 값도 함께 반환합니다.
----------------------------------------------------------------------------------------
color=["red",'blue','yellow']
for i, j in enumerate(color): # i=인덱스 저장, j=실제 값 저장
    print i,j
----------------------------------------------------------------------------------------
(실행 결과)
0 red
1 blue
2 yellow
----------------------------------------------------------------------------------------

 for문에서는 break와 continue가 있습니다. break는 현재 수행중인 반복을 중지하는 역할을 수행하고, continue는 continue이후 부분은 수행하지 않고 반복을 수행하도록 합니다. 위에서의 else문은 break 없이 정상적으로 반복이 모두 수행되면 else 블록이 수행됩니다. 사용예는 다음과 같습니다.
----------------------------------------------------------------------------------------
# break
for x in range(10):
    if x>3: # x 가 3보다 커지면 반복 종료
        break
    print x

print 'stop'
----------------------------------------------------------------------------------------
(실행 결과)
0
1
2
3
stop
----------------------------------------------------------------------------------------
# continue
for y in range(10):
    if y<8: # y가 8보다 작을경우 continue 아래 코드는 수행하지 않고 반복문을 수행
        continue
    print y

print "stop"
----------------------------------------------------------------------------------------
(실행 결과)
8
9
stop
----------------------------------------------------------------------------------------

- while문
  
 while문은 for문과 다르게 타겟과 컨테이너 객체를 사용하는게 아니라, 조건이 만족하면 while블록 내의 statements들을 반복수행합니다. 사용 형태는 다음과 같습니다.
----------------------------------------------------------------------------------------
while 조건식:
statements
----------------------------------------------------------------------------------------

 사용은 다음과 같습니다.
----------------------------------------------------------------------------------------
count=1
sum=0
while count<11:
    sum=sum+count # 1부터 10까지 더해주는 식별자 
    count=count+1 
print sum # 1부터 10까지 더한 숫자를 출력
----------------------------------------------------------------------------------------
(실행 결과)
55
----------------------------------------------------------------------------------------

함수

 
 여태 공부하면서 여러가지 내장 함수를 사용해봤습니다. 함수의 장점은 반복적인 코드를 없애줘서 코드를 짧게 만들어줘서 유지보수를 쉽게 할 수 있다는 점입니다. 직접 사용자가 함수를 정의해서 사용할 수도 있습니다. def 키워드를 이용해 함수를 정의할 수 있습니다. 함수는 한개이상의 statment를 가져야하는데, pass 키워드를 사용하면 none객체를 리턴합니다. 함수의 정의와 사용은 아래와 같습니다.
----------------------------------------------------------------------------------------
def add(a,b): # a와 b를 더해주는 add함수 생성
    return a+b
f=add # f가 add를 가리켜서 add함수와 같은 기능을 하게됩니다.
print add(10,5)
print f([1,2,3],[4,5,6]) # 리스트를 더하면 합쳐진 리스트가 반환됩니다.
----------------------------------------------------------------------------------------
(실행 결과)
15
[1, 2, 3, 4, 5, 6]
----------------------------------------------------------------------------------------

 함수를 사용할 때 인자를 적어주면 순서가 뒤바껴도 상관없습니다.
----------------------------------------------------------------------------------------
def minus(a,b): # a와 b를 더해주는 add함수 생성
    return a-b
print minus(b=5,a=10)
----------------------------------------------------------------------------------------
(실행 결과)
5
----------------------------------------------------------------------------------------

 함수는 두개 이상의 값을 동시에 반환 할 수 있습니다. 이 때 반환값은 형은 튜플형입니다.
----------------------------------------------------------------------------------------
def calc(a,b):
    return a+b,a-b,a*b,a/b
print calc(10,5)
----------------------------------------------------------------------------------------
(실행 결과)
(15, 5, 50, 2)
----------------------------------------------------------------------------------------

 마지막으로 재귀적 함수 호출에 대해 알아보겠습니다. 재귀 함수는 함수 몸체에서 자기 자신을 호출하는 함수를 뜻합니다. 반드시 종결 조건과, 종결 조건이 만족할때의 반환값이 있어야합니다. 아래와 같은 형태로 사용합니다.
----------------------------------------------------------------------------------------
def sum(N): # 입력한 수 부터 1까지 더하는 함수
    if(N==1): # 종결 조건
        return 1 # 종결 조건이 만족할 때 반환할 값
    return N+sum(N-1) # 재귀 호출

print sum(10)
----------------------------------------------------------------------------------------

출처 한국기술교육대학교 온라인평생교육원 파이썬프로그래밍




각종 연산자


 파이썬에서 연산자는 산술 연산자, 관계 연산자, 논리 연산자가 있습니다.


- 산술 연산자

 

 산술 연산자는 사칙 연산자(+,-,*,/)와 나머지(%)연산자, 몫(//) 연산자가 있습니다. 우선순위는 괄호가 가장 높고, 단항 연산자(부호 +,-), 지수 연산자(**), 곱·나누기·나머지·몫 연산자, 덧셈·뺄셈(+,-) 연산자 순입니다. 지수 연산자를 제외한 연산자들은 왼쪽에서 오른쪽으로 연산을 수행합니다. 각 연산자의 사용은 다음과 같습니다.

----------------------------------------------------------------------------------------

a=+5 # 단항 연산자

b=2**3**2 # 지수 연산자

c=3*2+4 # 곱셈 연산자와 덧셈 뺄셈 연산자

d=7%3 # 나머지 연산자

e=7//3 # 몫 연산자


print 'a=+5 :',a

print 'b=2**3**2 :',b

print 'c=3*2+4 : ',c

print 'd=7%3 :',d

print 'e=7//3 :',e

----------------------------------------------------------------------------------------

(실행 결과)

a=+5 : 5

b=2**3**2 : 512 # 오른쪽부터 연산하기때문에 3의 2승인 9가 먼저 계산되고 2의 9승인 512가 출력됩니다.

c=3*2+4 :  10 # 곱셈연산을 먼저 수행한 후 덧셈을 수행합니다.

d=7%3 : 1 # 7나누기3의 나머지인 1을 출력합니다.

e=7//3 : 2 # 7나누기3의 몫인 2가 출력됩니다.

----------------------------------------------------------------------------------------

 이번에는 특별한 경우를 살펴보겠습니다. 아래 코드의 내용은 같아보이지만 실제로는 다른 값이 나옵니다. 그이유를 살펴보겠습니다.
----------------------------------------------------------------------------------------
print -7/3   # 1번
print -(7/3) # 2번
----------------------------------------------------------------------------------------

(실행 결과)

-3
-2
----------------------------------------------------------------------------------------
 위에서 괄호가 가장 우선순위가 된다고 했었습니다. 1번의 경우는 -2.3333의 수가 나오는데 나눗셈 연산은 값보다 작은 정수 중에서 가장 큰수를 반환하기때문에 2.3333보다 작은정수인 -3이 출력되고, 2번의 경우는 7/3은 2.3333이되서 값보다 작은 정수중에서 가장 큰수인 2가 반환되서 -2가 출력되게됩니다.

 또한, 정수/정수는 정수 실수/실수는 실수가 출력됩니다. C언어에서 형넓히기 처럼, 정수/실수 또는 실수/정수는 float타입을 가지게됩니다.
----------------------------------------------------------------------------------------
a2=5/2
b2=5/2.0
c2=5.0/2
print "a2 :",a2
print "b2 :",b2
print "c2 :",c2
print type(a2); print type(b2); print type(c2);
----------------------------------------------------------------------------------------

(실행 결과)

a2 : 2   # 5/2의 값은 2.5지만 정수형이므로 2가 출력됩니다.
b2 : 2.5
c2 : 2.5
<type 'int'>
<type 'float'>
<type 'float'>
----------------------------------------------------------------------------------------

 산술연산자는 우선 순위에 따라서 연산이 수행되지만, 코드의 가독성을 위해 괄호를 사용하는게 좋다고합니다.


- 관계 연산자


 관계 연산자는 객체가 지닌 값의 크기를 비교하여, True 혹은 False를 반환합니다. 연산자의 종류는 값이 같은 지 확인하는 ==, 값이 다른지 확인하는 !=, 대소 연산자(>,<,>=,<=)가 있습니다. 사용형태는 다음과 같습니다.

----------------------------------------------------------------------------------------

a=5

b=10


print 'a==b :',a==b

print 'a!=b :',a!=b

print 'a>b  :',a>b

print 'a<=b :',a<=b

----------------------------------------------------------------------------------------

(실행 결과)

a==b : False

a!=b : True

a>b  : False

a<=b : True

----------------------------------------------------------------------------------------

 한 가지 특이한 점은 파이썬 에서는 관계연산자를 동시에 사용할 수 있습니다. 뒤에나오는 논리연산자인 and 연산자를 사용하지 않고, 동시에 사용이 가능합니다.

----------------------------------------------------------------------------------------

print "0<a and a<b :",0<a and a<b

print "0<a<b :",0<a<b

----------------------------------------------------------------------------------------

(실행 결과)

0<a and a<b : True
0<a<b : True

----------------------------------------------------------------------------------------


 상수 자료형 말고 문자나 리스트, 튜플, 사전 같은 자료형의 비교는 어떤 기준으로 할까요? == 연산자는 동일한 값을 가져야 True가 반환되고, 대소관계 에서는 "사전순서"로 연산을 수행합니다. "사전순서"는 흔히 알고있는 사전을 생각하시면 편합니다.

----------------------------------------------------------------------------------------

s="abcd"

s2="abd"


# 리스트와 튜플은 앞에서부터 값 비교


l=[1,2,3,5]

l2=[1,2,3,6]


t=(1,5,7)

t2=(2,3,5)


d={'f':'F','g':'G'}

d2={'a':'A','d':'D'}


print "s2>s :",s2>s

print "l2>l :",l2>l

print "t2>t :",t2>t

print "d2>d :",d2>d

----------------------------------------------------------------------------------------

(실행 결과)

s2>s : True # 사전에 abcd보다 abd가 뒤에나오기때문에 s2가 더큼

l2>l : True # 사전에 1,2,3,5보다 1,2,3,6이 뒤에 오기때문에 l2가 더큼

t2>t : True # 1보다 2가 크기때문에 t2가 더 큼

d2>d : False # f보다 a가 앞에나오기때문에 False

----------------------------------------------------------------------------------------

 자료형이 다른 두 값을 비교할때는 어떨까요? 숫자<사전<리스트<문자열<튜플의 관계를 가집니다. 관계에 따라서 True/False가 결정됩니다.

----------------------------------------------------------------------------------------

print 'a>b :',a>b
print 'd>c :',d>c

----------------------------------------------------------------------------------------

(실행 결과)
a>b : False
d>c : True

----------------------------------------------------------------------------------------

 추가적으로 sort함수에대해서 간단하게 살펴보겠습니다. sort함수는 정렬을 해주는 함수인데, 위의 관계와 사전순서에 따라서 정렬을 해줍니다. 다음과 같이 리스트 l2가 여러 자료형을 인덱스로 가지고있습니다. sort함수를 사용하면 정렬을 해줍니다.

----------------------------------------------------------------------------------------

l2=['abc',3,(1,2,3),[4,5,6],'zzzz',{1:2}]

print 'before :',l2

l2.sort()

print 'after  :',l2

----------------------------------------------------------------------------------------

(실행 결과)

before : ['abc', 3, (1, 2, 3), [4, 5, 6], 'zzzz', {1: 2}]

after    : [3, {1: 2}, [4, 5, 6], 'abc', 'zzzz', (1, 2, 3)]

----------------------------------------------------------------------------------------


- 논리 연산자


 논리 연산자는 부울 연산자라고도 하며, 관계 연산자 처럼 True, False를 피 연산자 값으로 가지며, 논리 연산자 자체가 값을 반환 하지는 않습니다. 논리 연산으로 최종적으로 평가 되어진 값이 반환됩니다. 논리 연산자의 종류는 and, or, not 세가지가 있습니다. and는 둘다 참일경우 True, or는 둘중 하나라도 참일 경우 True, not은 True와 False를 반전시켜 줍니다. 사용 형태는 다음과 같습니다.

----------------------------------------------------------------------------------------

a=11
b=10
c=15

print a<b and a<c # 
print a<b or a<c
print a<b; print not a<b
----------------------------------------------------------------------------------------
(실행 결과)
False
True
False
True
----------------------------------------------------------------------------------------
 추가적으로, and 연산의 경우 앞의 연산이 거짓이면 뒤의 연산을 수행하지 않으며, or연산은 앞의 연산이 True일경우, 뒤의 연산을 수행하지 않습니다.

 True와 False는 사칙연산자와 만날경우 True는 1 False는 0의 값을 가집니다.
----------------------------------------------------------------------------------------
a=11
b=10
c=15

print (a<c)+5
print (a<b)+3
----------------------------------------------------------------------------------------
(실행 결과)
6
3
----------------------------------------------------------------------------------------

 마지막으로 bool() 내장 함수에 대해 알아보겠습니다. bool()함수는 수치값을 진리값으로 변환해줍니다. 정수 0, 실수0.0, 비어있는 문자열 '',""과 None 객체는 False가 됩니다.
----------------------------------------------------------------------------------------
print bool(0)
print bool(0.0)
print bool('')
print bool(None)
# 리스트, 튜플, 사전 역시 비어있는 자료형은 거짓이 됩니다.
print bool([])
print bool(())
print bool({})
----------------------------------------------------------------------------------------
(실행 결과)
False
False
False
False
False
False
False
----------------------------------------------------------------------------------------

 마지막으로, 논리 연산자를 이용해 연산을 해보겠습니다.
----------------------------------------------------------------------------------------
print [] or 1
print () and 1
print 1 and []
print ([]) or 1 # [[]] : 공리스트를 가지는 리스트는 참

----------------------------------------------------------------------------------------

(실행 결과)
1 # 앞은 거짓이지만 뒤의 정수가 참이므로 1 출력
() # 앞이 공튜플(거짓)이므로 뒤를 연산하지않고 거짓인 공튜플 출력
[] # 앞의 정수가 참이고, 뒤의 리스트가 공리스트(거짓)이므로, 거짓인 [] 출력
1 # 앞의 리스트가 참이고, 뒤의 1도 참이므로 1출력

----------------------------------------------------------------------------------------


출처 한국기술교육대학교 온라인평생교육원 파이썬프로그래밍




파이썬 내장 자료형


 파이썬에는 세 가지 내장 자료형이 있습니다. 앞에서 공부할 때 몇번 쓰였던 리스트와 튜플, 사전이 있습니다. 세 자료형 모두 집합적인 자료형이라는 공통점이 있습니다. 아래 표는 각 자료형의 특징입니다.


리스트

 마지막 요소부터 접근 가능

튜플 

 읽기만 가능하며, 속도가 빠름 

사전 

 용어 사전과 유사한 방식으로 구성 

 

- 리스트(List)

  

 리스트는 임의의 객체를 순차적으로 저장하는 집합적 자료형 입니다. 순차적인 자료형이기 때문에 인덱스가 존재합니다. 문자열과 같이 인덱싱, 슬라이싱, 문자열 연산(+,*)이 가능합니다. 아래와 같은 형태로 사용합니다.

----------------------------------------------------------------------------------------

L=[1,2,3]

 

print "len(L) :", len(L)

print "L[1] :", L[1]      # 인덱싱

print "L[-1] :", L[-1]    # 인덱싱

print "L[1:3] : ", L[1:3] # 슬라이싱

print "L+L :", L+L # 문자열 + 연산

print "L*3 :", L*3  # 문자열 * 연산

print "type(L) :", type(L) # 문자열의 타입

----------------------------------------------------------------------------------------

(실행 결과)

L[1] : 2

L[-1] : 3

L[1:3] : [2, 3]

L+L : [1, 2, 3, 1, 2, 3]

L*3 : [1, 2, 3, 1, 2, 3, 1, 2, 3]

type(L) : <type 'list'>

----------------------------------------------------------------------------------------

 

 리스트는 문자열과 다르게 리스트는 인덱스의 값을 변경 할 수 있습니다.

----------------------------------------------------------------------------------------

L=[1,2,3]

 

print "before L :",L

L[2]=7

print "after L  :",L

----------------------------------------------------------------------------------------

(실행 결과)

before L : [1, 2, 3]

after L  : [1, 2, 7]

----------------------------------------------------------------------------------------

 

 앞에서 range()함수 살짝 공부했었는데, range()함수를 이용해서도 리스트를 만들 수 있습니다

----------------------------------------------------------------------------------------

L2=range(10)  # 리스트 L2 생성

 

print "L2 : ",L2

print "L2[::2]  :",L2[::2]

print "L2[::-1] :",L2[::-1]

print "8 in L2  :",8 in L2

----------------------------------------------------------------------------------------

(실행 결과)

L2 :  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # range(10)에 의해 1부터 9까지 리스트 생성

L2[::2]  : [0, 2, 4, 6, 8]            # step 2때문에 0,2,4,6,8 만 출력

L2[::-1] : [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] # step -1때문에 거꾸로 출력

8 in L2  : True                          # 멤버쉽 테스트

----------------------------------------------------------------------------------------

 

- 튜플(Tuple)

 

 튜플은 리스트와 유사하지만 튜플 내의 값을 변경할 수 없는 자료형입니다. 리스트는 대괄호 '[]'를 사용하는 반면에 튜플은 소괄호 '()'를 사용합니다. 튜플또한 각 값의 인덱스가 부여되며, 대부분의 문자열 연산이 가능하지만, 값은 변경 할 수 없습니다. 아래와 같은 형태로 사용합니다.

 

----------------------------------------------------------------------------------------

t=(1,2,3,4)

 

print "len(t) :", len(t)

print "t[1] :", t[1]

print "t[-1] :", t[-1]

print "t[1:3] :", t[1:3]

print "t+t :", t+t

print "t*3 :", t*3

print "5 in t :",5 in t

print "type(t) :", type(t)

----------------------------------------------------------------------------------------

(실행 결과)

t[-1] : 4

t[1:3] : (2, 3)

t+t : (1, 2, 3, 4, 1, 2, 3, 4)

t*3 : (1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4)

5 in t : False

type(t) : <type 'tuple'>

----------------------------------------------------------------------------------------

 

- 사전(Dictionary)

  

 정수형 인덱스가 아닌 키 값을 저장하는 자료형 입니다. 키 값 : 매핑형태로 저장되며, 중괄호 '{}'를 사용합니다. 리스트, 튜플과는 다르게 임의의 순서로 저장됩니다. 실제로는 해시값 순으로 정렬 된다고 합니다. 다음과 같은 형태로 사용합니다.

----------------------------------------------------------------------------------------

P={'apple':'red','banana':'yellow','grape':'purple'} # 사전 P 선언 및 키와 값 할당

 

print "P['apple'] :",P['apple'] # 사전의 apple 키의 해당하는 값 출력

 

print 'before P : ',P 

P['orange']='orange' # orange라는 키와 값 삽입

print 'after  P : ',P

 

P['grape']='delicious' # 키가 grape인 값 변경

print "P :",P

 

print "'apple' in P :",'apple' in P # 멤버쉽 테스트

 

print '*'*30 # 줄을 구분하기 위해 * 문자 출력

 

print "P.key() :",P.keys() # 사전의 키만 추출해서 리스트로 반환

print "P.values() :",P.values() # 사전의 값만 추출해서 리스트로 반환

print "P.items() :",P.items() # 키와 값을 튜플로 추출

----------------------------------------------------------------------------------------

(실행 결과)

P['apple'] : red

before P :  {'grape': 'purple', 'apple': 'red', 'banana': 'yellow'}

after  P : {'orange': 'orange', 'grape': 'purple', 'apple': 'red', 'banana': 'yellow'}

P : {'orange': 'orange', 'grape': 'delicious', 'apple': 'red', 'banana': 'yellow'}

'apple' in P : True

******************************

P.key() : ['orange', 'grape', 'apple', 'banana']

P.values() : ['orange', 'delicious', 'red', 'yellow']

P.items() : [('orange', 'orange'), ('grape', 'delicious'), ('apple', 'red'), ('banana', 'yellow')]

----------------------------------------------------------------------------------------

 items()함수는 튜플로 추출 하지만, 반환형태는 리스트입니다.

 

- 내장 자료형의 특성

 

 내장 자료형의 특성을 표로 정리해 봤습니다. 시퀀스는 인덱스가 존재한다는 뜻이고, 리터럴은 정수나 숫자, 표기법 등이 하나씩 저장된다는 뜻이며, 컨테이너는 집합체 형태라는 뜻입니다.


 추가적으로 타입이 동일한 지 알아볼 때는 '=='를 사용합니다. 그리고, 아무것도 아닌, 아무것도 없는 타입을 None객체라고 합니다.

----------------------------------------------------------------------------------------

a=[1,2,3]

b=(4,5,6)

print type(a)==type(b)

 

None c

print type(c)

----------------------------------------------------------------------------------------

(실행 결과)

False

<type 'NoneType'>

----------------------------------------------------------------------------------------

 

- 객체 신원 식별

 

 객체를 식별하기 위한 고유의 식별자가 있습니다. 이러한 식별자를 알아보는 함수가 id()함수입니다. 수치형 자료는 이미존재하는 1을 가리키는 레퍼런스를 할당하기 때문에 식별자가 동일하며, 리스트 같은 형태의 자료형은 값이 동일해도 식별자가 다릅니다.

----------------------------------------------------------------------------------------

a=50 # a50을 가리키고

b=a  # b또한 a를 가리켜 50을 가리키기 때문에 식별자가 동일

print id(a); print id(b)

 

a2=3 # 수치형 자료는 동일한 식별자를 가짐

b2=3

print id(a2); print id(b2)


print '*'*50


c=[1,2,3,4]

d=[1,2,3,4]


print "id(c) :",id(c) # 리스트 값은 동일하지만, 식별자는 다름

print "id(d) :",id(d)

----------------------------------------------------------------------------------------

(실행 결과)

id(a) : 30704440

id(b) : 30704440

id(a2) : 30703576

id(b2) : 30703576

**************************************************

id(c) : 39759304

id(d) : 39759240

----------------------------------------------------------------------------------------

  

 두 객체가 동일한지 테스트 할 때에는 is 키워드를 사용합니다. 다음과 같은 형태로 사용합니다.

----------------------------------------------------------------------------------------

a=50 

b=a 


a2=3 

b2=3


c=[1,2,3,4]

d=[1,2,3,4]


print a is b
print a2 is b2
print c is d
----------------------------------------------------------------------------------------
(실행 결과)
a is b :  True
a2 is b2 :  True
c is d :  False

----------------------------------------------------------------------------------------

 타입이 동일한지 확인할 때 처럼, 두 객체의 값이 같은 지 확인할 때에도 '=='연산자를 사용합니다. 

----------------------------------------------------------------------------------------

c=[1,2,3,4]

d=[1,2,3,4]


print "c==d : ",c==d # 식별자는 다르지만, 값이 같으므로 True가 반환됨

----------------------------------------------------------------------------------------

c==d :  True
----------------------------------------------------------------------------------------

* 출처 : 한국기술교육대학교 온라인평생교육원 파이썬프로그래밍



수치형 자료형


 프로그래밍 공부를 해보신 분들은 수치형 자료형이 뭔지 알고 계실겁니다. 수치형 자료형은 쉽게 말해 수치를 표현 하는 자료형이라고 말할 수 있습니다. 파이썬에서는 정수형, 실수형, 롱형, 복소수형이 있습니다.


 자료형 공부에 앞서, 저처럼 이클립스에서 실습을 할 때 한글 주석을 넣으면 오류가 발생합니다. 아래와 코드를 넣어주면 한글로 주석을 달아도 오류가 발생하지 않습니다.

# -*- coding: utf-8 -*-


- 정수형


 정수형은 쉽게 말해 소수 영역이 없는 수로 타입은 int를 사용합니다. 사용은 아래와 같습니다. 8진수와 16진수에는 정수앞에 각각 0과 0x를 붙여줍니다.

----------------------------------------------------------------------------------------

# -*- coding: utf-8 -*- #한글 주석을 사용하기 위해 사용

a=11   # 10진수

b=011  # 8진수

c=0x11 # 16진수

print a

print b

print c

----------------------------------------------------------------------------------------

(출력 결과)

11

9

17

----------------------------------------------------------------------------------------


 정수형(int)의 최대 크기는 sys모듈의 maxint를 확인하면 알 수 있습니다.

----------------------------------------------------------------------------------------
import sys
print sys.maxint
----------------------------------------------------------------------------------------
(출력 결과)
2147483647
----------------------------------------------------------------------------------------

- 실수형


 실수형은 소수영역이 있는 수로, float타입을 가집니다. 사용은 아래와 같습니다. e3은 10의 3승 e5는 10의 5승을 뜻합니다.

----------------------------------------------------------------------------------------
a=1.2
b=1.3e3
c=-0.5e5
print a; print b; print c
----------------------------------------------------------------------------------------
(출력 결과)
1.2
1300.0 # 1.3*10^3승인 1300.0 이 출력됩니다.
-50000.0
----------------------------------------------------------------------------------------
 위의 결과 처럼 바껴서 출력되는 이유는 print함수의 str(repr) 내장 함수 때문이라고 합니다.


- 롱형

 

 롱형 상수는 큰 자리수의 수를 표현할때 사용합니다. 숫자의 끝에 L문자를 붙여서 사용하는데, 정수형의 최대크기(maxint)를 넘어가면 명시적으로 롱형으로 변환됩니다. 하지만, 굳이 큰 수가 아닌 작은 수여도 L을 붙인다면 타입이 롱형이 됩니다.
----------------------------------------------------------------------------------------
h=12345678901234565L
h2=12345678901234565 # 명시적으로 롱형으로 변환
print h; print h2
print type(h); print type(h2)
----------------------------------------------------------------------------------------
(출력 결과)
# 같은 값인 롱형으로 출력되며, 타입도 롱형으로 동일합니다.
12345678901234565
12345678901234565
<type 'long'>
<type 'long'>
----------------------------------------------------------------------------------------

- 복소수형


 복소수형은 실수부와 허수부의 합으로 구성된 수를 뜻합니다. 자세하게 복소수의 수학적인 내용이 궁금하신 분들은 아래 링크를 참고하시길 바랍니다.
http://terms.naver.com/entry.nhn?docId=1103039&cid=40942&categoryId=32206
 허수에는 j를 붙여 연산하며, 각각 실수부와 허수부끼리 연산합니다.
----------------------------------------------------------------------------------------
a=10+20j
b=30+50j
print a+b
----------------------------------------------------------------------------------------
(출력 결과)
(40+70j)
----------------------------------------------------------------------------------------
 참고로, 복소수형 관련 내장함수로 complex()라는 함수가 있는데, 인자로 값을 넣어주면 아래와 같은 복소수 형태로 반환해줍니다.
complex(1.1,5) -> (1.1+5j)

- math 모듈


 수학적인 값들을 저장하고 있는 모듈입니다. math모듈을 임포트 하면, pi를 비롯해 e, sin, sqrt(제곱근을 구하는 함수)등을 사용 할 수 있습니다.
----------------------------------------------------------------------------------------
import math
print math.pi
print math.e
print math.sin(5)
print math.sqrt(4)
----------------------------------------------------------------------------------------
(출력 결과)
3.14159265359
2.71828182846
-0.958924274663
2.0
----------------------------------------------------------------------------------------

문자열 자료형


 파이썬에서 문자열 자료형은 단일 따옴표(')와 이중 따옴표(") 모두 문자열을 사용할 수 있습니다.
----------------------------------------------------------------------------------------
a='park hye ung'
b="Park Hye Ung"
----------------------------------------------------------------------------------------
(출력 결과)
park hye ung
Park Hye Ung
----------------------------------------------------------------------------------------

 문자열의 자료형은 다른 언어에서 처럼 변경이 되지 않습니다.  문자열의 주요 기능으로 인덱싱 슬라이싱이 있습니다.
 

- 인덱싱(Indexing)


 C언어에서의 배열처럼 파이썬에서도 문자열을 할당하면 다음과 같이 인덱스가 0번부터 시작합니다. 이때 인덱스 -1번은 맨뒤의 문자를 의미합니다. 인덱싱은 이러한 인덱스의 번호를 이용하는 방법입니다.
----------------------------------------------------------------------------------------
a="Hello!!"
print a[0]; print a[-1]
----------------------------------------------------------------------------------------
(출력 결과)
H # 맨 앞 문자 출력
! # 맨 뒤 문자 출력
----------------------------------------------------------------------------------------

- 슬라이싱(Slicing)

 
 슬라이싱은 인덱싱을 이용해서 부분적으로 인덱스를 출력할 수 있는 방법입니다. 형식은 start(inlcluded) : stop(excluded) : step 의 형태입니다. included와 excluded를 써논 이유는 range함수처럼 시작하는 인덱스는 포함하고, 끝나는 인덱스는 포함하지 않기 때문입니다.
----------------------------------------------------------------------------------------
a="Hello!!"
print a[1:3] # 1번인덱스부터 3-1번인덱스까지 출력
print a[4:]  # 4번 인덱스부터 출력
print a[:5]  # 5-1번 인덱스까지 출력
print a[::-1] # -1번(맨뒤)인덱스부터 출력 -> 거꾸로 출력
----------------------------------------------------------------------------------------
(출력 결과)
el
o!!
Hello
!!olleH
----------------------------------------------------------------------------------------

- 문자열의 연산

 
 문자열의 연산은 +와 *가 있습니다. +는 두 문자열을 연결해주고 *는 해당 문자열을 반복해 줍니다. 아래와 같이 사용할 수 있습니다.
----------------------------------------------------------------------------------------
a="Hello!"
b=" "
c="world~"
print a+b+c  # a,b,c 문자열을 모두 합쳐서 출력
print a*3      # a를 3번 반복해서 출력
----------------------------------------------------------------------------------------
(출력 결과)
Hello! world~
Hello!Hello!Hello!
----------------------------------------------------------------------------------------

 문자열의 길이는 len내장 함수를 통해 알 수 있습니다. 공백까지 문자열의 길이에 포함됩니다. 사용 형태는 다음과 같습니다. 
----------------------------------------------------------------------------------------
s="Hel lo!"
print len(s)
----------------------------------------------------------------------------------------
(출력 결과)
7
----------------------------------------------------------------------------------------

 마지막으로, 문자열내 포함관계 여부를 알 수 있는 키워드가 있습니다. in과 not in 인데, 참 거짓에 따라 True/False를 반환합니다. in은 포함할 경우, not in은 포함하지 않을 경우 True를 반환합니다.
----------------------------------------------------------------------------------------
s='park Hye Ung'
print 'park' in s
print 'park' not in s
print 'hello' not in s
----------------------------------------------------------------------------------------
(출력 결과)
True
False
True
----------------------------------------------------------------------------------------

* 출처 : 한국기술교육대학교 온라인평생교육원 파이썬프로그래밍
          두산 백과 - 복소수




파이썬의 기본문형


- 예약어

 

 다른언어를 공부해 보신분들은 아시겠지만 프로그래밍 언어에는 예약어가 있습니다. 예약어는 키워드라고도 하며, 이미 문법적인 용도로 사용되고 있기때문에 변수등의 식별자로 사용하면 안되는 단어들을 뜻합니다.

 파이썬의 버전에 따라 예약어의 종류와 수가 다릅니다. 저는 ipyton 2.7.11 버전을 사용하고있는데, 2.7.11 버전은 31개의 예약어가 있습니다. 

 아래 코드는 예약어를 출력하고, 예약어가 저장된 리스트 즉, 예약어의 수를 알아보는 코드입니다. #은 주석입니다.



import keyword            # keyword 모듈을 불러옴

print keyword.kwlist       # keyword모듈이 지원하는 kwlist를 출력

print len(keyword.kwlist) # 예약어가 저장된 리스트의 길이 출력



 아래 그림을 보면 위에서 사용한 print함수, import 또한 예약어라는걸 확인 할 수 있습니다. 추가로 len함수는 특정 모듈을 import하지 않고도 사용할 수 있는 내장 함수입니다.


- 내장 함수

 
 내장 함수는 위에서 사용한 len함수처럼 특정 모듈을 추가하지않고, 기본적으로 제공하는 함수를 뜻합니다. 아래 함수들이 내장함수입니다.

1) abs(x) : 수치형 자료 x의 절대값을 반환하는 함수

2) max(s) : sequence자료형(문자열, 리스트, 튜플)을 입력받아 그 자료가 지닌 값중 가장 큰 값을 반환하는 함수

  - print max("pyton") -> 아스키 코드가 가장 큰 y 반환

  - print max([1,2,3])   -> 리스트에서 가장 큰 3 반환

3) min(s) : max()의 반대로 가장 작은 값을 반환하는 함수

4) pow(x,y) : a의 b승을 반환하는 함수

  - print pow(2,4)  -> 16

  - print pow(2,-1) -> 0.5

5) divmod(x,y) : x를 y로 나눈 몫과 나머지를 반환하는 함수 

  - print divmod(5,2) -> 2,1

5) chr(x) : 아스키 코드 값을 문자로 변환해주는 함수

  - print chr(97) -> a

  - print chr(65) -> A

  - print chr(48) -> 0(숫자 0이아닌 문자0)

6) str(object) : 임의의 객체 object에 대해 해당 객체를 표현하는 문자열을 반환하는 함수

  - print str(3) -> 3

  - print str([1,2,3]) -> [1,2,3]

7) range([start],stop,[step]) : 수치형 자료형으로 start, stop, step등을 입력 받아 해당 범위에 해당하는 정수를 리스트로 반환하는 함수

  - 인수가 하나인 경우(stop) : 0부터 stop-1까지의 정수 리스트 반환

    print range(10) -> [0,1,2,3,4,5,6,7,8,9]

  - 인수가 두개인 경우(start, stop) : 0부터 stop-1까지의 정수 리스트 반환

    print range(3,10) -> [3,4,5,6,7,8,9]

  - 인수가 하나인 경우(start, stop, step) : 0부터 stop-1까지의 정수리스트를 반환 하되, step인것들만 반환

    print range(1,10,2) -> [1,3,5,7,9] # 각 원소가 step만큼 차이가 남

8) type(a) : a의 자료형을 반환하는 함수

   - print type(1) -> int(정수형)

   - print type(1.5) -> float(실수형)

   - print type('abc') -> str(문자형)

   - print type([1,2,3,4]) -> list(리스트)


- 식별자

 
 파이썬에서 식별자는 변수, 함수, 모듈, 클래스 또는 객체를 식별하는데 사용되는 이름을 말합니다. 가장 흔히 사용하는 식별자는 변수 이름입니다.
 식별자의 조건은 다음과 같습니다.
  - 대소문자 구분(a와 A는 다름)
  - 식별자는 문자(A~Z,a~z) 또는 언더바(_)로 시작할 수 있고, 두번째부터는 숫자도 가능
  - 특수문자(@,$,%등.)는 사용할 수 없음
  - 예약어나 내장함수, 모듈이름으로 만드는 일이 없도록 주의해야함


- 변수

 
 파이썬에서 변수가 생성되는 시점은 해당 변수에 임의의 값이 할당될 때 입니다. 아래와 같은 경우에 a=1에서 변수 a가 생성이됩니다. 변수의 타입을 따로 적지않고, 변수에 값이 할당될 때 변수의 타입이 정해집니다.



a=1

print # 그냥 print함수만 사용할 경우 한줄이 띄어집니다.

 변수의 삭제는 del이라는 예약어를 사용합니다.



a=1

print a
del a


- 기초 문형

 
 1) 연속라인 : 코딩이 길어졌을 때 한줄로 인식하도록 하는 기능입니다. 역슬래시(\)를 사용합니다.

a=1

b=3

if(a==1) and \ 

b(==3) : 

print 'connected lines'


 반대로 한 라인에 두문장을 이어서 쓸때는 세미콜론(;)을 사용합니다. 코드의 가독성 때문에 잘 사용하지 않는다고 합니다.


a=1; b=2

2) 할당문 : 등호(=)를 사용하는 연산입니다. 왼쪽에는 변수가와야합니다. 표현식은 오른쪽 항에만 올 수 있습니다.


a=1 # o

b=a # o

1+3=c # x

d=1+3 # o

그렇다면, a=(b=c+d)도 가능할까요? 

위의 식은 불가능합니다. b=c+d는 식(Expression)이아니라 문(Statement)이기 때문입니다.



 아래의 형태로도 할당이 가능합니다.



c,d = 3,4 처럼 한번에 할당도 가능 c->3, d->4

x=y=z=0 처럼 할당이 가능한데, 이때 오른쪽 항부터 연산이 진행됩니다.

z=0 -> y=z -> x=y



 그렇다면, C언어에서 temp를 써서 두 변수의 값을 swap하는것 처럼 변수의 swap 어떻게 할까요? 위의 할당 방법을 이용하면 쉽게 swap할 수 있습니다.



a=3

b=4

a,b=b,a



3) 확장 할당문 : 확장 할당문은 +=, -=, *=, /= 4가지가 있습니다.
  - a += 4는 a=a+4와 동일합니다. 아래와 같은 경우로도 사용이 가능합니다.



a=10      # a에 10을 할당하고

a *= 2+3 # 2+3를 먼저 연산해서 a에 5를 곱한 값인 50을 저장하고

print a    # 50을 출력합니다.



4) 객체와 할당
 객체의 변수는 해당 객체의 레퍼런스를 지니고 있습니다. 레퍼런스는 가리키고 있는 값을 뜻합니다. a=1 이라는 문장에서 a는 이름, 1은 객체이며 변수 a는 1을 가리킵니다. (a->1인 형태)
 아래의 코드와 같이 a,b,c 3개의 리스트를 만드는데, b와 c가 a를 가리키게 한 코드입니다.


a=[1,2,3]

b=[10,a,30]

c=['x',a,'z']


print a

print b

print c



 결과는 아래 그림과 같습니다. 처럼 b,c리스트 안에 a리스트가 출력됩니다.


위 코드는 아래의 그림처럼 a가 [1,2,3]리스트를 가리키고, b,c에서도 a를 가리켜서 결국에는 [1,2,3]리스트를 가리킵니다.






콘솔 입·출력


 콘솔(Console)은 윈도우에서 커맨드창(cmd창), 리눅스에서 터미널창(Terminal)을 뜻합니다. 콘솔에서 입·출력에대해 알아보겠습니다. 이클립스에서도 콘솔창을 제공해서 실습을 이클립스에서 했습니다.

- 입력

 콘솔에서의 입력은 raw_input이라는 내장함수를 이용합니다. raw_input함수의 사용은 아래와 같습니다.



name = raw_input('your name : ') # raw_input함수로 입력을받아 name변수에 저장

print name


 아래 그림과같이 your name : 이라는 문자열이 출력되고 뒤에 입력할 수 있는 부분에 이름을 입력하면 name이라는 변수에 저장해서 name을 출력한 결과입니다.

 추가적으로 내장 함수중에 int()함수가 있습니다. int()함수는 문자열을 정수로 변환하는 함수입니다. 

 raw_input함수를 통해 정수를 입력받고 2를 더하는 코드를 작성했습니다. 정상적으로 실행이 될까요?



a = raw_input('input : ')

print a+2


 아래와 같이 문자형과 정수형 객체는 연결할 수 없다는 오류가 출력됩니다. raw_input 함수는 입력 값을 문자형으로 인식한다는 걸 알 수 있습니다.


 이 때, 사용하는게 int()함수입니다. int함수를 사용해서 코드를 재구성 하고 실행하면 정상적으로 출력이됩니다.



a = int(raw_input('input : ')) #raw_input 함수를 int 함수의 인자로 사용

print a+2




 입력을 할 수 있는 함수에는 input()함수도 있습니다. input()함수는 raw_input함수와 다르게 입력한 값에 따라서 자료형을 인식합니다. 또한 연산식을 입력할 수도 있습니다.



a=input('input : ') # 따로 int함수를 사용하지 않아도 정수를 입력하면 정수형으로 인식합니다.

print a+10




 문자열을 입력하는 경우, 입력할 때 따옴표를 써줘야 오류가 발생하지 않습니다.



a=input('input : ')

print a




- 출

 출력은 여태까지 계속 사용했던 print함수를 이용해서 하는데, print 함수에 대해 알아보겠습니다.

 print 함수는기본적으로 줄바꿈을 수행 합니다. 



print 1 

print 2

(결과)

1
2



print 함수에 콤마(,)를 용하게되면 한칸을 띄어줍니다.


print 1, 2


(결과)

1 2


다음과 같이 숫자가 아닌 식도 출력이 가능합니다.


print 5+5, 4*9


10 36



 그렇다면, 숫자와 문자가 합쳐진 "2AM"과같은 문자도 출력할 수 있을까요? 아래와 같이 입력을 하면 오류가 발생합니다. 숫자와 문자형은 더해주지 않습니다.


print 2+'AM'


 

 2AM과 같이 숫자와 문자가 결합된 문자를 출력하고 싶은 경우는 숫자또한 문자로 표현해줘야 합니다. 물론 한번에 "2AM"이라고 쓸 수도 있겠지만, 문자의 결합도 가능하다는점을 말하고 싶었습니다.


print '2'+'AM'





* 출처 : 한국기술교육대학교 온라인평생교육원 파이썬프로그래밍




계좌 관리 프로그램

 

 지금까지 공부한 내용들을 바탕으로 계좌 관리 프로그램을 작성해 봤습니다. 계좌를 생성하는 기능과 입금, 출금하는 기능 계좌 전체를 조회하는 기능이 있습니다. 파일 입출력을 이용해서 "data.txt"라는 텍스트 파일에 있는 계좌정보를 가져오기도하고, 계좌를 생성한 뒤에 입금, 출금 한 내용을 "data.txt"파일에 저장할 수 있도록 했습니다. "bank.h"헤더파일과 "bank.c","main.c" 세 파일로 분할 컴파일 했습니다. "bank.h"헤더파일에는 구조체 정의와 각 함수정의 및 헤더파일들을 인클루드했고, "bank.c"에서는 각 함수들의 기능 구현을 했습니다. 마지막으로 "main.c"는 "bank.h"헤더파일을 인클루드하고 "bank.c"의 함수를 호출해서 사용하도록 작성 했습니다.


- bank.h

----------------------------------------------------------------------------------------

#define NAME_LEN 20 // define은 단순매크로로 값을 정해 편하게 사용할 수 있습니다. 

// 아래 헤더파일을 bank.h에 인클루드한 이유는 main.c와 bank.c에서 사용하기 위해서 입니다.

#include <stdio.h> 

#include <stdlib.h>

#include <string.h>

#pragma warning(disable:4996)


typedef struct bank{ // 계좌정보를 저장할 구조체 선언

char *name[NAME_LEN]; // 예금주[최대20자리]

int id;                         // 계좌번호

int money;                   // 잔액

struct bank *next;

}bank;


bank *head, *tail; // 노드의 처음과 끝

void Init_account(FILE *fp); // 노드의 처음과 끝에 메모리 할당하고, 파일에서 입력을 받도록 하는 함수

void Make_account(FILE *fp); // 계좌를 생성하는 함수

void Deposit(FILE *fp); // 입금 함수

void WithDraw(FILE *fp); // 출금 함수

void WriteAccount(FILE *fp); // 계좌의 정보를 저장하는 함수

void Account_inquire(void); // 계좌를 조회하는 함수

void ReadAccount(int id, char *name, int money); // 텍스트 파일에서 입력을 받는 함수

----------------------------------------------------------------------------------------


- bank.c

----------------------------------------------------------------------------------------


#include "bank.h"


void Init_account(FILE *fp)

{

int id;

char name[NAME_LEN];

int money;

head = (bank *)malloc(sizeof(bank));

tail = (bank *)malloc(sizeof(bank));

head->next = tail;

tail->next = tail;


while (fscanf(fp, "%d %s %d", &id, name, &money) == 3){ // 정수형, 문자형, 정수형 3개일 때만 입력을 받음

ReadAccount(id, name, money);

}

}


void ReadAccount(int id, char *name, int money)

{

bank *t;

t = (bank *)malloc(sizeof(bank));

t->id = id;

strcpy(t->name, name);

t->money = money;


t->next = head->next; // 다음 노드를 가리킴

head->next = t; // 노드의 처음을 가리킴

}


void Make_account(FILE *fp)

{

int id;

char name[NAME_LEN];

int money;

bank *t;

t = (bank *)malloc(sizeof(bank));


printf("\n*********계좌 생성*********\n");

printf("계좌번호 : "); scanf("%d", &id);

printf("예 금 주 : "); scanf("%s", name);

printf("입 금 액 : "); scanf("%d", &money);


t->id = id;

strcpy(t->name, name);

t->money = money;


t->next = head->next;

head->next = t;


WriteAccount(fp); // 저장하는 함수로 파일 포인터를 넘겨줌

}


void Deposit(FILE *fp)

{

int id;

int money;

bank *t;

printf("계좌번호 : "); scanf("%d", &id);

printf("입 금 액 : "); scanf("%d", &money);


for (t = head->next; t != tail; t = t->next)

{

if (t->id == id)

{

t->money += money; // 잔액에 입금할 금액을 더해서

WriteAccount(fp); // 저장

return;

}

}

printf("없는 계좌번호입니다.\n");

}


void WithDraw(FILE *fp)

{

int id;

int money;

bank *t;

printf("계좌번호 : "); scanf("%d", &id);

printf("출 금 액 : "); scanf("%d", &money);


for (t = head->next; t != tail; t = t->next)

{

if (t->id == id)

{

if (t->money<money) // 출금액이 잔액보다 클 경우

{

printf("출금액이 잔액을 초과할 수 없습니다.\n");

return;

}

else{

t->money -= money; // 잔액에서 출금액을 빼서

}

WriteAccount(fp); // 저장

return;

}

}

printf("없는 계좌번호입니다.\n");

}

void Account_inquire(void)

{

bank *t;

for (t = head->next; t != tail; t = t->next)

{

printf("\n*********잔액 조회*********\n");

printf("계좌번호 : %d\n", t->id);

printf("예 금 주 : %s님\n", t->name);

printf("잔    액 : %d원\n\n", t->money);

}

}


void WriteAccount(FILE *fp)

{

bank *t;

rewind(fp); // 파일 읽는 포인터 지점을 맨 첨으로 돌리는 함수

for (t = head->next; t != tail; t = t->next)

{

fprintf(fp, "%d %s %d\n", t->id, t->name, t->money);

}

}

----------------------------------------------------------------------------------------


- main.c

----------------------------------------------------------------------------------------

#include "bank.h"

int main()
{
int input;
FILE *fp;
fp = fopen("data.txt", "r+"); // 파일모드가 r+일 경우  읽고쓰기를 동시에 수행 합니다.
Init_account(fp);

do{
printf("계좌 생성&관리 프로그램입니다. 원하시는 번호를 입력하세요.\n");
printf("*********************************************\n");
printf("1)계좌 생성 2)계좌 조회 3)입금 4)출금 5)종료\n");
printf("*********************************************\n");
printf("입력 >");
scanf("%d", &input);

switch (input){
case 1:
Make_account(fp);
break;
case 2:
Account_inquire();
break;
case 3:
Deposit(fp);
break;
case 4:
WithDraw(fp);
break;
case 5:
input = 0;
free(head); // 종료하면서 메모리 반환
free(tail);
break;
default:
printf("잘못 입력하셨습니다. \n");
return main();
}
}
while (input != 0);
}

----------------------------------------------------------------------------------------


 위 코드의 실행 결과는 다음과 같습니다. 우선 "data.txt"파일에 초기값으로 아래 그림과 같이 입력 하고 저장한뒤에 프로그램을 실행했습니다.


 계좌 하나를 추가로 생성하고, 새로만든 계좌와 기존의 계좌 각각 입금, 출금을 수행했습니다. 


 계좌를 조회하고 종료하는 그림입니다. 새로만든 계좌와 기존의 계좌 모두 정상적으로 출력됩니다. "data.txt"파일에도 저장되었을까요?


 살짝 깨지기는 했지만 값이 정상적으로 저장된걸 확인 할 수 있습니다.




'언어 > C' 카테고리의 다른 글

VSCODE 환경 C개발 환경  (0) 2019.03.27
[C] 파일 입·출력  (0) 2017.01.05
[C] 자기 참조 구조체와 연결리스트  (2) 2017.01.04
[C] 동적 메모리  (0) 2017.01.03
[C] 공용체  (0) 2016.12.27

파일 입·출력


 파일에 대한 개념은 잘 알고계실겁니다. 응용 프로그램 부터 시작해서 텍스트파일 엑셀파일 등 모든 파일이 파일에 속합니다. 지금까지 앞에서 공부했던 내용들만 가지고 프로그램을 짜보면 한번 실행하면 다시 또 처음부터 실행해야됩니다. 파일 입·출력을 이용하면 파일을 이용해서 입력을받거나, 프로그램에서 입력한 내용을 파일로 출력을 할 수 있습니다. 파일 입·출력은 <stdio.h>헤더파일을 인클루드 하면 사용할 수 있습니다.


 우선, 파일 입·출력 공부에 앞서 비쥬얼 스튜디오의 프로젝트 경로를 쉽게 확인할 수 있는 방법을 알려드리겠습니다. 파일의 입력, 출력을 하기위해서는 소스코드가 생성되는 프로젝트 경로를 알고 있어야합니다. 아래 그림처럼 프로젝트를 우클릭하고 "파일 탐색기에서 폴더 열기"를 누르면 소스코드가 있는 프로젝트의 경로가 열립니다.



파일 입력

 파일 입력은 파일 열기, 작업, 파일 닫기 세 단계로 구성됩니다. 파일 열기는 fopen()함수, 파일에서 값을 불러올때는 fscanf()함수 파일을 닫을때는 fclose()함수를 사용합니다. 파일을 열고나서 닫지 않으면, 다른 곳에서 해당파일에 접근할 수 가 없으므로 꼭 사용한 후에는 닫아줘야 합니다. 파일 입·출력에서는 파일 포인터를 사용합니다. 파일 포인터는 타입이 파일인 포인터 라고 생각하시면 됩니다.


- fopen()함수

 파일을 열 때 사용하는 함수입니다. 열 파일이 존재하지 않거나, 실패할 경우 NULL값을 반환합니다.

----------------------------------------------------------------------------------------

fopen(파일이름, 파일모드); // 파일모드 r(read)=읽기 w(write)=쓰기(파일 출력에 사용)

FILE *fp; // 파일포인터 선언

fp=fopen("test.txt","r"); // test.txt 파일을 읽기

----------------------------------------------------------------------------------------


- fscanf()함수

 fscanf()함수는 파일의 내용을 읽어올 때 사용하는 함수로, 파일 포인터를 인자값으로 사용한다는 점 외에는 scanf()함수와 유사합니다.

----------------------------------------------------------------------------------------

fscanf(파일 포인터, 포맷 문자열, 값1, 값2 ...);

FILE *fp; // 파일포인터 선언

int i;
fscanf(fp,"%d",&i);

----------------------------------------------------------------------------------------


- fclose()함수

 fclose()함수는 파일을 닫는 함수로, 열려있는 파일 포인터를 인수로 넘겨주면 파일을 닫는 역할을 합니다. 

----------------------------------------------------------------------------------------

fclose(파일 포인터);

FILE *fp; // 파일포인터 선언

fclose(fp);

----------------------------------------------------------------------------------------


 위 세 함수를 이용해서 "data.txt"라는 파일에 정수를 입력해서, "data.txt"파일을 입력 받고 정수를 출력하는 코드를 작성해 봤습니다. 이 때 "data.txt"처럼 사용 할 파일은 소스파일과 같은 경로에 있어야 합니다. 아래 그림은 "data.txt"입니다.

----------------------------------------------------------------------------------------

#include <stdio.h>

#include <stdlib.h>

#pragma warning(disable:4996)


int main()

{

int a,b; // 파일에서 읽어올 때 fscanf에 사용할 변수a와 반복문에 사용할 변수 b 선언

int *data; // 동적메모리에 사용할 정수형 포인터 선언

FILE *fp; // 파일포인터 fp 선언

fp = fopen("data.txt","r"); // "data.txt"파일 열기


if (fp != NULL) // 파일이 정상적으로 열렸을 때 if문실행

{

fscanf(fp,"%d",&a); // "data.txt"파일의 첫번째 값을 입력받아서

data = (int *)malloc(sizeof(int)*a); // 첫번째 값만큼 동적으로 정수형 배열을 만듭니다.

for (b = 0; b < a; b++) // 배열의 크기만큼 값을 입력 받음

{

fscanf(fp, "%d", &data[b]); 

}

fclose(fp); // 입력을 받은뒤에 파일닫기


for (b = 0; b < a; b++) // 입력받은 배열을 출력

{

printf("data[%d] : %d \n", b, data[b]);

}

free(data); // 메모리 반환

} //close if()


else{

printf("파일 입력받기 실패 \n"); 

}

}

----------------------------------------------------------------------------------------

 위 코드를 실행한 결과입니다. "data.txt"의 처음 값은 배열의 크기가 되고, 나머지 값들은 순차적으로 배열에 저장해서 출력했습니다.


파일 출력

 파일 출력은 두 가지로 나뉩니다. 기존 파일을 사용해서 출력하는 방법과 새로운 파일을 만들어서 출력하는 방법이 있습니다. 두 방법은 기존의 파일을 이용하는 점과 새로만든다는 점만 다를뿐 구현방법은 동일합니다. 파일 출력은 파일 입력과 동일하게 fopen()함수를 사용합니다. fscanf()함수와 반대로 fprintf()함수를 이용해 파일에 출력합니다.


- fopen()함수

 fopen()함수의 파일모드에는 r(read),w(write)외에도 a(append)가있습니다.

----------------------------------------------------------------------------------------

fopen()함수의 파일모드

- w = 해당 파일이 없으면 파일을 생성, 해당 파일이 있으면 내용을 덮어쓰기

- a = 해당 파일이 없으면 파일을 생성, 해당 파일이 있으면 파일의 끝부터 내용 추가

----------------------------------------------------------------------------------------


- fprintf()함수

 fprintf()함수는 파일에 문자열을 출력하는 함수로 파일 포인터를 인자값으로 사용한다는 점 외에는 printf()함수와 유사합니다.

----------------------------------------------------------------------------------------
FILE *fp;
fprintf(fp,"문자열 : %s \n",text);
----------------------------------------------------------------------------------------

 문자열이 아닌 자료형 등의 데이터를 읽고 쓰려면 어떻게 해야될까요? 이때는 2진수(binary)값을 직접 읽고 씁니다. fopen()함수의 기존 파일모드에 b를 붙여서 사용합니다. 바이너리 값을 읽고 쓸때에는 fread()함수와 fwrite()함수를 사용합니다.

----------------------------------------------------------------------------------------
fopen(“data.txt”, “rb”);
fopen(“data.txt”, “wb”);

size_t fread( void *ptr, size_t size, size_t nitems, FILE *stream); 
(파일에서 읽은 값을 저장할 포인터, 자료형의 크기, 자료형의 개수, 파일 포인터)
size_t fwrite( void *ptr, size_t size, size_t nitems, FILE *stream);
사용 방법은 동일하지만, 변수 포인터에 들어있는 값을 파일에 쓴다는점이 다릅니다.
----------------------------------------------------------------------------------------

아래 코드는 바이너리 값으로 구조체를 파일로 저장하고 읽어오는 코드입니다.

----------------------------------------------------------------------------------------

#include <stdio.h>

#include <stdlib.h>

#pragma warning(disable:4996)


struct Node{

int a;

double b;

};


int main()

{

struct Node *print;

FILE *fp;

fp = fopen("data.txt", "wb"); // 바이너리값으로 저장


print = (struct Node*)malloc(sizeof(struct Node));

print->a = 1;

print->b = 3.14;

fwrite((void*)print, sizeof(struct Node), 1, fp);

fclose(fp); // 파일 닫기

  free(print); // 메모리반환

}

----------------------------------------------------------------------------------------

 위 코드를 실행하면 도스창에는 아무런 문자열도 출력되지 않습니다.

 "data.txt"파일을 열어보면 아래 그림과 같이 1과 3.14가 아닌 깨진 문자들이 출력이 됩니다. 잘못 저장된걸까요?


 위에 저장된 "data.tx"t파일을 읽어와서 출력하는 코드입니다.

----------------------------------------------------------------------------------------

#include <stdio.h>

#include <stdlib.h>

#pragma warning(disable:4996)


struct Node{

int a;

double b;

};


int main()

{

struct Node *open;

FILE *fp;

fp = fopen("data.txt", "rb"); // 바이너리값으로 불러오기


open = (struct Node*)malloc(sizeof(struct Node));

fread((void*)open, sizeof(struct Node), 1, fp);


printf("open->a = %d \n", open->a);

printf("open->b = %.2lf \n", open->b);


fclose(fp); // 파일닫기

free(open); // 메모리반환


}

----------------------------------------------------------------------------------------

 위 코드의 실행결과입니다. 파일을 출력했을때의 값이 정상적으로 출력되는걸 확인할 수 있습니다.


* 출처 : 한국기술교육대학교 온라인평생교육원 C 프로그래밍_2 

          스타일 C프로그래밍 저.김종훈,김종진 출.WellBook




'언어 > C' 카테고리의 다른 글

VSCODE 환경 C개발 환경  (0) 2019.03.27
[C] 계좌 관리 프로그램  (2) 2017.01.10
[C] 자기 참조 구조체와 연결리스트  (2) 2017.01.04
[C] 동적 메모리  (0) 2017.01.03
[C] 공용체  (0) 2016.12.27

+ Recent posts