강의노트 02. 튜플, 딕셔너리, 조건문, 반복문, 함수, List Comprehension, File I/O, 예외처리

|

패스트캠퍼스 컴퓨터공학 입문 수업을 듣고 중요한 내용만 간단하게 정리했습니다.

튜플 (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')