2021. 1. 7. 11:23ㆍ교육과정/KOSMO
키워드 : 파이썬 STDio / 파이썬 set / 파이썬 dictionary / 파이썬 tuple / 파이썬 제어문 (if문) / 파이썬 반복문 (for문, while문) / 리눅스 접근권한 (사용권한 변경 / 소유권 변경) / 리눅스 프로세스 (작업관리자)
****
0. 파이썬 집합자료형
- list (순서가 있고, 중복 가능) (추출을 상세하게 해줄 수 있다.)
- set (순서가 없고, 중복 불가)
- dictionary ( JAVA map 방식 유사, JS json 방식 유사 ) (변환을 쉽게 할 수 있다)
- tuple
- 제어문
1. 파이썬 print( ) 함수
(1) print( ) 함수 사용시 + , 모두 사용 가능하며, 없어도 된다.
print('안녕'+'친구')
print('안녕','친구')
print('안녕''친구')
# 실행결과
'''
안녕친구
안녕 친구
안녕친구
'''
(2) 0~4 출력하기 (자동 개행)
for i in range(0,5):
print(i)
# 실행결과
'''
0
1
2
3
4
'''
(3) 2~7 출력하기 (개행 없이)
for i in range(2,8):
print(i, end=' ')
# 실행결과
'''
2 3 4 5 6 7
'''
for i in range(2,8):
print(i, end=',')
# 실행결과
'''
2,3,4,5,6,7,
'''
(3) 추가 - 마지막에 , 안 찍히게 하기
print('010', '1234', '5678', sep='-')
# 실행결과
'''
010-1234-5678
'''
※ print( ) 함수 안에서 if 제어문을 사용하여 콤마가 찍히는 범위를 조절할 수 있다.
for i in range(2, 8):
print(i, end=', ' if i < 5 else "")
for i in range(2, 8):
print(i, end=', ' if i < 7 else "")
for i in range(2, 8):
print(i, end=', ' if i < 8 else "")
# 실행결과
'''
2, 3, 4, 567
2, 3, 4, 5, 6, 7
2, 3, 4, 5, 6, 7,
'''
print(','.join(str(i) for i in range(2, 8)))
# 실행결과
'''
2,3,4,5,6,7
'''
2. CMD에서 파이썬 실행하기
(1) 파이참에서 실행해보면 맨 윗 라인에 파이썬 실행경로와 파일 경로가 먼저 출력됨을 확인할 수 있다.
C:\Users\kosmo_03\anaconda3\envs\aBasic\python.exe C:/Python/aBasic/a_datatype_class/Ex08_dictionary.py
(2) CMD 에서 파이썬을 실행하려면 우선 실행경로로 이동한다.
C:\Users\kosmo_03>cd C:\Users\kosmo_03\anaconda3\envs\aBasic
(3) 위 경로의 aBasic 폴더에는 파이썬 실행파일인 python.exe가 들어있다.
(4) python 이라고 입력하여 파이썬 실행하고 콘솔을 열 수 있다.
C:\Users\kosmo_03\anaconda3\envs\aBasic>python
Python 3.7.9 (default, Aug 31 2020, 17:10:11) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
Warning:
This Python interpreter is in a conda environment, but the environment has
not been activated. Libraries may fail to load. To activate this environment
please see https://conda.io/activation
Type "help", "copyright", "credits" or "license" for more information.
>>>
(5) 파이썬 코드를 입력하고 결과를 확인할 수 있다. 단, 1줄 단위로 수행한다.
>>> a=5
>>> print(a)
5
(6) 파이썬 실행을 종료하고 CMD 모드로 돌아가려면 Ctrl + Z를 입력한다.
>>> ^Z
C:\Users\kosmo_03\anaconda3\envs\aBasic>
(7) 확장자면이 .py 인 파이썬 파일을 실행하는 3가지 방법
① 파이썬 실행파일이 있는 위치에서 " python + .py 파일 경로 전체 " 입력
C:\Users\kosmo_03\anaconda3\envs\aBasic>python C:/Python/aBasic/a_datatype_class/Ex10_stdio.py
② .py 파일이 있는 경로로 이동 후 " python + .py 파일명 " 입력
C:\Users\kosmo_03\anaconda3\envs\aBasic>cd C:/Python/aBasic/a_datatype_class
C:\Python\aBasic\a_datatype_class>python Ex10_stdio.py
③ 아무 경로에서나 " 파이썬 실행파일 위치 + .py 파일 경로 전체 " 입력
C:\Python\aBasic\a_datatype_class>C:\Users\kosmo_03\anaconda3\envs\aBasic\python.exe C:/Python/aBasic/a_datatype_class/Ex10_stdio.py
3. 파이썬 명령행 매개변수 받기
※ 파이썬 명령행 매개변수 : JAVA의 main( ) 함수의 인자라고 생각하면 됨
※ 터미널에서 입력시 : python + 파일경로/ 파일명.py + 인자 1 + 인자2 + ...
python | a_datatype_class\Ex10_stdio.py | ourserver | scott | tiger | |
인자 0 | 인자 1 | 인자 2 | 인자 3 |
(1) Ex10_stdio.py 파일 작성
import sys
args = sys.argv[0:]
for i in args:
print(i)
print('서버 연결')
(2) 터미널에서 명령행 매개변수를 받도록 입력
(aBasic) C:\Python\aBasic>python a_datatype_class\Ex10_stdio.py ourserver scott tiger
(3) 실행결과
a_datatype_class\Ex10_stdio.py
서버 연결
ourserver
서버 연결
scott
서버 연결
tiger
서버 연결
4. 파이썬 집합 (Set)
# - 집합에 관련된 자료형 # - 순서를 지정하지 않는다 # - 중복을 허용하지 않는다 |
(1) 집합 만들기
#방법1
s = set() # 빈 집합을 생성
s = set([1,2,3,1,1])
print(s) # {1, 2, 3}
#방법2
s3 = {3,4,5,6}
print(s3) # {3, 4, 5, 6}
(2) 교집합 / 합집합 / 차집합
#교집합
print(s.intersection(s3)) # {3}
#합집합
print(s.union(s3)) # {1, 2, 3, 4, 5, 6}
#차집합
print(s-s3) # {1, 2}
#교집합
print(s & s3) # {3}
#합집합
print(s | s3) # {1, 2, 3, 4, 5, 6}
5. 파이썬 True 결정의 핵심 요소와 print( )출력
※ 숫자인 경우에 0 - False, 0이 아닌 숫자 - True
※ and와 or를 사용할 경우, True/False를 결정하는 핵심 요인이 어디에 있는냐에 따라 결과가 출력된다.
a = 10
b = -1
c = 0
if a and b:
print('True1')
if a or b:
print('True2')
# 실행결과
'''
True1
True2
'''
print(a and b) # -1 .. True인지 결정하는 핵심요소가 b이므로 b 출력
print(a or b) # 10 .. True인지 결정하는 핵심요소가 a이므로 a 출력
s = set([1,2,3,1,1]) ... {1, 2, 3}
s3 = {3,4,5,6}
print(s and s3) # {3, 4, 5, 6}
print(s3 and s) # {1, 2, 3}
print(s or s3) # {1, 2, 3}
print(s3 or s) # {3, 4, 5, 6}
6. 파이썬 dictionary 형
1- 키와 값으로 구성 ( 자바의 map 와 유사 ) 2- 저장된 자료의 순서는 의미 없음 3- 중괄호 {} 사용 4- 변경가능 ` 사전 . keys( ) : key만 추출 (임의의 순서) ` 사전 . values( ) : value만 추출 (임의의 순서) ` 사전 . items( ) : key와 value를 튜플로 추출 (임의의 순서) |
(1) 딕셔너리 생성과 요소 확인하기
① { } 안에 json 구조로 입력하여 생성한다.
dt = {1:'one', 2:'two', '3':'three', 1:'하나', 3:'셋'}
print(dt.keys())
print(dt.values())
print(dt.items())
print(dt)
print(dt[1])
print(dt['3'])
# 실행결과
'''
dict_keys([1, 2, '3', 3])
dict_values(['하나', 'two', 'three', '셋'])
dict_items([(1, '하나'), (2, 'two'), ('3', 'three'), (3, '셋')])
{1: '하나', 2: 'two', '3': 'three', 3: '셋'}
하나 .. 같은 key일 경우 나중 것으로 덮어쓰여짐
three
'''
② dict( ) 함수를 이용하여 생성한다.
dt3 = dict(one='하나', two='이')
print(dt3)
# 실행결과
'''
{'one': '하나', 'two': '이'}
'''
※ dict() 함수에는 key에 숫자, '' 사용할 수 없다.
※ dict() 자체가 자동으로 ''를 붙이기 때문
dt4 = dict(3='셋', 4='넷') # 에러 발생
dt5 = dict('one'='하나', 'two'='이') # 에러 발생
※ 키는 숫자와 문자 그리고 튜플이여야 한다. (리스트는 안 됨)
※ 리스트의 값이 변경 가능한데, 키값은 변경하면 안되므로 리스트는 키로 사용할 수 없다.
dt2 = {1:'one', 2:'two', (3,4):'tuple', }
print(dt2[1]) # one .. 키 값으로 숫자 사용
print(dt2['이']) # two .. 키 값으로 문자 사용
print(dt2[(3,4)]) # tuple .. 키 값으로 튜플 사용
# dt22 = {[5]:'list',} 는 에러 발생! .. 키 값으로 리스트를 사용할 수 없다.
(2) 딕셔너리 추가 및 수정
dt2 = {1:'one', 2:'two', (3,4):'tuple', }
# 하나 추가할 때 .. 딕셔너리에 추가할 key를 먼저 작성하고 그에 해당하는 값을 지정한다.
dt2['korea'] = 'seoul'
print(dt2)
dt2['korea'] = 'incheon'
print(dt2)
# 실행결과
'''
{1: 'one', 2: 'two', (3, 4): 'tuple', 'korea': 'seoul'}
{1: 'one', 2: 'two', (3, 4): 'tuple', 'korea': 'incheon'}
# ---> 'korea'는 기존에 쓰였던 key이므로 value가 수정된다.
'''
dt2 = {1:'one', 2:'two', (3,4):'tuple', }
# 여러개 추가할 때 .. dictionary 형식으로 함수 안에 작성해주면 여러 개가 추가된다.
dt2.update({ '3':'three', 4:'four', '오':'five'})
print(dt2)
# 실행결과
'''
{1: 'one', 2: 'two', (3, 4): 'tuple', 'korea': 'incheon', '3': 'three', 4: 'four', '오': 'five'}
'''
(3) 딕셔너리 key로 value 값 찾기
dt3 = dict(one='하나', two='이')
print(dt3['one'])
print(dt3.get('one'))
print(dt3.get(1))
print(dt3.get(1,'없음'))
# 실행결과
'''
하나 .. key값으로 value값 출력
하나 .. get( ) 함수는 key에 해당하는 value를 리턴한다.
None .. get( ) 함수는 찾으려는 key가 없을 경우 None을 리턴한다.
없음 .. get( ) 함수는 찾으려는 key가 없을 경우 리턴할 값을 지정할 수 있다
'''
7. 파이썬 튜플형
[튜플 자료형] 1- 리스트와 유사하지만 튜플은 값을 변경 못한다. 2- 각 값에 대해 인덱스가 부여 3- 변경 불가능 (*****) 4- 소괄호 () 사용 |
(1) 튜플 생성
① 소괄호 ( ) 를 사용하여 튜플 생성
t = (1, 2, 3)
print(t)
print(t[0])
# 실행결과
'''
(1, 2, 3)
1
'''
※ 빈 튜플 생성
t3 = ()
print(t3)
# 실행결과
'''
()
'''
② 괄호 없이 튜플 생성
→ 권장하지 않는 방법!!!!
리스트와 사용법이 동일하다보니 튜플인지를 생성하는 곳에서만 알 수 있기 때문에
나중에 혼동하지 않으려면 괄호 없이 튜플을 생성하지 않는 편이 좋다.
t2 = 4, 5, 6
print(t2[-1])
# 실행결과
'''
6
'''
(2) 튜플은 요소를 변경하거나 삭제할 수 없다.
t = (1, 2, 3)
# t[1] = 0 # 에러 발생 .. 일부 값 변경 불가
# del t[1] # 에러 발생 .. 일부 값 삭제 불가
del t # 정상 수행 .. 튜플 자체를 삭제
(3) 튜플 요소가 하나인 경우, 첫 번째 요소 뒤에 콤마( , )가 필수이다.
콤마가 없을 경우 튜플로 타입이 지정되지 않는다.
t2 = ('one')
print(t2) # one
print(t2[0]) # o
print(t2[1]) # n
print(t2[2]) # e
print(type(t2)) # <class 'str'> ... 괄호를 사용했지만 문자열로 타입이 지정됨
t3 = (1)
print(t3) # 1
#print(t3[0]) # 에러 발생 ... 숫자형이기 때문에 index가 없어서 에러 발생
print(type(t3)) # <class 'int'> ... 괄호를 사용했지만 숫자형으로 타입이 지정됨
t4 = ('one',)
print(t4) # ('one',)
print(t4[0]) # one
print(type(t4)) # <class 'tuple'>
t5 = (1,)
print(t5) # (1,)
print(t5[0]) # 1
print(type(t5)) # <class 'tuple'>
(4) 튜플의 인덱싱과 연산자
t1 = (1,)
t2 = (5, 6, 7)
print(t1 + t2)
print(t2 * 2)
print(t2[-1])
print(t2[1:])
# 실행결과
'''
(1, 5, 6, 7)
(5, 6, 7, 5, 6, 7)
7
(6, 7)
'''
(5) 튜플의 요소 풀기
: 튜플 요소의 갯수를 맞춰서 변수를 지정하면 각 값이 차례대로 할당된다. (갯수가 일치하지 않으면 에러 발생)
t5 = (1,2,3)
a,b,c = t5
print(a+b+c)
print(a,b,c)
# 실행결과
'''
6
1 2 3
'''
(6) 튜플과 리스트 변환
: 원본의 타입은 유지한채 print( ) 함수로 출력시에만 변환하여 출력할 수 있다.
: 원본의 타입을 변환하려면 변수를 지정해줘야 한다.
my_list = ['a', 'b', 'c']
my_tuple = ('z', 'y', 'x')
print(tuple(my_list)) # ('a', 'b', 'c') .. 튜플 형식으로 변환하여 출력(원본은 여전히 리스트)
print(list(my_tuple)) # ['z', 'y', 'x'] .. 리스트 형식으로 변환하여 출력(원본은 여전히 튜플)
# 완전히 변환하려면 변수를 지정해줘야 한다.
new_tuple = tuple(my_list)
print(type(new_tuple)) # <class 'tuple'>
print(new_tuple) # ('a', 'b', 'c')
※ 문자열을 튜플로 변환 vs 리스트를 튜플로 변환 (차이점)
test1 = 'one'
print(test1, type(test1))
test2 = ['one']
print(test2, type(test2))
test3 = tuple('one')
print(test3, type(test3))
test4 = tuple(['one'])
print(test4, type(test4))
# 실행결과
'''
one <class 'str'>
['one'] <class 'list'>
('o', 'n', 'e') <class 'tuple'>
('one',) <class 'tuple'>
'''
8. 파이썬 제어문
- 파이썬은 들여쓰기를 하여 블록{}을 대신 표현한다 - 들여쓰기는 탭과 공백을 섞어 쓰지 말자 [ex] if a>b: print(a) print(b) => 에러발생 .. print(b)는 print(a)의 부속이 아니기 때문! (1) if 문 if 조건식A : 문장들 elif 조건식B : 문장들 또는 pass else : 문장들 ` 조건식이나 else 뒤에는 콜론(:) 표시 ` 조건식에 ( ) 괄호 필요없다 ` 실행할 코드가 없으면 pass ` 파이썬은 switch 문 없음 |
(1) 거짓(False)의 값
i = 0 i2 = 0.0 i3 = "" i4 = str() i5 = list() i6 = tuple() i7 = set() i8 = dict() i9 = {} i10 = None |
※ i = 0으로 False일 때 not을 할 경우, 결과적으로 True가 된다.
i = 0
if not i:
print('True2')
# 실행결과
'''
True2 ..
'''
※ and에서 T/F 판단시 핵심요소가 i 이므로 i가 출력되며
if 제어문의 결과는 False이므로 True3은 출력되지 않는다.
i = 0
a = 2
print(a and i)
if a and i:
print('True3')
# 실행결과
'''
0
'''
(2) 파이썬에서의 블럭은 들여쓰기를 기준으로 구성된다.
a = 10
if a: # 숫자만으로도 T/F가 결정될 수 있어서 if 문에 넣을 수 있음
c = 2
elif i10:
c = 5
else:
c = 7
print(c)
# 실행결과
'''
2
'''
(3) 제어문에서 find( ) 함수로 값이 있는지 확인하기
- find( ) : 단어를 찾으면 해당 인덱스를 리턴하고 못 찾으면 -1을 리턴
- 단순히 제어문 안에서 find( ) 함수를 사용할 경우,
인덱스가 0일 경우에는 출력이 되지 않아버리고,
값이 없어서 인덱스가 -1일 경우에는 출력이 되어버리는 문제가 있다.
word = 'korea'
if word.find('k'):
print('1>' + word) # if문의 결과가 0이 리턴되므로 False가 되버려서 출력되지 않음
if word.find('z'):
print('2>' + word) # if문의 결과가 -1이 리턴되므로 True가 되버려서 z가 word 안에 없음에도 불구하고 출력됨
# 실행결과
'''
2>korea
'''
※ 해결방법
# 해결법 0
if word.find('z') > -1:
print('3>' + word)
# 해결법 1
if word.find('z') != -1:
if word.index('z') == word.find('z'):
print('4>' + word)
else:
print('해당 단어 없음')
# 해결법 2 .. k와 z는 구분하지만, orea는 출력이 안 되는 문제가 아직 있음
if not word.find('z'):
print('5>' + word)
# 해결법 3
if (word.find('z')+1):
print('6>'+word)
# 해결법 4
if word.find('z') <= 0:
print('7>' + word)
if word.find('a') > 0:
print('8>' + word)
# 해결법 5
if word.find('z') >= 0:
print('8>' + word)
else:
print('못찾음')
# 해결법 6
if word.find('a')+1:
print('10>' + word)
9. 파이썬 반복문
(2) for문 for <타켓변수> in 집합객체 : 문장들 else: 문장들 ` 반복문 뒤에 else는 반복하는 조건에 만족하지않으면 실행 (반복이 한 번도 되지 않을 경우) (3) while 문 while 조건문 : 문장들 else : 문장들 (+) # a = 1 # while True: # 무한루프 # if a == 1: # print(a) # break |
a = 112 # 숫자형
b = ['1','2','3'] # 리스트
c = '987' # 문자열
d = tuple(b) # 튜플 d = ('1', '2', '3')
e = dict(k=5, j=6) # 딕셔너리 e = { 'k':5, 'j':6 }
※ a~e까지 for문의 집합객체로 넣을 경우, a만 반복문이 작동할 수 없어 에러 발생한다.
for entry in b:
print(entry)
# 실행결과
'''
1
2
3
'''
for entry in e:
print(entry)
# 실행결과
'''
k
j
'''
※ dictionary는 key만 출력되므로 value를 출력하기 위해서는
for entry in e:
print(e[entry])
# 실행결과
'''
5
6
'''
또는
for entry in e.items():
print(entry)
# 실행결과
'''
('k', 5) ('j', 6)
'''
※ [연습] 1부터 10까지의 합을 출력하기
sum = 0
for i in range(1,11):
sum += i
print(sum)
# 실행결과
'''
55
'''
※ [연습] 1부터 10까지 홀수의 합을 출력
sum = 0
for i in range(1,11,2):
sum += i
print(sum)
# 실행결과
'''
25
'''
※ 2단부터 9단까지 이중 반복문으로 출력
# 방법 1
for i in range(2,10):
for j in range(1,10):
print('{} * {} = {}'.format(i,j,j*i))
print('')
# 실행결과
'''
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6 .......
...
# 방법 2
for dan in range(2,10):
for su in range(1,10):
print('{} * {} = {}'.format(dan,su,dan*su))
# 실행결과
'''
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6...
'''
# 방법 3
for i in range(2, 10):
for j in range(1, 10):
print(i, '*', j,'=', i*j, end=" ")
print()
# 실행결과
'''
2 * 1 = 2 2 * 2 = 4 2 * 3 = 6 2 * 4 = 8 2 * 5 = 10 2 * 6 = 12 2 * 7 = 14 2 * 8 = 16 2 * 9 = 18
3 * 1 = 3 3 * 2 = 6 3 * 3 = 9 3 * 4 = 12 3 * 5 = 15 3 * 6 = 18 3 * 7 = 21 3 * 8 = 24 3 * 9 = 27
4 * 1 = 4 4 * 2 = 8 4 * 3 = 12 4 * 4 = 16 4 * 5 = 20 4 * 6 = 24 4 * 7 = 28 4 * 8 = 32 4 * 9 = 36
'''
# 방법 4
for i in range(1, 10):
for j in range(2, 10):
print("%d x %d = %2d " %(j, i, i*j), end="");
print();
# 실행결과
'''
2 x 1 = 2 3 x 1 = 3 4 x 1 = 4 5 x 1 = 5 6 x 1 = 6 7 x 1 = 7 8 x 1 = 8 9 x 1 = 9
2 x 2 = 4 3 x 2 = 6 4 x 2 = 8 5 x 2 = 10 6 x 2 = 12 7 x 2 = 14 8 x 2 = 16 9 x 2 = 18
2 x 3 = 6 3 x 3 = 9 4 x 3 = 12 5 x 3 = 15 6 x 3 = 18 7 x 3 = 21 8 x 3 = 24 9 x 3 = 27
'''
# 방법 5
for dan in range(1, 10):
for number in range(2, 10):
print('{} * {} = {:2d}'.format(number, dan, number * dan), end=' | ')
print()
# 실행결과
'''
2 * 1 = 2 | 3 * 1 = 3 | 4 * 1 = 4 | 5 * 1 = 5 | 6 * 1 = 6 | 7 * 1 = 7 | 8 * 1 = 8 | 9 * 1 = 9 |
2 * 2 = 4 | 3 * 2 = 6 | 4 * 2 = 8 | 5 * 2 = 10 | 6 * 2 = 12 | 7 * 2 = 14 | 8 * 2 = 16 | 9 * 2 = 18 |
2 * 3 = 6 | 3 * 3 = 9 | 4 * 3 = 12 | 5 * 3 = 15 | 6 * 3 = 18 | 7 * 3 = 21 | 8 * 3 = 24 | 9 * 3 = 27 |
'''
※ 조건문과 반복문 연습문제
(1) 다음 코드의 실행 결과를 쓰시오.
fruit = 'apple'
if fruit == 'Apple':
fruit = 'Apple'
elif fruit == 'fruit':
fruit = 'fruit'
else:
fruit = fruit
print(fruit)
답 :
apple
(풀이)
fruit = 'apple'
print(fruit) # apple
if fruit == 'Apple':
fruit = 'Apple' # False
elif fruit == 'fruit':
fruit = 'fruit' # False
else:
fruit = fruit # else문에서는 같은 값을 대입한다.
print(fruit)
#-------------------------------------------------------------------------
fruit = 'apple'
print(fruit) # apple
if fruit == 'apple':
fruit = 'Apple'
print(fruit) # Apple
(2) 다음 코드의 실행 결과를 쓰시오.
number = ["1", 2, 3, float(4), str(5)]
if number[4] == 5:
print(type(number[0]))
elif number[3] == 4:
print(number[2:-1])
답 :
[3, 4.0]
(3) 다음 코드의 실행 결과를 쓰시오.
num = 0
i = 1
while i < 8:
if i % 3 == 0:
break
i += 1
num += i
print(num)
답 :
5
(풀이)
num | i | if i % 3 == 0 | break? | i += 1 | num += i |
0 | 1 | False | X | i = 2 | num = 2 |
2 | 2 | False | X | i = 3 | num = 5 |
5 | 3 | True | O |
(4) 다음 코드의 실행 결과를 쓰시오.
result = 0
for i in range(5, -5, -2):
if i < -3:
result += 1
else:
result -= 1
print(result)
답 :
-5
(풀이)
if |
else | ||||
result | i | if < -3 | result += 1 | result -= 1 | result |
0 | 5 | False | result = -1 | -1 | |
-1 | 3 | False | result = -2 | -2 | |
-2 | 1 | False | result = -3 | -3 | |
-3 | -1 | False | result = -4 | -4 | |
-4 | -3 | False | result = -5 | -5 |
(5) 다음 코드의 실행 결과를 쓰시오.
num = ""
for i in range(10):
if i <= 5 and (i % 2)==0:
continue
elif i is 7 or i is 10:
continue
else:
num = str(i) + num
print(num)
답 :
986531
(풀이)
if |
elif | else | |||||
num | i | i <= 5 ? | ( i % 2 ) == 0 ? | i is 7 ? | i is 10 ? | num = str( i ) + num | num |
"" | 0 | True | True | "" | |||
"" | 1 | True | False | False | False | num = 1 + "" | 1 |
1 | 2 | True | True | 1 | |||
1 | 3 | True | False | False | False | num = 3 + 1 | 31 |
31 | 4 | True | True | 31 | |||
31 | 5 | True | False | False | False | num = 5 + 31 | 531 |
531 | 6 | False | False | False | num = 6 + 531 | 6531 | |
6531 | 7 | False | True | 6531 | |||
6531 | 8 | False | False | False | num = 8 + 6531 | 86531 | |
86531 | 9 | False | False | False | num = 9 + 86531 | 986531 |
(6) 다음 코드의 실행 결과를 쓰시오.
coupon = 0
money = 20000
coffee = 3500
while money > coffee:
if coupon < 4:
money = money - coffee
coupon += 1
else:
money += 2800
coupon = 0
print(money)
답 :
1800
(풀이)
while | if | else | ||||
money | money > coffee ? | coupon < 4 ? | money = money - coffee | coupon += 1 | money += 2800 | coupon = 0 |
20000 | True | True | 16500 = 20000 - 3500 | 1 | ||
16500 | True | True | 13000 = 16500 - 3500 | 2 | ||
13000 | True | True | 9500 = 13000 - 3500 | 3 | ||
9500 | True | True | 6000 = 9500 - 3500 | 4 | ||
6000 | True | False | 6000 + 2800 | 0 | ||
8800 | True | True | 5300 = 8800 - 3500 | 1 | ||
5300 | True | True | 1800 = 5300 - 3500 | 2 | ||
1800 | False |
(7) 다음과 같이 코드를 작성했을 때, 실행 결과로 알맞은 것은?
list_data_a = [1, 2]
list_data_b = [3, 4]
for i in list_data_a:
for j in list_data_b:
result = i + j
print(result)
➀ 20 ➁ 6 ➂ [13, 14, 23, 24] ➃ [4, 5, 5, 6] ➄ Error
답 : ② 6
(풀이)
print(type(list_data_a))
print(type(list_data_a[0]))
# 실행결과
'''
<class 'list'>
<class 'int'>
'''
list_data_a와 list_data_b는 리스트형이지만,
각 리스트 안의 요소는 숫자형이므로 반복분에서 합 연산을 할 경우
result = i + j
4 = 1 + 3
5 = 1 + 4
5 = 2 + 3
6 = 2 + 4
result는 반복문을 돌 때마다 매 번 새롭게 지정되므로 최종 연산 결과인 6이 출력된다.
10. 리눅스 복습
- 하드링크(복사본)과 심볼릭링크 |
: 원본파일과 하드링크는 같은 inode값을 갖는다. ( inode는 id도 아니고 주소도 아니므로 혼동 X) |
ln 원본파일명 하드링크명
ln -s 원본파일명 심볼릭링크명
- 사용자 관리 |
# 사용자 추가
useradd 사용자명
# 사용자 제거
userdel 사용자명 # (자동생성된 홈 디렉토리는 남아있음)
userdel -r 사용자명 # (홈 디렉토리도 삭제)
# 비밀번호 지정
passwd 비밀번호
# 그룹 추가
groupadd 그룹명
# 사용자추가 (그룹 지정)
useradd -g 그룹명 사용자명
# 사용자 계정 확인
/etc/passwd
# 사용자 비밀번호 확인
/etc/shadow
※ 계정관리 연습문제
(1) 사용자 계정 pro_001과 pro_002 계정을 새로 생성하기
[root@localhost ~]# useradd pro_001
[root@localhost ~]# useradd pro_002
(2) 새로 생성한 2개의 사용자 계정이 홈 디렉토리에 존재하는지 확인하기
[root@localhost ~]# ll /home
drwx------. 3 pro_001 pro_001 78 1월 8 06:28 pro_001
drwx------. 3 pro_002 pro_002 78 1월 8 06:28 pro_002
(3) professor 그룹에 사용자 계정 pro_001 계정을 추가 지정하기 ( professor 그룹이 없으면 생성 )
[root@localhost ~]# groupadd professor
[root@localhost ~]# usermod -g professor pro_001
(4) professor 그룹에 사용자 계정 pro_002 계정을 추가 지정하기
[root@localhost ~]# usermod -g professor pro_002
(5) 사용자 계정 pro_001과 pro_002 계정에 지정된 그룹 정보 확인하기
[root@localhost ~]# groups pro_001 pro_002
pro_001 : professor
pro_002 : professor
11. 접근권한 (★★★★★)
ex)
소유자 | 동일그룹자 | 기타사용자 | |||
- | rw- | --- | --- | : 파일 | : 소유자만 읽고 쓸 수 있으며 그 외에는 권한 없음 |
d | rwx | r-x | r-x | : 디렉토리 | : 소유자가 아닐 경우 수정이 안 된다는 의미 |
l | rwx | r-- | rw- | : 심볼릭링크 | : 소유자는 모든 권한이 있고, 동일그룹자는 읽기만, 기타사용자는 읽고 쓰기만 가능 |
# 사용권한 변경
chmod 숫자기호 적용파일명
※ 숫자를 이용한 접근권한 지정
rwx | 111 | 7 | 읽기, 쓰기, 실행 |
rw- | 110 | 6 | 읽기, 쓰기 |
r-x | 101 | 5 | 읽기, 실행 |
r-- | 100 | 4 | 읽기 |
-wx | 011 | 3 | 쓰기, 실행 |
-w- | 010 | 2 | 쓰기 |
--x | 001 | 1 | 실행 |
--- | 000 | 0 | 권한 없음 |
※ 숫자모드를 이용한 접근권한 변경 실습 - ①
[root@localhost ~]# cd test
[root@localhost test]# pwd
/root/test
(1) centos.txt 파일의 상세정보를 출력하여 접근권한 상태 확인하기
[root@localhost test]# touch centos.txt
[root@localhost test]# ll centos.txt
-r-xrwxr-x. 1 root root 0 1월 8 00:04 centos.txt
(2) centos.txt 파일에 부여된 접근권한 rwx r-x r-x 에서 그룹의 쓰기 권한을 제거하기 (r-x r-x r-x로 만들기)
[root@localhost test]# chmod 555 centos.txt
# 또는
[root@localhost test]# chmod 5 5 5 centos.txt
(3) centos.txt 파일의 변경된 접근권한 r-x r-x r-x 에서 그룹의 접근권한에 쓰기 권한을 부여하기 (r-x rwx r-x로 만들기)
[root@localhost test]# chmod 575 centos.txt
# 또는
[root@localhost test]# chmod 5 7 5 centos.txt
※ 숫자모드를 이용한 접근권한 변경 실습 - ②
[root@localhost ~]# cd test
[root@localhost test]# pwd
/root/test
(1) 새로운 빈 파일 today.txt 생성하기
[root@localhost test]# touch today.txt
# 또는
[root@localhost test]# cat > today.txt
Ctrl + D
>는 앞에 있는 무언가를 뒤에 전달한다는 의미이다.
cat > 는 읽은게 없고, 이를 today.txt에 전달하므로 빈 파일이 생성된다.
Ctrl + D는 작성모드에서 저장하며 빠져나오는 명령어이다.
(2) today.txt 파일에 설정되어 있는 접근권한 출력하기
[root@localhost test]# ll today.txt
-rw-r--r--. 1 root root 0 1월 8 07:46 today.txt
(3) today.txt 파일에 대한 접근권한을 숫자모드를 이용하여 rwx rwx r-x로 변경하기
[root@localhost test]# chmod 775 today.txt
(4) 접근권한이 변경된 today.txt 파일의 접근권한 출력하기
[root@localhost test]# ll today.txt
-rwxrwxr-x. 1 root root 0 1월 8 07:46 today.txt
(5) today.txt 파일의 삭제 여부를 물어가며 삭제하기
[root@localhost test]# rm -i today.txt
rm: remove 일반 빈 파일 `today.txt'? y
# 사용권한 변경
chmod 심볼릭기호 적용파일명
※ 심볼릭(기호)를 이용한 접근권한 지정
사용자 카테고리 문자 | u (user) | 파일 소유자 |
g (group) | 파일 소유자가 속한 그룹 | |
o (other) | 파일 소유자와 그룹 이외의 기타 사용자 | |
a (all) | 파일을 사용하려는 전체 사용자 | |
연산자 기호 | + | 파일 접근 권한 부여 |
- | 파일 접근 권한 제거 | |
= | 파일 접근 권한 설정 ( ex. u=rwx : 사용자에게 모든 권한을 부여) | |
접근권한 문자 | r | 파일 읽기 권한 |
w | 파일 쓰기 권한 | |
x | 파일 실행 권한 |
※ 심볼릭 모드에서 다양한 파일 접근 권한 조합
u+w | 파일 소유자에게 쓰기 권한 부여 |
u-w | 파일 소유자에게 쓰기 권한 제거 |
u=rwx | 파일 소유자에게 읽기, 쓰기, 실행 권한 설정 |
u+x, go_w | 소유자에게 실행 권한 부여, 그룹 및 기타 사용자에게 쓰기 권한 부여 |
g+w | 파일 그룹에게 쓰기 권한 부여 |
g+wx | 파일 그룹에게 쓰기, 실행 권한 부여 |
go+w | 그룹과 기타 사용자에게 쓰기 권한 부여 |
+wx | 파일의 모든 사용자에게 쓰기, 실행 권한 부여 |
a+rwx | 모든 사용자에게 읽기, 쓰기, 실행 권한 부여 |
o-r | 기타 사용자에게 읽기 권한 제거 |
※ 심볼릭 모드를 이용한 접근권한 변경 실습 - ①
(1) 파일 생성
[root@localhost test]# touch centos2.txt
(2) 현재 접근 권한 보기
[root@localhost test]# ll centos2.txt
-rw-r--r--. 1 root root 0 1월 8 00:44 centos2.txt
(3) 파일 사용자의 쓰기 권한을 제거하기 위해 접근 권한을 변경
[root@localhost test]# chmod u-w centos2.txt
(4) 변경된 접근 권한 보기
[root@localhost test]# ll centos2.txt
-r--r--r--. 1 root root 0 1월 8 00:44 centos2.txt
(5) centos2.txt 파일의 그룹에 실행 권한을 부여하기
[root@localhost test]# chmod g+x centos2.txt
[root@localhost test]# ll centos2.txt
-r--r-xr--. 1 root root 0 1월 8 00:44 centos2.txt
(6) centos.txt 파일 소유자에게 쓰기 권한을 부여하고 그룹의 쓰기 권한을 제거하기
[root@localhost test]# chmod u+2,g-w centos2.txt
[root@localhost test]# ll centos2.txt
-rw-r-xr--. 1 root root 0 1월 8 00:44 centos2.txt
※ 심볼릭 모드를 이용한 접근권한 변경 실습 - ②
(1) "나는 리눅스마스터입니다" 라는 내용을 story.txt 파일명으로 저장하기
[root@localhost test]# cat > story.txt
나는 리눅스마스터입니다
Ctrl + D
# 또는
[root@localhost test]# vi story.txt
i
나는 리눅스마스터입니다
ESC
:wq
(2) story.txt 파일의 현재 설정된 접근 권한 출력하기
[root@localhost test]# ll story.txt
-rw-r--r--. 1 root root 35 1월 8 01:10 story.txt
(3) story.txt 파일의 접근권한을 심볼릭 모드로 파일 소유자에게 실행권한과 그룹 및 기타사용자에게 쓰기 권한 부여하기
[root@localhost test]# chmod u+x,g+w,o+w story.txt
(4) story.txt 파일에 변경된 접근권한 출력하기
[root@localhost test]# ll story.txt
-rwxrw-rw-. 1 root root 35 1월 8 01:10 story.txt
(5) story.txt 파일의 접근권한을 심볼릭 모드로 파일 그룹 및 기타사용자에게 쓰기 권한 제거하기
[root@localhost test]# chmod g-w,o-w story.txt
(6) story.txt 파일에 변경된 접근권한 출력하기
[root@localhost test]# ll story.txt
-rwxr--r--. 1 root root 35 1월 8 01:10 story.txt
# 소유권 변경
chown 계정명 적용파일(또는디렉토리)
chown 계정명:그룹명 적용파일(또는디렉토리)
[root@localhost test]# cd /home
[root@localhost test]# pwd
/home
(1) centos 디렉토리에 abc라는 새 디렉토리 생성 후 결과 출력하기
[root@localhost home]# mkdir /home/centos/abc
[root@localhost home]# ll centos/
drwxr-xr-x. 2 root root 6 1월 8 01:37 abc
drwxr-xr-x. 2 root root 21 1월 6 00:08 test
(2) abc 디렉토리의 소유자를 centos 계정으로 변경 후 결과 출력하기
[root@localhost home]# chown centos /home/centos/abc
[root@localhost home]# ll centos/
drwxr-xr-x. 2 centos root 6 1월 8 01:37 abc
drwxr-xr-x. 2 root root 21 1월 6 00:08 test
(3) test 디렉토리의 소유자와 그룹을 centos 계정으로 변경 후 결과 출력하기
[root@localhost home]# chown centos:centos /home/centos/test
[root@localhost home]# ll centos/
drwxr-xr-x. 2 centos root 6 1월 8 01:37 abc
drwxr-xr-x. 2 centos centos 21 1월 6 00:08 test
12. 리눅스 프로세스
: 리눅스에서 프로세스는 윈도우의 작업관리자에 해당되며, 터미널에서 ps 명령어를 통해 확인할 수 있다.
# 프로세스 상세 확인
[root@localhost ~]# ps -e
# 프로세스 간단 확인
[root@localhost ~]# ps -f
# 프로세스 종료 (데이터 저장 후 종료)
kill PID
또는
kill -15 PID
# 프로세스 강제종료 (데이터 저장 X 종료)
kill -9 PID
(1) gedit 실행 후 프로세스의 PID를 이용하여 종료하기 (terminate)
# 터미널1
[root@localhost ~]# gedit
# 터미널2
[root@localhost ~]# ps -e
5124 pts/0 00:00:00 gedit
# gedit의 id가 5124로 확인됨
[root@localhost ~]# kill 5124
# 터미널1
[root@localhost ~]# gedit
종료됨
(2) gedit 실행 후 프로세스의 PID를 이용하여 강제종료하기 (sigkill)
# 터미널1
[root@localhost ~]# gedit
# 터미널2
[root@localhost ~]# ps -e
5201 pts/0 00:00:00 gedit
# gedit의 id가 5201로 확인됨
[root@localhost ~]# kill -9 5201
# 터미널1
[root@localhost ~]# gedit
죽었음
(3) yes 명령으로 무한루프 실행 후 프로세스의 PID를 이용하여 강제종료하기 (sigkill)
# 터미널1
[root@localhost ~]# yes
y
y
y
...
# 터미널2
[root@localhost ~]# ps -e
5250 pts/0 00:00:00 yes
# yes의 id가 5250로 확인됨
[root@localhost ~]# kill -9 5250
# 터미널1
[root@localhost ~]# yes
y
...
y
죽었음
(4) yes 명령을 빈 장치로 보내는 무한루프 실행 후 프로세스의 PID를 이용하여 강제종료하기 (sigkill)
# 터미널1
[root@localhost ~]# yes > /dev/null
# 터미널에 별도 표기 없이 빈 장치로 yes를 무한히 보내는 중
# 터미널2
[root@localhost ~]# ps -e
5282 pts/0 00:00:00 yes
# yes의 id가 5282로 확인됨
[root@localhost ~]# kill -9
# 터미널1
[root@localhost ~]# yes > /dev/null
죽었음
(5) 화면 너머 백그라운드에서 무한루프 실행하도록 yes 명령 후 PID를 이용하여 강제종료하기 (sigkill)
# 터미널1
[root@localhost ~]# yes > /dev/null &
[2] 5365
# 화면 너머 백그라운드에서 작동하는 중
# 터미널2
[root@localhost ~]# ps -e
5365 pts/0 00:00:00 yes
# yes의 id가 5365이고 작동중으로 확인됨
[root@localhost ~]# kill -9 5365
# 터미널1
[root@localhost ~]# yes > /dev/null &
[2] 5365
# 따로 표시되지 않음
# 터미널2
[root@localhost ~]# ps -e
# yes가 더 이상 보이지 않음
(6) 현재 실행중인 프로세스의 상태를 확인하려면
ps -aux
STAT 을 확인
R : run
S : sleep
Z : zombie (부모 프로세스 없이 자식만 남아서 정상 구동되지 않는 것을 좀비 프로세스라고 함)
→ STAT이 z인 항목은 찾아서 sigkill 시켜야 한다.