우리 FIS 아카데미 선발 과정에서 레벨 테스트가 있었다. 파이썬 문제가 나온다고 해서, 온라인 강좌를 찾아보다가, boostcourse 에서 '모두를 위한 파이썬'이라는 무료 강좌를 들었다.
해당 영상은 2021.02 에 올라온 것 같다. 외국인 교수의 코딩 강좌는 온라인과 오프라인을 통틀어서 처음 듣는 것이었는데, 단순히 파이썬의 예약어를 줄줄 설명하기 보다는 컴퓨터의 입장에서 처리되는 과정을 설명해주기 위해 애쓰는 모습이 인상 깊었다.
파이썬 입문 강좌이기는 하나, 프로그래밍이 처음이라면 자막과 내용을 동시에 보느라 버거울 수 있다. 나는 개발 전공자는 아니지만, 학부생때 C언어 기초를 수업으로 들었고, 스터디에서 책으로 파이썬 기초를 공부한 적이 있어 가뿐하게 들을 수 있었다.
숫자 표현식
** 제곱
% 나머지
연산자 우선순위
1. 괄호
2. 거듭제곱
3. 곱셉, 나눗셈, 나머지
4. 덧셈, 뺄셈
5. 왼쪽에서 오른쪽
자료형
정수와 문자의 구분
ex) ‘+’는 정수끼리는 덧셈이지만, 텍스트끼리는 문자열을 연결한다.
자료형 확인
type(변수), type(’hello’), type(1), type(1.0)
타입 변경
- int + float 이 만나면 float이 나온다.
print(float(99) + 100)
>> 199.0
- int / int는 float을 반환한다. (파이썬 2와 다른 부분)
print(10/2)
>> 5.0
- int // int는 int를 반환한다.
숫자로 구성된 문자열을 int로 변환
sval=’123’
ival=int(sval)
print(ival +1)
>> 124
input() 함수
- enter를 누를 때까지 입력 받는다.
- str 타입으로 입력 받는다.
nam = input()
nam = input(’이름을 입력해주세요.’)
print 함수
- ‘,’는 띄어쓰기
print(’What’,’are’,’you’,’doing?’)
>> What are you doing?
주석
’#’을 이용한다.
if문
if 조건: 참 일 경우 한 줄 실행문
if 조건:
(space 4번 또는 그와 동일한 tab)
참 일 경우 실행문 첫 줄
참 일 경우 실행문 둘째줄
elif 조건:
else:
비교연산자
- <= 이하
- == 같다
- >= 이상
- != 다르다
불리언/None 타입
- 참/거짓: true/false
- Null: None
is / is not 등의 논리 연산자
- is / is not
try / except
- try 블록에 문제가 생기면 except 블록을 실행.
- 문제가 발생할 구문에만 사용한다.
astr = ‘ Hello Bob’
try:
astr = int(astr)
except:
astr = -1
print(’First’, astr)
→ -1
함수
def 함수명(매개변수1, 매개변수2):
if 매개변수1 == ‘python’:
print(’Fun’)
return 리턴값
a=함수명(매개변수1, 매개변수2)
- Void함수: 리턴값 없음
- Fruitful함수: 리턴값 존재
while
n=5
while n > 0:
print(n)
n=n-1
print(’Blastoff!’)
print(n)
while True:
line = input(’> ’)
if line[0] == ‘#’
continue
if line == ‘done’:
break
print(line)
print(’Done!’)
for 유한루프
for i in [5, 4, 3, 2, 1]:
print(i)
print(’Blastoff!’)
friends = [’Joseph’, ‘Glenn’, ‘Sally’]
for f in friends:
print(’Happy New Year:’, friends)
print(’Done!’)
smallest = None
print(’Before’)
for value in [9, 41, 12, 3, 74, 15]:
if smallest is None:
smallest = value
elif value < smallest:
smallest = value
print(smallest, value)
print(’After’, smallest)
문자열
fruit = ‘banana’
letter = fruit[1] (문자열의 [x]는 문자일 뿐, [x]에 대입은 불가능 하다.)
print(letter)
→ a
len(fruit)
→ 6
for w in fruit:
print(w)
→ b
→ a
→ n
→ a
→ n
→ a
문자열 슬라이싱
(슬라이싱은 마지막 글자를 포함하지 않는다. 그 직전 글자까지 포함한다)
s=’Monty Python’
print(s[0:4])
→ Mont
print(s[:7]
→ Monty P
print(s[8:])
→ thon
print(s[:])
→ Monty Python
논리 연산자로서의 in (갖고 있는지 확인)
fruit = ‘banana’
‘n’ in fruit
→ True
‘m’ in fruit
→ False
문자열 비교
알파벳 순서대로 숫자를 부여한다.
대문자 다음이 소문자 이므로 대문자가 더 작다.
문자열 라이브러리
greet = ‘Hello Bob’
zap = greet.lower()
print(zap)
→ hello bob
print(’Hello Bob’.lower())
→ hello bob
print(zap.upper())
→ HELLO BOB
.find() - 문자열 위치 탐색
fruit = ‘banana’
pos = fruit.find(’na’)
print(pos)
→ 2
aa = fruit.find(’z’)
print(aa)
→ -1 (문자열을 찾지 못할 때 -1을 반환)
.replace() - 찾아서 바꾸기
greet = ‘Hello Bob’
nstr = greet.replace(’Bob’, ‘Jane’)
print(nstr)
→ Hello Jane
.strip() - 문자열 앞이나 뒤의 공백 제거
greet = ‘ Hello Bob ‘
print(greet.lstrip())
→ Hello Bob
print(greet.rstrip())
→ Hello Bob
print(greet.strip())
→ Hello Bob
개행 문자
stuff = ‘X\nY’
print(stuff)
→ X
→ Y
len(stuff)
→ 3
open() - 파일 핸들링
핸들 = open(파일명, 모드)
fhand = open(”mbox.txt’,’r’) #읽기 권한
fhand = open(’mbox.txt’) # 핸들에는 ‘\n’ 기준으로 배열 처리된다. 배열의 기준이 라인 기준이다.
count = 0
for line in fhand:
count = count + 1
print(’Line Count:’, count)
→ 100
.read() - 문자 단위로 ‘핸들’ 읽기
fhand = open(’mbox-short.txt’)
inp = fhand.read()
print(len(inp))
→ 4000
print(inp[:20])
→ abcdefghijklmnopqrst
startswith, in - 파일 내용(라인 단위) 탐색
True: .startswith(’From:’)
False: ‘@uct.ac.za’ in line
fhand = open(’mbox-short.txt’)
for line in fhand:
line = line.rstrip() #파일 안에 있는 개행 지우기
if line.startswith(’From:’):
print(line)
→ From: abdsd@uct.ac.za
→ From: adfe@uct.ac.za
→ …
fhand = open(’mbox-short.txt’)
for line in fhand:
line = line.rstrip()
if not ‘@uct.ac.za’ in line:
continue
print(line)
→ From: [david.horwitz@uct.ac.za](mailto:david.horwitz@uct.ac.za)
→ Author: [david.horwitz@uct.ac.za](mailto:david.horwitz@uct.ac.za)
→ …
컬렉션
변수 안에 여러 값을 넣을 수 있음.
변수 안에서 위치가 존재함.
- 리스트: 순서를 유지하는 값
- 딕셔너리: 고유의 라벨을 갖고 있음 (php_연관배열, java_속성, C#_속성가방
리스트
원소 변경이 가능한 컬렉션
[1, 24, 76]
[’red’, ‘yellow’, ‘blue’]
[’red’, 24, 98.6]
#리스트 안에 리스트가 존재하는 것도 가능
[1, [5,6], 7]
#빈리스트도 생성 가능
[]
튜플
원소 변경이 불가능한 컬렉션
(1, 2, 3)
리스트만 변경 가능
- 문자열 변수의 문자 변경 불가
fruit = ‘Banana’
fruit[0] = ‘b’
- 튜플 변경 불가
num = (1,2,3)
num[0] = 1
- 리스트는 변경 가능
lotto = [2,14,26,41,63]
lotto[2] = 28
print(lotto)
→ 2,14, 28, 41,63
len()
- 컬렉션의 원소 갯수를 반환한다.
- 문자열의 경우, 각 원소(문자)의 갯수를 반환하는 것과 같다.
range()
- 0부터 값보다 1작은 범위까의 숫자 범위를 반환한다. 리스트 형태는 아니다. 대입하거나, print함수를 사용해야 할 때는 list()를 사용해야 한다.
print( list( range(4) ) )
→ [0, 1, 2, 3]
- 특이사항은 for 문에서는 list()로 감싸지 않고 그대로 사용해도 된다.
for x in range(4)
+를 사용한 ‘컬렉션’ 연결
a = [1, 2, 3]
b = [4, 5, 6]
c = a + b
print(c)
→ [1, 2, 3, 4, 5, 6]
.append - ‘리스트’ 값 추가
stuff = list() #빈 리스트 만들기 stff = [] 를 사용해도 동일하다.
stuff.append(’book’)
stuff.append(99)
print(stuff)
→ [’book’, 99]
stuff.append(’cookie’)
print(stuff)
→ [’book’, 99, ‘cookie’]
.sort() - 1차원 ‘리스트’ 원소 정렬
friends = [’Joseph, ‘Glenn’, ‘Sally’]
friends.sort()
print(friends)
→ [’Glenn’, ‘Joseph’, ‘Sally’]
print(friends[1])
→ Joseph
리스트용 산술 함수
nums = [3, 41, 12, 9, 74, 15]
print(len(nums))
→ 6
print(max(nums))
→ 74
print(min(nums))
→ 3
print(sum(nums))
→ 154
print(sum(nums)/len(nums))
→ 25.6
.split() - 특정 문자로 자르기
abc = ‘With three words’
stuff = abc.split() # 콤마로 자르고 싶다면, abc.split(’,’)
print(stuff)
→ [’With’, ‘three’, ‘words’]
print(len(stuff))
→ 3
print(stuff[0])
→ With
dict() - 딕셔너리
purse = dict() # purse = {} 를 사용해도 된다.
purse[’money’] = 12 # 값을 추가하는 방법
purse[’candy’] = 3
purse[’tissues’] = 75 # 한 번에 입력하는 법 purse = {’money’: 12, ‘tissues’: 75, ‘candy’: 3}
print(purse) #딕셔너리는 어떤 순서로 나올지 알 수 없다.
→ {’money’: 12, ‘tissues’: 75, ‘candy’: 3}
print(purse[’candy’])
→ 3
purse[’candy’] = purse[’candy’] + 2
print(purse)
→ {’money’: 12, ‘tissues’: 75, ‘candy’: 5}
딕셔너리를 이용한 이름 갯수 세기 예제
counts = dict()
names = [’csev’, ‘cwen’, ‘csev’, ‘zqian’, ‘cwen’]
for name in names:
if name not in counts:
counts[name] = 1
else:
counts[name] = counts[name] + 1
print(counts)
#위 예제를 딕셔너리의 value를 반환하는 .get(키,초기값)을 사용하여 줄일 수 있다.
counts = dict()
names = [’csev’, ‘cwen’, ‘csev’, ‘zqian’, ‘cwen’]
for name in names:
counts[name] = counts.get(name, 0) + 1
print(counts)
딕셔너리 키와 값 출력
jjj = {’chuck’:1, ‘fred’:42, ‘jan’:100}
print( list(jjj) ) # 키 출력, for문에 사용할 때 인식하는 부분이 key이다
→ [’jan’, ‘chuck’, ‘fred’]
print( jjj.keys() } # 키 출력
→ [’jan’, ‘chuck’, ‘fred’]
print( jjj.values() ) # 값 출력
→ [100, 1, 42]
print(jjj.items()) #키와 값 출력
→ [(’jan’, 100), (’chuck’, 1), (’fred’, 42)] # 딕셔너리의 쌍을 튜플이라 한다.
.items()와 딕셔너리와 n개의 반복 변수
jjj = {’chuck’:1, ‘fred’:42, ‘jan’:100}
for aaa, bbb in jjj.items():
print(aaa, bbb)
튜플 (리스트보다 효율적으로 작동)
x = (’Glenn’, ‘Sally’, ‘Joseph’)
print(x[2])
→ Joseph
print(x)
→ (’Glenn’, ‘Sally’, ‘Joseph’)
튜플에서 사용할 수 없는 것
y=’ABC’
y[2] = ‘D’ → 오류
z=(3, 2, 1)
z.sort() → 오류
z.append(5) → 오류
z.reverse() → 오류 # list의 순서(위치값)를 뒤집어준다.
튜플에서 가능한 것
z.count(값) # 값의 갯수를 센다.
z.index(값) # 값의 위치를 알려준다.
(x, y) = (4, ‘fred’) # 튜플은 한 줄로 x와 y에 각각 대입이 가능하다.
d = dict()
d[’csev’] = 2
d[’cwen’] = 4
for (k,v) in d.tiems(): # 연속 변수는 튜플 형태다. ()는 생략 가능
print(k,v)
…
…
→ csev 2
→ cwen 4
tups = d.items()
print(tups)
→ dict_items( [ (’csev’, 2), (’cwen’, 4) ] ) # 딕셔너리의 items() 메소드는 (키, 값)을 튜플의 형태로 리턴한다.
튜플의 비교 (크기가 같은 값인 경우, 다음 값을 비교한다)
(0, 1, 2) < (5, 1, 2)
→ True # 0과 5를 비교 참이므로 비교 중지
(0, 1, 200000) < (0, 3, 4)
→ True # 첫번째가 같으므로 두번째 1과 3을 비교, 참이므로 비교 중지
(’Jones’, ‘Sally’) < (’Jones’, ‘Sam’)
→ True # 두번째 단어의 각 글자를 비교, l < m 이므로 참
(’Jones’, ‘Sally’) < (’adams’, ‘Sam’)
→ True # 첫번째 단어의 각 글자를 비교, J < a 이므로 대문자가 더 작으니 참
sorted(값) - 딕셔너리 오름차순 정렬
d = {’a’:10, ‘b’:1, ‘c’:22}
d.items()
→ dict_items( [ (’a’, 10), (’c’, 22), (’b’, 1) ] )
sorted( d.items() )
[ (’a’, 10), (’b’, 1), (’c’, 22) ] # 만약 같은 문자라면, 튜플의 두번째 값을 비교한다.
key와 value의 위치를 바꾸어, value기준의 정렬
c = {’a’:10, ‘b’:1, ‘c’:22}
tmp = list()
# for 반복문을 사용하여 튜플로 이루어진 리스트를 만들 수 있다.
for k, v in c.items():
tmp.append( (v, k) )
…
print(tmp)
→ [ (10, ‘a’), (22,’c’), (1,’b’) ]
# (키, 값) 형태의 튜플로 이루어진 리스트를 만들면 값을 기준으로 정렬할 수 있다.
tmp = sorted(tmp, reverse=True) # reverse=True 는 내림차순을 말한다.
print(tmp)
→ [ (22,’c’), (10, ‘a’), (1,’b’) ]
Value기준의 정렬. (짧은 구문: 리스트 컴프리헨션)
c = { ‘a’: 10, ‘b’: 1, ‘c’: 22}
print( sorted( [ (v, k) for k, v in c.items() ] ) )
→ [ (1,’b’), (10, ‘a’), (22,’c’) ]
Tags:
개인공부_코딩