강의노트 02. 튜플, 딕셔너리, 조건문, 반복문, 함수, List Comprehension, File I/O, 예외처리
30 Mar 2017 |패스트캠퍼스 컴퓨터공학 입문 수업을 듣고 중요한 내용만 간단하게 정리했습니다.
튜플 (tuple)
- 튜플은 값의
추가
,삭제
,수정
이 불가능하다. - tuple끼리 연산하는 것은 가능하다. 변수에 담긴 값을 바꾸는 것은 가능하다. (x, y) = (y, x)
- 따라서 정의시에 값을 같이 정의해야한다. (tuple = (1,2,3,4))
- list, dic, tuple 정의시 마지막에
,
(콤마)를 넣는게 좋다. (예 : [1,2,3,])
git은 수정내역을 라인단위로 관리하기 때문에 콤마 때문에 수정내역에 불필요한 한줄이 추가된다.
def quot_and_rem(a,b):
quot = a // b
rem = a % b
return (quot, rem) # 파이썬은 두개 이상의 아웃풋을 낼 수 있다. 괄호가 없어도 튜플로 리턴된다.
(quot, rem) = quot_and_rem(10,3) # 명시적으로 쓰는게 좋다.
딕셔너리 (dictionary)
- 최근에는 json 형식으로 데이터 교환을 많이 한다. (과거는 xml)
- node.js
- mongoDB (nosql의 일종)
- 딕셔너리에는 index 값이 없다. 따라서 순서도 없다.
예시
# 구조
some_dict = {
'key':'value',
'key':'value',
'key':'value',
'key':'value',
}
# 예시
member = {
'user':[
{
'id' : 'siwa',
'name' : 'hyejin',
'password' : 'asdfjkl123',
'address' : '',
'phone' : '',
},
{},
{},
]
}
주요함수
dic.keys() # key만 출력
dic.values() # value만 출력
dic.items() # key와 value를 함께 출력
del dic('key') # 요소삭제
nosql / RDB (DBMS 참고)
- nosql은 key 값으로 바로 value에 접근할 수 있어서 간편하다. record 추가시 원하는 필드 일부만 추가할 수 있다. (관계형데이터베이스(RDB)는 record 추가시 모든 field를 추가한다.)
- RDB
- 종류 : MySQL, MariaDB, oracleDB, PostgreSQL(장고와 궁합 좋음), sqlite (기본, 경량, 로컬)
- 필드 등이 잘 바뀌지 않는 유저정보 같은 데이터 관리에 적합하다.
- nosql
- 종류 : mongoDB, Couchbase
- 상품정보등 휘발성 정보 저장에 좋음, dot notation으로 접근
조건문
- 파이썬은 객체지향이지만 절차지향이기도 하다.
가장 가능성이 큰 조건, 제일 중요한 조건이 맨 위에 오는게 좋다. (메인프로세스)
(중요)- 백엔드 개발자는 메모리를 적게 사용하고, 실행문이 짧고, 오고가는 파일의 용량을 최소화 하는데 중점을 둔다. (이미지 요청, 이미지 받기 선택 등)
- 보통 4칸을 tab 으로 설정해서 사용한다.
import
아래에는 일반적으로 2칸을 띄운다.
예시
import random
# 2칸 띄우기
answer = random.randint(1,100)
username = input("Hi there, What's your name??")
while True: # 무한반복
guess = eval(input("Hi, "+ username + "guess the number: "))
# eval 함수는 사용자가 입력한 형태 그대로 type을 평가하여 저장한다.
if guess == answer:
print("Correct! The answer was ", str(answer))
break # 함수종료
else:
print("That's not what I wanted!! Try again")
반복문
- for 변수 in (리스트 or 문자열)
- while
Fizzbuzz
num = eval(input("type the number: "))
for i in range(1, num + 1):
if i % 15 == 0:
print("fizzbuzz")
elif i % 3 == 0:
print("fizz")
elif i % 5 == 0:
print("buzz")
else:
print(i)
함수
return skill
- 리턴이 되는 순간 함수는 종료되었다고 인식
- 금칙어 리스트, id 유효성 체크 등에 많이 사용된다.
def id_check(id):
if id == "admin":
print("invalid id: admin")
return # 함수 종료 (반복문에서 break와 동일한 역할)
print("valid id: ", id)
parameter with initialize
- 초기값을 설정할땐 항상 그 인자를 마지막에 두어야 한다.
def say_hello(name, nick=True):
print("Hi, ", name)
if nick:
print("But, you are Fool")
else:
print("Oh, you are not Fool")
arguments (중요)
- 파라미터 갯수를 지정하기 힘들 때
*args
를 사용한다. *cat
이라고 해도 된다 (이름은 상관 없다)- 입력된 다수의 인자를 튜플로 묶는다
def mul_sum(*args):
print(args) # (args1, args2, args3 ...)
sum = 0
for i in args:
sum += i
return sum
keyword arguments (중요)
- key, value로 구성된 다수의 인자를 받을 때
**kwargs
를 사용한다. **kwargs
는 따로 변수에 담아서 인자로 던질 수 있다.
def kwargs_url(server, **query):
url = "https://{}?".format(server)
for key in query.keys():
url += "{}={}".format(key, query[key])
return url
kwargs_url("www.daum.net", query="pizza", lang="ko")
# 'https://www.daum.net?query=pizzalang=ko'
```python
>>> def test(**kwargs):
... print(kwargs)
>>> dic = {'a':1, 'b':2}
>>> test(**dic)
{'a': 1, 'b': 2}
>>> test(a=1, b=2)
{'a': 1, 'b': 2}
variable outside function
- 함수는 의존적이면 안된다. 함수 안에서 완결되어야 한다.
global은 사용하지 않는게 좋다.
독립성을 잃고 종속적으로 변해서 함수로서의 의미를 잃는다.
a = "hello"
def glob_test():
global a
a += "world"
return a
glob_test(a)
print(a)
List Comprehension
- Set Comprehension, Dictionary Comprehension 도 존재한다.
- Dictionary Comprehension 을 사용하면 데이터를 빠르게 처리 할 수 있다.
# List Comprehension
>>> [i * 2 for i in [1,2,3,4,5] if not i % 2 ]
[4, 8]
>>> [i for i in [1,2,3,4,5] if not i % 2]
[2, 4]
# dict comprehensions
>>> {x: x**2 for x in (2, 4, 6)}
{2: 4, 4: 16, 6: 36}
File I/O
- 파일의 입출력
입출력 모드의 결정
1. 'write text' 모드
f = open("test.txt", "wt")
2. 'write binary' 모드
f = open("test.bin", "wb")
3. 'read text' 모드
f = open("test.txt", "rt")
4. 'read binary' 모드
ㄹ = open("test.bin", "rb")
파일 만들기 (Create New File, Write text)
- 이미 존재하는 파일을 ‘w’ 쓰기 모드로 열면 기존의 내용을 덮어쓰기를 한다.
file = open('test.txt', 'w')
file.close()
파일내용 추가하기 (Add text)
file = open('test.txt', 'a')
for i in range(1,11):
text = "line %d.\n" % i
file.write(text)
f.close()
파일내용 읽기 (Read text)
file = open('test.txt', 'r')
text = file.readline() # 첫 줄만 가져오기
print(text)
texts = file.readlines() # 전체 줄을 리스트로 가져오기
for text in texts:
print(text)
text = file.read() # 전체 내용을 문자열로 한번에 가져오기
print(text)
f.close()
Error Handler
- try, except 구문을 활용한다.
- ValueError는 치명적, NameError 같은 경우는 except: pass 로 넘어가기도 한다.
# ValueError
try:
input_text = int(input('write a number: '))
except ValueError:
print('It\'s not a number. please write a number')
# FileNotFoundError
try:
f = open('error_example.txt', 'r')
except FileNotFoundError as e:
print(e)
else:
text = f.read()
f.close()
# 다수의 에러
try:
...
except 오류1:
...
except 오류2:
...
# 이름을 모르는 모든 에러에 대한 처리
try:
...
except:
...
# 오류 회피 (에러무시)
try:
f = open("notExist.txt", 'r')
except FileNotFoundError:
pass
# 오류 일부러 발생시키기 (에러생성)
if total < 0:
raise Exception('Total Error')