식별자: 변수, 함수, 모듈, 클래스 등을 식별하는 데 사용되는 이름
convention:
식별자의 이름은 영문알파벳, _, 숫자로 구성된다.
첫 글자에 숫자가 올 수 없다.
대소문자를 구별한다.
예약어는 사용할 수 없다.
False, None, True, and, as, assert, break, class, continue, def, del, elif, else, except, finally, for, from, global, if, import, in, is, lambda, nonlocal, not, or, pass, raise, return, try, while, with, yield
내장함수나 모듈 등의 이름으로도 만들면 안된다.
예약어, 내장함수, 모듈 등의 이름으로 변수를 만들면 기존의 기능이 덮어쓰여지므로 식별자 이름으로 쓰면 안된다.
인코딩 선언: default로 UTF-8이 설정되어 있다. 인코딩 선언은 Python parser
에 의하여 읽혀지며, # -*-coding:<encoding-name>-*-
이라 선언한다.
주석: #
으로 표현하는 것이 기본이다. 여러 줄의 주석을 작성할 때에는, """
으로 docstring
을 표현하면 된다.
코드라인: 기본적으로 파이썬에서는 ;
을 작성하지 않는다. 그러나 한 줄로 표기할 때에는 ;
으로 작성한다. \
으로도 가능하다. list, set, dict은 특별한 표기 없이 한 줄 작성이 가능하다.
print('Happy'); print('Hacking')print('Happy\Hacking')
변수는 =
을 통해 할당(assignment) 된다.
type()
을 통해 자료형을 확인해야한다.
해당 변수의 메모리 주소를 확인하기 위해서는 id()
를 활용한다.
같은 값을 동시에 할당 할 수 있다.
a = b = 10
다른 값을 동시에 할당 가능하다.
a, b = 1, 2
변수의 갯수가 값의 갯수보다 더 적거나 많으면 오류가 발생한다.
# 변수의 값 바꾸기a = 10b = 20# 1. tmp var 사용c = aa = bb = c# 2. +, - 사용a = a + bb = a - ba = a - b
int
: 정수int
로 표현된다.0o
, 2진수: 0b
, 16진수: 0x
float
: 부동소수점, 실수실수는 부동소수점으로 표현되며, 항상 같은 값으로 일치되지 않는다.
숫자를 표현하는 과정에서 생기는 오류는 대부분 중요하지 않으나, 값 비교 과정에서는 문제가 발생할 수 있다.
실수의 경우, 덧셈은 괜찮으나 뺄셈 처리 시에는 오류가 있을 수 있다.
round()
를 통해 반올림하여 실수를 정리 할 수 있다.
실수 비교 방법
# 1. absif abs(a-b) <= 1e-10:print('대충 같다')# 2. sys moduleif abs(a - b) <= sys.float_info.epsilon:print('대충 같다')# 3. math moduleimport mathmath.isclose(a, b)# output: True
complex
: 복소수복소수는 허수부를 j
로 표현한다.
a = 3 + 4j
a.imag => 허수부 출력
a.real => 실수부 출력
a.conjugate() =>
True
와 False
로 이뤄진 bool
타입bool(value)
하면 True
와 False
가 출력된다.False
의 경우: [], 0, {}, 0.0, ’’, (), NoneTrue
의 경우: False
경우 제외 전부. 어떤 값이나 type 이든 비어있지 않고 무언가가 존재 하면 True
이다. 예로, [False]
, [0]
, ' '
등 도 전부 True
이다.None
타입이 존재한다.문자열은 ''
나 ""
을 활용하여 표현 가능하다.
하나의 문자열을 묶을 때 동일한 문장부호를 활용해야 한다.
PEP-8
에서는 하나의 문장부호를 선택하여 유지하는 것이 원칙이다.
사용자에게 받은 입력은 기본적으로 str
이다.
여러 줄에 걸쳐있는 문장은 """ """
을 사용 하여 표현 합니다.
이스케이프 문자열
\
을 활용하는 문자열\\\
’단일인용부호(’)"이중인용부호(")end='escape string'
을 쓰면 출력 결과를 조정할 수 있다.String Interpolation
name = '김싸피'
%-formatting
'Hello, %s' % name
str.format()
'Hello, {} {} {}'.format(name, 100, True) #순서대로 들어간다
f-strings
f'Hello, {name}'
산술 연산자
+ | 덧셈 |
---|---|
- | 뺄셈 |
* | 곱셈 |
/ | 나눗셈 |
// | 몫 |
% | 나머지 |
** | 거듭제 |
비교 연산자
a>b | 초과 |
---|---|
a<b | 미만 |
a>=b | 이상 |
a<=b | 이하 |
a==b | 같음 |
a!=b | 같지않음 |
논리 연산자
a and b => a 와 b 모두 true시만 true
a or b => a 와 b 모두 false시만 false
not a => true to false, false to true
참거짓 판단에서는 판단을 위해 고려하는 가장 마지막 값을 출력한다.
복합 연산자
연산과 대입이 함께 이뤄진다.
ex) a+=b, a-=b
Concatenation: 자료형을 합치는 +
연산자
Containment Test: in
연산자를 통해 속해있는지 여부를 확인
Identity: is
연산자를 통해 동일한 object인지 확인
연산자 우선순위
()
을 통한 grouping[ : ]
[0]
**
+
, -
(음수/양수 부호)\*
, /
, %
, //
+
, -
in
, is
not
and
or
bool
, numbers(int, float, complex)
bool
은 true
는 1로, false
는 0으로 자동 변환complex
, 2) float
, 3) int
우선순위 순으로 변환된다.int()
: string, float을 int로 변환float()
: string, int 를 float으로 변환str()
: int, float, list, tuple, dictionary를 문자열로 변환string
-> intger
: 형식에 맞는 숫자만 가능integer
-> string
: 모두 가능int('3.5')
float
을 int
로 형변환하면 내림 숫자가 나옴[value1, value2, value3]
[]
로 만들 수 있다list[i]
(value1, value2)
리스트와 유사, ()
로 묶어서 표현
수정불가능(immutable)하고, 읽을 수 밖에 없음
직접 사용 보다는 파이썬 내부에서 사용
# tuple을 만들어봅시다.tup = (1, 2)print(tup, type(tup))# 아래와 같이 만들 수 있습니다.x = 1, 2print(x, type(x))# 파이썬 내부에서는 다음과 같이 활용됩니다.# 앞선 2. 변수 및 자료형 예제에서 사용된 코드입니다.x, y = 1, 2# 실제로는 x, y = (1, 2) 형태로, tuple 처리 됩니다.# 변수의 값을 swap하는 코드 역시 tuple을 활용하고 있습니다.x, y = y, xtup = 1, 2, 3, 4, 5, 'a', 'b'print(tup, type(tup))tup[5]output: (1, 2, 3, 4, 5, 'a', 'b')<class 'tuple'>'a'
range(n)
: 0<= x < nrange(n, m)
: n <= x < mrange(n, m, s)
: n <= x < m (스텝: s)set
과 dictionary
는 기본적으로 순서가 없다set
: {value 1, value 2, value 3}dictionary
: {key1: value1, key2: value2, key3: value3, …}key
와 value
가 쌍으로 이루어져있다{}
과 생성자 함수 dict()
로 만들 수 있다.key
는 immutable한 모든 것이 가능 (string, integer, float, boolean, tuple, range)value
는 list, dictionary를 포함한 모든 것이 가능하다.key
는 존재 할 수가 없다.데이터 타입
container:
sequence (ordered)
string, list, tuple, range
unordered
set, dictionary
changeable?:
immutable
string, tuple, range, bool, numbers ( int, float, complex )
mutable
list, set, dictionary
if <조건식>
: 반드시 일정한 참/거짓을 판단할 수 있는 조건식과 사용:
이후의 문장을 수행else:
이후의 문장을 수행elif <조건문>:
을 활용if
안에 if
실행true_value if <조건식> else false_value
while True:
while
문은 조건식이 True
인 경우 반복적으로 코드를 실행
종료조건을 반드시 설정해줘야 한다.
for
문: for value in sequence:
정해진 범위 내 (시퀀스) 에서 순차적으로 코드를 실행
범위가 이미 정해져 있기 때문에, 종료조건을 설정해주지 않아도 된다.
** iterable
이라는 것은 시퀀스, 이터레이터 또는 이터레이션을 지원하는 객체, 즉 열거 객체
for
문enumerate(iterable)
: index와 value를 반환하는 함수for index, value in enumerate(iterable)
for key in dict:
key 반환 및 반복for key in dict.keys()
: key 반환 및 반복for value in dict.values()
: value 반환 및 반복for key, value in dict.items()
: key와 value 반환 및 반복break
, continue
, else
break
: 반복문을 종료하는 표현continue
: continue 이후의 코드를 수행하지 않고 다음 요소를 선택해 반복을 계속 수행else
: 끝까지 반복문을 시행한 이후에 실행. break
를 통해 중간에 종료되지 않은 경우에만 실행. for~else
를 의미한다.def func(parameter1, parameter2):code line1code line2return value
func(val1, val2)
로 한다함수는 기본적으로 인수를 위치로 판단
기본값(Default Value):
함수가 호출될 때, 인자를 지정하지 않아도 기본 값을 설정할 수 있다.
기본 값이 있는 ‘’매개변수’’ 뒤에 기본 값이 없는 ‘’매개변수’’를 사용 할 수는 없다.
def greeting(age, name= 'john'):print(name, age)
직접적으로 변수의 이름으로 특정 인자를 전달할 수 있다.
키워드 인자 뒤에 위치 인자를 사용 할 수는 없다.
위치 ‘’인자’’ => 키워드 ‘’인자’’ 순서 이어야 한다.
greeting('neo', age=10)
def func(*args)
def func(**kwargs)
**dict
를 통해 함수에 딕셔너리를 인자로 넘길 수 있다func(**dict)
재귀함수: 함수 내부에서 자기 자신을 호출하는 함수
재귀함수는 기본적으로 같은 문제이지만, 점점 범위가 줄어드는 문제를 풀게 된다
재귀 함수 작성시에는 반드시, base case가 있어야 한다.
base case는 점점 범위가 줄어들어 반복되지 않는 최종적으로 도달하는 곳이다.
재귀 함수의 장/단점
알고리즘 구현에 적절 (더 자연스럽다)
’변수 사용’을 줄여준다
코드가 더 직관적이고 이해하기 쉬운 경우가 있다
만들기는 어렵다
함수가 호출될 때 마다 메모리 공간에 쌓인다. 그래서 메모리 스택이 넘치거나 (stack overflow) 프로그램 실행속도가 느려진다.
파이썬에서는 이를 방지하기 위해 1,000번이 넘어가게 되면 더이상 함수를 호출하지 않고, 종료된다.
.capitalize()
: 앞글자를 대문자로 만들어 반환합니다. + 나머지는 모두 소문자. ex) string.capitalize()
.title()
: 어포스트로피나 공백 뒤에 있는 문자를 대문자로 만들어 반환. ex) string.title()
.upper()
: 모두 대문자로 만들어 반환. ex)string.upper()
(4).lower()
: 모두 소문자로 만들어 반환. ex) string.lower()
(5).swapcase()
: 대 <-> 소문자로 변경하여 반환
'arg'.join(iterable)
: iterable type의 객체를 특정한 문자열로 만들어 반환arg을 넣는 기준은 string은 각 value 뒤, 그 외 iterable은 ‘,’ 이다.
'!'.join('배고파') -> output: 배!고!파!'-'.join(['hi', 'hello']) -> output: hi-hello
<class str>. replace(old, new[, count])
: 바꿀 대상의 글자를 새로운 글자로 바꿔서 반환. count를 지정하면 해당 갯수만큼만 시행.
'yayaya!'.replace('a', '_')'woooooowooooo'.replace('o', '', 3)output:y_y_y_wooowooooos = 'wooooowoooo's2 = s.replace('o', 'x')print(s, s2)output:s = wooooowoooos2 = wxxxxxwxxxx
.strip([chars])
: 특정한 문자들을 지정하면, 양쪽을 제거한다. 지정하지 않으면 default value는 공백.
(9).lstrip([chars])
& .rstrip([chars])
: 왼쪽제거, 오른쪽 제거
.find(x)
: string 내 첫 x의 index를 반환. 없으면, -1를 반환.
.index(x)
: string 내 첫 x의 index를 반환. 없으면, 오류를 반환.
.split(chars='arg')
: 문자열을 chars를 기준으로 나누어 리스트로 반환. chars의 default value는 ’ ’ (띄어쓰기) 이다.
그 외 참/거짓 반환 메소드: .isbulabula()
ex) .isdecimal()
, .isspace()
, .istitle()
.append(x)
: 리스트에 x값을 추가한다. x가 iterable type일 때, iterable value만 뽑아서 추가하는 것이 아니라 하나의 객체로 인식해서 추가한다. 이를 고려해서 사용해야 한다.ex) list.append([1, 2])
-> list = [[1, 2]]
.extend(iterable)
: 리스트에 iterable 값을 붙일 수 있다. iterable 내 value들을 하나씩 리스트에 추가한다. 그래서 string을 넣으면 문자 하나하나씩이 list value로 추가됨으로 주의해야한다.ex) list.extend([1, 2])
-> list = [1, 2]
.insert(i, x)
: 정해진 위치 i에 x 값을 추가. i가 list의 길이를 넘어서면 무조건 마지막에 하나만 추가된다..remove(x)
: 리스트에서 값이 x인 것을 삭제. remove는 값이 없으면 오류 발생..pop(i)
: 정해진 위치 i
에 있는 값을 삭제하며, 그 항목을 반환한다. i
가 지정되지 않으면 default로 마지막 항목을 삭제하고 반환한다..index(x)
: 원하는 x값을 찾아 index 값을 반환. index 도 찾는 value x가 없으면 오류 발생..count(x)
: list 내 원하는 x 값의 갯수를 반환..sort()
: list를 정렬해줌. .sorted()
와 다르게 원본 list를 변형시키고, None을 리턴.(9)sorted(list)
: iterable을 정렬해서 list로 반환. 원본 list를 변형시키지 않고, 정렬된 list을 리턴.
.reverse()
: list 내 value의 순서를 반대로 뒤집는다. (정렬 아님)copy_instance = copy.copy(original_instance)
copy_instance = copy.deepcopy(original_instance)
.clear()
: 리스트의 모든 항목을 삭제한다.list_name = [value to append <조건문/반복문>]
조건문과 반복문이 중첩될 때에는, 상위 명령문을 앞에다 쓰면 된다.
ex) even = [number for number in range(1, 10) if number % 2 == 0]
.pop(key[, default])
: key가 dictionary에 있으면 해당 value를 제거하고 그 값을 돌려줍니다. 그렇지 않으면 default를 제거하고 반환하다. default가 없는 상태에서 key가 dictionary에 없으면 KeyError가 발생한다.ex) dict.pop('melon', '없음')
: melon의 값을 반환해주는데, 만약 없다면 default value인 없음을 반환해줘.
.update(key=value)
: 값을 제공하는 key, value로 덮어쓴다..get(key[, default])
: key를 통해 value를 가져온다. key가 dictionary에 없어도 KeyError가 발생하지 않는다.dict = {key: value <조건문/반복문>}
.add(elem)
: element를 세트에 추가.update(*others)
: 여러 개의 element를 set에 추가. 반드시 iterable한 값을 넣어야한다..remove(elem)
: element를 세트에서 삭제하고, 없으면 KeyError가 발생..discard(elem)
: element를 세트에서 삭제하고, 리턴값이 None이라서 없어도 에러가 발생하지 않는다.pop()
: 임의의 원소를 제거해 반환.map(function, iterable)
zip(*iterables)
zip(list1, list2)
=> output: (val1.1, val2.1), (val1.2, val2.2), …from itertools import zip_longest// zip_longest(iterable1, iterable2, fillvalue='args')
filter(function, iterable)
class ClassName:
ClassName()
을 호출함으로써 선언(self)
가 첫번째 인자로 설정되어야 한다. 그래야 인스턴스 객체가 함수의 첫번째 인자로 전달되어 행위가 실행된다.self
는 인스턴스 객체 자기자신을 의미생성자는 인스턴스 객체가 생성될 때 호출되는 함수
def __init__(self):return bulabula
소멸자는 인스턴스 객체가 소멸되는 과정에서 호출되는 함수
def __del__(self):return bulabula
양쪽에 언더스코어가 있는 메서드를 스페셜 메서드 혹은 매직 메서드라고 부른다
클래스의 속성
클래스 선언 블록 최상단에 위치
모든 인스턴스가 공유
Class.class_variable
로 접근/할당한다
class TestClass:class_variable1 = 'a'class_variable2 = 'b'
인스턴스의 속성
각 인스턴스들의 고유한 변수
메서드 정의에서 self.instance_variable
로 접근/할당한다
인스턴스가 생성된 이후 instance.instance_variable
로 접근/할당한다
class TestClass:def init(self, arg1, arg2):self.instance_var1 = arg1self.instance_var2 = arg2def status(self):return self.instance_var1, self.instance_var2
self
를 받도록 정의한다. 이 때, 자동으로 인스턴스 객체가 self
가 된다@classmethod
데코레이터를 사용cls
) 를 받도록 정의한다. 이 때, 자동으로 클래스 객체가 cls
가 된다.@staticmethod
데코레이터를 사용cls
)와 그 속성에 접근할 필요가 있다면 클래스 메서드로 정의한다+ __add__ - __sub__* __mul__< __lt__<= __le__== __eq__!= __ne__>= __ge__> __gt__
n = (1).__add__(3)s = 'a'.__add__('b')l = [1].__add__(['x'])
클래스에서 가장 큰 특징은 상속 기능을 가지고 있다는 것이다.
부모 클래스의 모든 속성이 자식 클래스에게 상속되므로 코드 재사용성이 높아진다.
공통된 속성이나 메서드를 부모 클래스에 정의하고, 이를 상속받아 다양한 형태의 인스턴스들을 만들 수 있다.
class DerivedClassName(BaseClassName):code block
super()
자식 클래스에 메서드를 추가로 구현할 수 있다
부모 클래스의 내용을 사용하고자 할때, super()
를 사용한다
class BabyClass(ParentClass):def method(self, arg):super().method(arg)
메서드 오버라이딩 (재정의/ method overriding)
상속 관계에서의 이름공간
다중 상속
class BabyClass(ParentClass1, ParentClass2)
.py
를 붙인다import
문을 통해 내장 모듈을 이름 공간에 가져와야 한다package_name.module_name()
__init__.py
파일이 필요하다.import
방법from 모듈명 import 어트리뷰트
: 특정 어트리뷰트만 꺼낸다from 모듈명 import *
: 모듈에 있는 변수, 함수, 클래스 전부 꺼낸다from 모듈명 import 어트리뷰트 as 이름
: 내가 지정하는 이름을 붙여 가져올 수 있다random
: 난수 발생관련 함수random
은 seed
를 어떻게 설정하냐에 따라 생성되는 난수가 다르다.datetime
: 날짜 관련 모듈timedelta
: 시간 연산을 가능케 한다기본: try ~ except ~
try:codeblock1except 예외:codeblock2
하나 이상의 예외를 모두 처리
괄호가 있는 tuple로 여러 개의 예외를 지정할 수 있다
에러가 순차적으로 수행됨으로, 가장 작은 범주부터 시작해야 한다
try:codeblock 1except (예외1, 예외2):codeblock 2
에러 문구 처리
try:codeblock1except 예외 as err:codeblock2
else
에러가 발생하지 않는 경우 수행되는 문장은 else
를 이용한다
모든 except 절 뒤에 와야한다
try 절이 예외를 일으키지 않을 때 실행되어야만 하는 코드에 적절하다
try:numbers = [1, 2, 3]number = numbers[2]except IndexError as err:print(err)else:print(number * 100)
finally
반드시 수행해야하는 문장은 finally를 활용
모든 상황에 실행되어야만 하는 코드를 정의하는데 활용
예외 발생 여부와 관계없이 try문을 떠날 때 항상 실행된다
try:codeblock1except 예외:codeblock2finally:codeblock3
raise
예외를 강제로 발생시킨다
try:raise ValueError('error occured')except ValueError as err:print(err)
assert
예외를 발생시키는 방법
상태를 검증하는데 사용 되면 무조건 AssetionError
가 발생
assert Boolean expression, error message
Bool 검증식이 거짓일 경우 발생
raise
는 항상 예외를 발생시키고, 지정한 예외가 발생한다는 두가지 점에서 assert
와 다르다
def my_div(num1, num2):assert type(num1)==int and type(num2)==int, '둘 중 숫자가 아닌것이 있다.'try:result = num1 / num2except ZeroDivisionError as err:print(err)else:return result
Just like learning Python concepts step by step makes coding clearer, using a what nose shape do i have scanner can bring clarity to personal styling. Tools like faceshapedetector not only analyze your face shape but also guide you with tailored hairstyle and makeup suggestions. It’s all about breaking things down—whether in programming or beauty—to get personalized, effective results.