<변수>
'변수' 란 자료형의 값을 저장하는 공간을 말하며, 아래와 같은 a,b,c,를 변수라고 한다
a = 1
b = "python"
c = [1,2,3]
C언어나 JAVA처럼 변수의 자료형을 사용할 필요는 없으며, 파이썬은 변수에 저장된 값을 스스로 판단하여 자료형을 알아낸다.
위와같이 a에 1을 저장하게 되면, 1이라는 정수형 객체가 a라는 변수에 저장이 되며 변수 a는 객체가 저장된 메모리의 위치를 참조하는 레퍼런스 [ 참조 ] 역활을 한다.
한 마디로, 파이썬의 모든 자료형은 '상수' 가 아닌 객체이다. 따라서 1은 '정수형 객체'이며 1에 대한 정수형 객체가 따로 존재한다. 이때 변수를 생성하여 1을 저장하면 a는 1이라는 '정수형 객체'를 가리키는 [주소를 참조하는(?) ] 변수가 된다. 따라서 1을 저장하는 변수를 늘리면 그만큼 동일한 '정수형 객체'를 참조하는 변수의 수가 증가한다. [ 레퍼런스 카운트 ]
[변수를 만드는 방법들]
a,b = ('hi','bye') <- a,b에 튜플을 대입
(a,b) = 'hi', 'bye' <- 괄호를 제거한 튜플
[a,b] = ['hi, 'bye'] <- 리스트로 변수 생성
a=b='hi' <- 여러 개의 변수에 값을 대입
[변수의 삭제]
변수를 생성하면 그 변수형에 대한 객체가 생성된다. 그런데! 변수가 생성되게 되면 레퍼런스 카운트가 증가한다. 이 자료형에 대한 객체를 삭제하여 레퍼런스 카운트가 0이되면 그 자료형 객체는 메모리에서 사라지며 이를 가비지 콜렉션 이라고 한다.
a=3 // del(a) <- a가 참조하는 정수형 객체가 사라짐.
[리스트를 변수에 넣고 복사할 때]
변수에 리스트를 넣고 복사할 때, 리스트의 값을 수정하면 복사된 변수에 저장된 리스트의 값도 바뀐다!
a=[1,2,3]
b=a
a[1]=4
b = [1,4,3]
이렇게 되는 이유는 a와 b가 똑같은 리스트형 객체인 [1,2,3]을 가리키고 있었기 때문에 값이 수정되면 똑같이 바뀌게 된다. 그렇다면, b변수에 a와 같은 값을 가지도록 복사하면서 서로 다른 리스트를 가르키게 하는 방법은 뭘까?
- [:] 이용
a=[1,2,3]
b=a[:]
a[1]=4
b=[1,2,3] - copy모듈 이용
b=copy(a)
<제어문>
제어문은 C언어나 JAVA와 구조적으로 크게 차이가 없어 간단하게 요약했다.
[if문]
if 조건문:
수행할 문장1
수행할 문장2
...
else:
수행할 문장1
수행할 문장2
...
파이썬에서 else if 문은 elif문으로 사용된다. 수행할 문장의 경우에는 같은 깊이로 해야지 조건문에 포함된다.
조건문에서 참 거짓을 판단하는 문장들은 자료형마다 다른데, 숫자의 경우에는 0을 제외한 숫자는 참이며 문자열, 리스트, 튜플, 딕셔너리에서는 공백 null이 거짓이다.
[x in s, not in s]
1 in [1,2,3]
True
1 not in [1,2,3]
False
'a' in ('a','b','c')
True
'a' not in ('a','b','c')
False
위 보이는 예제와 같이, 리스트, 튜플, 문자열 안에 x값이 있는지 없는지에 대해서 in, not in을 사용하여 True 값과 False 값을 반환받는다.
[while문]
while 조건문:
수행할 문장1
수행할 문장2
수행할 문장3
조건문이 거짓이 될때까지 수행할 문장을 수행한다. while 반복문을 탈출하기 위해서는 break문을 사용하면 break 명령수행 후 while문을 탈출하게 된다.
[continue]
while문에서 조건에 맞지 않을 경우 맨 처음으로 돌아가게 하는 수행문으로 continue가 있다.
while 조건문:
수행할 문장1
조건1: continue <- 조건1에 대해서 만족하였을 경우, 조건문의 맨 처음으로 돌아게된다.
수행할 문장2
[for 문]
for 변수 in 리스트, 튜플, 문자열:
수행할 문장1
수행할 문장2
1. 전형적인 for문
test = ['one','two']
for i in test:
print(i)
one
two
test 리스트의 요소가 순서대로 변수 i에 대입된 후 print 문장을 수행한다.
2. 다양한 for문의 사용
test = [(1,2),(3,4),(5,6)]
for (first,last) in test:
print(first+last)
3
7
11
a 리스트의 요소값이 튜플이기 때문에 각각 요소들이 first, last 라는 변수에 저장된다.
3. for문과 함께 사용되는 range 함수
a = range(10)
a
range(0,10)
range(10)은 0부터 10 미만의 숫자를 표현하는 range 객체를 만들어 준다. [ 10은 포함하지 않음 ]
sum = 0
for i range(1,11):
sum = sum + 1 <- 1~10까지의 합을 저장
print(sum)
55
4. 리스트 안에 for문 포함하기
[표현식 for 항목 in 반복 가능 객체 (if 조건)]
<함수> - 중요
프로그램을 사용할때, 똑같은 내용을 반복해서 작성하는 번거로움을 돕기위해 함수를 사용한다. 즉 '반복되는 가치 있는 부분' 을 묶어서 어떠한 입력값을 주었을때 어떠한 결과값을 돌려준다는 식으로 함수를 작성하면 된다. 또한 함수를 작성하게되면, 프로그램의 흐름을 일목요연하게 볼 수 있다.
def 함수명(입력인수):
수행할 문장1
수행할 문장2
...
1. 입력값이 존재하는 함수
함수의 구조는 위와같은 형식으로 이루어진다.
def sum(a,b):
return a+b
매개변수 a,b에 값을 대입하면 a와 b의 합을 반환해주는 함수.
c = sum(a,b)
print(c)
c에 sum함수의 결과값을 대입하여 print문으로 출력할 수 있다.
2. 입력값이 없는 함수
def say():
return 'hi'
say함수처럼 입력값 없이 'hi' 문자열을 반환하는 함수도 있다.
3. 결과값이 없는 함수
def sum(a,b):
print("%d와 %d의 합은 %d이다." %(a,b,a+b))
결과값이 없는 함수는 return값, 즉 반환하는 값이 존재하지 않는다. 단순히 print문을 통해 원하는 수행문을 출력한다. 결과값을 반환하는 명령어는 오직 'return' 밖에없다.
a=sum(3,4)
print(a)
None
위와같은 식을통해 a가 None의 값을 가지는것으로 보아, sum함수는 결과값이 없다고 볼 수 있다.
4. 입력값, 결과값이 없는 함수
def say():
print('hi')
이 함수같은 경우에는 값을 전달받는 매개변수도, 반환하는 결과값도 없다.
5. 입력값에 제한이 없는 함수
def sum_many(*args)
sum = 0
for i in args:
sum = sum + i
return sum
매개변수앞에 *을 붙이면 입력값들을 전부 모아 튜플로 만들어준다. 이렇게 입력값들로 만든 튜플을 for문으로 실행해주어 입력값에 제한이 없는 합연산 함수를 만들 수 있다.
[함수의 결과값은 언제나 한개!]
def sum_and_mul(a,b):
return a+b,a*b
result = sum_and_mul(3,4)
위와같은 경우, 반환값이 2개이지만 오류가 발생하지 않는다. 그 이유는 결과값을 한개로 반환하기 위해서 2개의 리턴값을 튜플로 만들어 돌려준다.
result = (7,12) 와 같은 값을 갖게 된다.
sum,mul = (7,12) <- 튜플의 속성을 이용하여 2개의 값을 받을수도 있다.
그리고 return문을 2번쓸 경우 먼저 수행되는 return문을 수행하고 결과값을 반환한 후, 함수를 빠져나간다.
[함수값에 초깃값 미리 설정]
def say_myself(name,old,man=True):
print("나의 이름은 %s입니다." % name)
print("나이는 %d살입니다." % old)
if man:
print("남자입니다.")
else:
print("여자입니다.")
위와같이 초기값이 저장된 함수활용
say_myself("이원석",23) <- man변수에 입력값을 주지 않았지만 초깃값인 True를 가지게 된다.
say_myself("이원석",23,True)
둘다 동일한 결과를 출력한다.
초깃값을 설정할 때 주의해야할 점이 하나 있는데 바로 입력할 매개변수들중 항상 뒤쪽에 위치시켜야 한다.
def say_myself(name,man=True,old):
....
이와같이 순서를 배치하면 say_myself("이원석",23) 에서 23이라는 정수 자료형이 old에 들어가야하는지 man에 들어가야하는지 컴퓨터가 판단할 수 없기 때문이다.
say_myself("이원석",man,23) 과 같이 입력해도 되지않을까? 이미 컴퓨터에서는 man이 입력되지않아 발생하는 오류에 대해 미리 방지하기 위하여 1열에서 오류를 발생시킨다.
[global 명령어]
a=1
def test():
global a
a = a+1
C, JAVA와같이 함수안에서 사용된 매개변수는 함수를 탈출하게되면 사라진다. 그래서 return값으로 반환해주지 않으면 결과값이 저장되지 않는다.
그런데 global 명령어를 통해 함수안에서 외부의 변수를 지정해주면 외부변수를 직접해서 사용할 수 있다. [ 전역변수 선언과 비슷 ] 하지만 함수는 독자적으로 존재하는것이 좋으므로 굳이 외부변수에 종속적인 함수를 만드는것은 좋지 못하다.
<입-출력>
사용자가 입력한 값을 입력받고 출력해주는 함수
[ print(), input() ]
a=input()
hi python
a
hi python
간단히 입력받는 입력문
a=input("숫자를 입력하세요:")
숫자를입력하세요: 3
print(a)
3
프롬프트를 사용하여 값을 입력받는 입력문
<파일 읽고 쓰기>
[ 파일 생성하기 ]
f=open("새파일.txt",'w') <- 파일객체 = open(파일 이름, 파일 열기 모드)
f.close()
open 함수는 '파일이름'과 '파일 열기 모드'를 입력받고 결과 값으로 파일 객체를 돌려준다.
r | 읽기 모드 - 파일을 읽기만 할 때 사용 |
w | 쓰기 모드 - 파일에 내용을 쓸 때 사용 |
a | 추가 모드 - 파일의 마지막에 새로운 내용을 추가할 때 사용 |
f=open("C:/Python/새파일.txt",'w') <- 쓰기 모드로 새파일.txt를 생성한다.
for i range(1,11) <- 1~10까지 i에 대입한다.
data = "%d번째 줄입니다.\n" %i)
f.write(data) <- data를 파일 객체 f에 써라.
f.close() <- 파일 닫기
[ 파일 읽기 ]
f=open("새파일.txt",'r') <- 읽기 모드로 새파일.txt를 실행한다.
line = f.readline() <- readline 함수를통해 파일객체 f의 첫번째 줄을 읽고 line에 저장
print(line)
f.close()
- while문을 사용하여 모든 파일의 자료형 읽기
while True:
line = f.readline()
if no line: break
print(line)
모두 읽어 더 이상 읽을 문자가 없을때 break문을 통해 함수를 탈출한다.
- readlines() 함수를 이용하여 모든 파일의 자료형 읽기
f=open("새파일.txt",'r') <- 읽기 모드로 새파일.txt를 실행한다.
lines = f.readlines() <- readlines 함수를통해 파일객체 f의 모든 줄을 읽고 line에 저장
for line in lines:
print(line)
f.close()
- read() 함수를 이용하여 모든 파일의 자료형 읽기
f=open("새파일.txt",'r') <- 읽기 모드로 새파일.txt를 실행한다.
data = f.read() <- read 함수를통해 파일객체 f의 내용 전체를 문자열로 리턴
print(data)
f.close()
[ 파일에 새로운 내용 추가하기 ]
쓰기 모드 ('w')로 파일을 열 경우 기존의 파일의 내용이 모두 사라지게된다. 추가 모드 ('a')로 열게되면 기존의 내용을 유지하며 새로운 값을 추가할 수 있다.
f=open("새파일.txt",'a') <- 추가 모드로 새파일.txt를 실행한다.
for i in range(11,20)
data = "%d줄 입니다.\n" % i
f.write(data)
f.close()
[ with문 사용 ]
with open("새파일.txt","w") as f:
f.write("hi")
위와같이 with문을 이용하면 with블록을 벗어나는 순간 열린 파일 객체 f가 자동으로 close된다.
'전공수업 > Python' 카테고리의 다른 글
파이썬의 딕셔너리 (0) | 2020.03.03 |
---|---|
Python 기초문제 3,4,5,6번 (0) | 2019.11.01 |
파이썬 기본문법 - 1 (0) | 2019.10.30 |
Python 기초문제 1 , 2번 (0) | 2019.10.30 |