본문 바로가기

PYTHON-BACK

#파이썬 기초 2일차

728x90

파이썬 백엔드 과정 2일차


파이썬 기초

 

1. 프로그래밍이란?

- 컴퓨터에게 일을 시키기 위한 명령어 모음 (주어진 데이터를 우리가 원하는 형태로 가공, 처리하는 과정을 정리)

- 프로그래밍의 단계 : 데이터 입력 > 데이터 처리 > 데이터 출력

 

* 데이터를 입력 하려면 데이터를 담아둘 통이 필요한데 이때 사용하는 통을 변수, 상수 등의 이름으로 부른다.

 

2. 값(Value)의 처리

- 프로그래밍 언어 특히 파이썬은 모든 것을 값으로 처리함

- 값을 사용 및 재활용하기 위해서는 값을 변수에 저장해야 함

 

2.1 리터럴(Literal)

- 리터럴 : 프로그래밍 언어로 작성된 코드에서 값을 대표하는 용어

- 파이썬에서는 모든 것을 값으로 처리하며, 이런 값은 정수, 부동 소수점 숫자, 문자열, 불린, 클래스 등의 객체로 평가 및 관리하고 이를 통해 결과를 출력하게 된다.

2.2 표현식(Expression)

- 프로그래밍 언어가 해석하는 하나 이상의 명시적인 값, 상수, 변수, 연산자들의 조합

    - 함수도 실행하면 하나의 값이 되므로 함수를 조합하는 것도 표현식으로 인식함

- 여러 개의 값을 하나로 묶어서 처리하기 위한 방법

    - 리터럴은 단순히 하나의 값을 처리한다.

- 표현식을 평가해서 실행할 때

    - 우선순위 및 연관규칙에 따라 해석하고 실행됨

    - 평가 결과는 하나의 값인 리터럴로 표현된다.

- 표현식을 표시하기 위해서는 아래와 같은 요소들이 필요하다.

    - 피연산자(Operand) : 일반적인 리터럴 값

    - 연산자(Operator) : 피연산자를 평가하거나 계산하기 위한 요소

        - 단항 연산자(Unary) : 하나의 연산자와 피연산자를 묶어서 처리하는 연산자

        - 이항 연산자(Binary) : 하나의 연산자와 두 개의 피연산자를 묶어서 처리하는 연산자

        - 여러 개의 표현식은 괄호로 묶어서 처리한다.

- 표현식의 처리 순서

    - 좌측에서 우측으로 처리하며, 괄호를 만나면 최우선으로 처리한다.

 

2.3 조건식(Condition Expression)

- 표현식 중에서 특정 조건문 등에 제한적으로 사용되는 것

- 주로 if문이나 while문과 같은 특정 구문에서 사용, 조건이 평가되면 참/거짓의 결과로 처리된다.

- 파이썬에서는 다른 프로그래밍 언어와 달리 if구문과 같은 일반적인 조건문외에도 간결한 조건식을 활용하는 경우가 많다.

 

bool("")

False

if "":
    print("True")
else:
    print("False")

False

- if의 조건식("")을 평가하면 False가 되므로 실행결과는 False임

 

3. 이름(Name)의 처리

- 파이썬 내의 객체들이 값으로 처리된 후, 그 값들을 재사용하기 위해 이름을 사용

- 프로그램의 작성은

    - 값을 저장하고

    - 필요한 경우 저장된 값을 읽어와서 계산한 후

    - 다시 저장해서 처리한다는 것

 

- 이런 값들의 변화를 저장, 관리하는 기준이 필요함( 파이썬에서는 네임스페이스를 만들어서 관리)

 

* 네임스페이스(Namespace) 

- 모듈 단위로 이름을 관리할 수 있는 영역, 이름이 바인딩된 상태의 영역을 나타냄

    - 파이썬에서 프로그램을 작성하는 기준이 모듈이므로 모듈 단위이다.

 

-지역(Local)/전역(Global)/내장(Built-In) 네임스페이스의 3가지로 구성됨

  • 지역 네임스페이스(Local Namespace):함수 내부에서 바인딩된 이름
  • 전역 네임스페이스(Global Namespace):코드블록이 속한 모듈의 최상위 네임스페이스. 모듈 전체에서 사용가능
  • 내장 네임스페이스(Built-in Namespace): 파이썬 인터프리터가 시작할 때 생성되어 실행이 중단되기 전까지 유지되며 내장 모듈의 이름을 포함함

- 네임스페이스는 독립적으로 생성되고 유지되며, 서로 다른 네임스페이스에서 동일한 변수나 함수 이름을 가질 수 있음
- 네임스페이스와 유효범위를 이해하면 파이썬 프로그래밍에서 변수와 함수의 사용을 더욱 효율적으로 관리할 수 있음
- 네임스페이스로 사용하는 이름은 프로그램 전체에서 유일해야 한다 

 

 

- 이름을 구별해야 하므로 식별자(identifier)라는 개념을 사용함
    - 각 이름을 구별할 수 있도록 프로그램 내에서 식별자 별로 의미를 부여해서 지정함
    - 이름(식별자)으로 지정하는 요소
        -변수(Variables), 함수(Function), 클래스(Class), 모듈(Module), 패키지(Package) 등
    - 변수를 제외하면 모두 객체로 사용됨  →  값으로 관리됨 (사실 변수도 값으로 관리 되지만, 안에 있는 내용이 계속 바뀐다.)
- 파이썬은 변수, 함수, 클래스 등에 대한 이름을 구별하지 않음  →  명명규칙을 명확히 해서 각각을 이름으로 식별할 수 있어야 함

 

3.1 예약어(Keyword)

 

3.1.1 Keyword 모듈을 이용한 예약어 확인

    - 예약어(Keyword): 개발자가 직접 정의할 수 없고 파이썬 내부 문법규칙에서만 사용할 수 있도록 정의된 것이다.

import keyword
import pprint

pprint.pprint(keyword.kwlist, width=60, compact=True)

 

['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', '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']

 

3.1.2 Pretty print(pprint)

help를 통해서 pprint를 살펴보면 아래와 같다.

import pprint

help(pprint.pprint)

Help on function pprint in module pprint: pprint(object, stream=None, indent=1, width=80, depth=None, *, compact=False, sort_dicts=True, underscore_numbers=False) Pretty-print a Python object to a stream [default is sys.stdout].

 

** Keyword로 변수를 정의할 경우 문법 오류로 처리한다. **

- SyntaxError: invalid syntax 오류 발생

 

3.1.3 모듈 내 식별자 이름이 중복될 경우

    - 동일한 모듈 내에서 동일한 이름으로 변수, 함수를 지정하면 동일한 이름으로 처리, 사용되므로 명확한 에러가 발생하지 않음
    - 이 이름을 호출해서 사용할 때 실행상의 예외(Run-time Error)나 다른 처리 결과가 발생함

 

3.2 명명 규칙(Name Convention)

    - 변수, 함수, 클래스, 모듈, 패키지 등 다양한 이름에 대한 명명 규칙을 처리하는 규약을 제공하고 관행적으로 이를 따라 이름을 정의하면 이름 간의 충돌을 예방할 수 있다.

 

3.2.1 파이썬 권장 명명 규칙: 모듈, 패키지


모듈
   - 모듈 이름은 짧아야 함
   - 전부 소문자로 작성할 것을 권장함
   - 가독성을 위해서 밑줄(_, Under Bar)를 사용할 수 있음
패키지
   - 패키지 이름은 짧아야 함
   - 전부 소문자로 작성할 것을 권장함
   - 밑줄 사용을 권장하지 않음

 

3.2.2 파이썬 권장 명명 규칙: 클래스
- 클래스의 이름은 Capitalized Words 형식을 따르며 카멜 표기법(Camel Case)를 주로 권장함

Capitalized Words 형식
   - 모든 단어의 첫 글자를 대문자로 표기하고 나머지 글자는 소문자로 표기함
   - 띄어쓰기 없이 단어를 이어붙임
   - 예: NewPost
Camel Case
   - 모든 단어의 첫 글자를 대문자로 표기하고 나머지 글자는 소문자로 표기하되, 첫 번째 단어는 소문자로 시작함
   - 띄어쓰기 없이 단어를 이어붙임
   - 예: newPost
Snake 표기법(= Under Score / Under Bar 표기법)
   - 모든 글자를 소문자료 표기하고 단어 사이에 밑줄 문자 (_)를 사용하여 이름을 작성함
   - 주로 변수명이나 함수명을 작성할 때 사용되며, 가독성을 높이기 위해 단어를 구분하는데 유용함
   - 예: new_post
   - 클래스의 이름을 위한 표기법으로는 권장하지 않음


Exception은 예외처리할때 사용하는 클래스
   - 다른 클래스와 동일하게 Capitalized Words 형식을 적용하되, 맨 뒤는 "Error"로 끝내는 것을 권장함

 

3.2.3 파이썬 권장 명명 규칙: 상수, 변수, 함수, 메서드


- 변수, 함수와 메서드의 이름은 원칙적으로 소문자로 표기함
- 가독성을 위해 밑줄 문자 단어(스네이크 표기법)로 쓰는 것을 권장함
- 보호 속성이 요구될 때(클래스의 속성은 파이썬에서 제공되지 않음)는 맨 앞에 '_'(Leading Underscore)를 추가적으로 붙임(파이썬의 클래스는 c++같은데의 클래스와 좀 다름)
- 키워드와 동일한 변수명일 때는 맨 뒤에 '_'(Leading Underscore)를 추가적으로 붙임
- 비공개 속성일 때는 맨 앞에 '__'(Double Underscore)를 붙임
- 스페셜 속성일 때는 앞과 뒤에 '__'(Double Underscore)를 붙임
- 모듈에서 정의되는 상수는 모두 대문자로 작성함(All Capitalized Words 형식)

 

3.3 변수(Variables)

 

파이썬에서의 변수
   - 선언 시에 특정한 자료형을 배정하지 않음
   - 단순히 값을 보관하는 장소가 아니라 값들의 임시 저장 장소로만 사용함

프로그램 내에서
   - 변수는 이름으로 구별
   - 변수에는 값인 객체가 저장된 메모리 주소인 레퍼런스를 보관함
       - 레퍼런스만 저장하므로 자료형의 종류과 관계없이 쉽게 관리가 가능함

변수의 정의
   - 변수에 이름을 부여할 때 처음 글자는 반드시 문자(알파벳, 한글, 한자도 포함)와 밑줄 문자가 위치함
   - 두 번째부터는 문자, 숫자, 밑줄 문자를 조합해서 구성할 수 있음
   - 별도의 초기화 문법이 제공되지 않으므로 변수가 정의되면 이 변수에 반드시 어떠한 값이라도 할당해야 함

** 이제는 변수로 한글도 포함은 하고 있지만, 개발 할때는 영어를 사용하는 것을 추천함 **

 

4. 주석

한줄 주석 # - # 이용

여러줄 주석 ''' ~~ ''' - 따옴표 3개 이용

 

별첨. 언더바(_)

  1. 언더바는 인터프리터 내에서 마지막으로 연산되어 출력되는 값을 의미한다.

   2. 무시하고자 하는 값을 처리할 때 사용한다 

        - 튜플 등 데이터를 언패킹할 때 특정 값을 버리는 용도로 사용

        - '*(Asterisk)'을 이용하여 여러 개의 값을 동시에 무시할 수 있다.

 

n_tuple = (1, 2, 3, 4, 5)
a, b, c, _, e = n_tuple  # 4는 무시하고 1,2,3,5만 언패킹
print(a, b, c, e)

1 2 3 5

 

n_tuple = (1, 2, 3, 4, 5)
a, *_, b = n_tuple  # 2,3,4를 무시하고 1과 5만 언패킹
print(a, b)

1 5

 

# for문 안에서도 사용 가능
all_tuple = []
tuple_1 = (1, 2)
tuple_2 = (3, 4)
all_tuple.append(tuple_1)
all_tuple.append(tuple_2)
all_tuple

[(1, 2), (3, 4)]

 

for _, even in all_tuple:
  print(even)

2

4

 

    3. 숫자 리터럴의 자릿수를 구분할 때 사용한다.

        - 이때 _는 메모리에 입력되지 않는다. (숫자만 입력되어짐)

   

1,000,000,000
(1, 0, 0, 0)

 

1_000_000_000
1000000000

 

    4. 네이밍에 활용한다.

 

        4.1 앞에 언더바가 하나 붙는 경우(ex: _new) >> 일반적으로 권장함

         - 모듈 내에서만 해당 변수 또는 함수를 사용하겠다는 의미

         - 완전한 private은 아니기 때문에 외부에서 접근하는데 문제는 없다. 단지 그런 의도를 전달하고자 할 뿐인 것이다.

         - 외부 모듈에서 해당 모듈을 *를 이용하여 전체 임포트를 할 경우에는 앞에 _가 붙는 변수/함수는 임포트 하지않는다

 

        4.2 뒤에 언더바가 하나 붙는 경우(ex: new_)

         - 파이썬 키워드와 변수/함수명의 충돌을 피하기 위해 사용

              - 예: list, print 같은 키워드를 변수/함수명으로 사용하고 싶을때 이용함

 

         4.3 앞에 underbar가 두 개 붙은 경우(ex: __variable)
          - 네이밍 룰보다는 문법적인 요소에 가까움
          - 네임 맹글링(Name Mangling)을 위해 사용함
          - 네임 맹글링을 당한 변수/함수는 본연의 이름으로는 접근할 수 없게 됨
          - 맹글링을 적용한 변수/함수는 _ 클래스명__ 형태로 이름이 변경됨
          - 맹글링을 사용하는 경우
          - 클래스의 속성값을 외부에서 접근하기 힘들게 할 때(private 화)
          - 하위 클래스가 상위 클래스의 속성을 오버라이딩 하는 것을 막을 때

 

           4.4 앞뒤로 underbar가 두 개씩 붙은 경우(ex: __ variable__)
           - 파이썬이 특별히 정의한 변수나 함수에 사용되는 네이밍 룰 (예약어와 유사한 느낌)
           - 직접 함수를 만들때는 사용할 수 없고 대부분 오버라이딩 할 때 사용함
           - 이 네이밍 룰이 적용된 함수는 매직 메소드(Magic Method) 또는 던더 메소드(Dunder Method, Double                                  Underscore   Method)라고 부름
            - 대표적인 예로 __ init__ 함수가 있음

 

class TestClass():
  # 앞뒤로 underbar가 두 개씩 붙은 경우
  def __init__(self):
    self.name = "홍길동"
    self.gender = "male"
    self.__age = 32     # 앞에 underbar가 두 개 붙은 경우

man = TestClass()

print(man.name)
print(man.gender)

홍길동

male

 

print(man.__age) # AttributeError 발생

AttributeError: 'TestClass' object has no attribute '__age'

 

print(dir(man))

['_TestClass__age', '__class__', '__delattr__', '__dict__', '__dir__',
'__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__',
 '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__',
'__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
'__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'gender', 'name']

 

  • 맹글링 (1)
    • 클래스의 속성값을 외부에서 접근하기 힘들게 할 때(private 화)
class TestClass:
    def __init__(self):
        self.name = "홍길동"
        self.age = 21
        self.hobby = "도술쓰기"

man = TestClass()
print(man.name, man.age, man.hobby)

홍길동 21 도술쓰기

 
  • 맹글링 (2)
    • 하위 클래스가 상위 클래스의 속성을 오버라이딩 하는 것을 막을 때
** 맹글링 - 하위 클래스가 상위 클래스의 속성을 오버라이딩 하는 것을 막을 때 **

 

class TestClass:
    def __init__(self):
        self.name = "홍길동"
        self.age = 21
        self.hobby = "도술쓰기"

class TestClass2(TestClass):
    def __init__(self):
        super().__init__() # 상위 클래스 가져오기
        self.name = "한석봉"
        self.age = 23
        self.hobby = "글쓰기"

man = TestClass2()
print(man.name, man.age, man.hobby)

한석봉 23 글쓰기

 

5. 자료형(Data Type)

- 파이썬에서는 데이터의 형태(자료형)을 직접 선언하지 않아도 됨(선언만 안하는거지 자료형은 존재하는 것임)

a = 1                # 자연수(=양의 정수)
b = -3               # 음의 정수
c = 0.5              # 실수
d = 4+5j             # 복소수 → 파이썬에서는 복소수 표현 시 i가 아니라 j를 사용함
e = "Hi"          # 문자열(영어)
f = "안녕"     # 문자열(한글)
print(a)
print(b)
print(c)
print(d)
print(e)
print(f)

위 내용을 print를 통해 출력하면 아래와 같다.

1

-3

0.5

(4+5j)

Hi

안녕

 

- type()을 이용해서 자료형 확인

print(a, ':', type(a))
print(b, ':', type(b))
print(c, ':', type(c))
print(d, ':', type(d))
print(e, ':', type(e))
print(f, ':', type(f))

1 : <class 'int'>
-3 : <class 'int'>
0.5 : <class 'float'>
(4+5j) : <class 'complex'>
Hi : <class 'str'>
안녕 : <class 'str'>

 

- 변수명은 가능하면 쉽게 알아볼 수 있는 단어를 사용하는 것이 좋다.

- 변수의 이름은 기억하기 쉽고 구분하기 쉽게 작성하면 된다.

- 정해진 규칙은 없지만 언어에 따라, 또는 팀에 따라 권장하는 형태는 존재한다. (협업을 위해서는 규칙을 따르는것이 좋다) 

 

정수부

int_data = 10
bin_data = 0b10 
oct_data = 0o10
hex_data = 0x10
long_data = 1234567890123456789
print(int_data, type(int_data))
print(bin_data, type(bin_data))
print(oct_data, type(oct_data))
print(hex_data,type(hex_data ))
print(long_data,type(long_data))

10 <class 'int'>
2 <class 'int'>
8 <class 'int'>
16 <class 'int'>
1234567890123456789 <class 'int'>

 

실수부

f1 = 1.0
f2 = 3.14
f3 = 1.56e3
f4 = -0.7e-4
print(f1, type(f1) )
print(f2 , type(f2) )
print(f3 , type(f3) )
print(f4 , type(f4) )

1.0 <class 'float'>
3.14 <class 'float'>
1560.0 <class 'float'>
-7e-05 <class 'float'>

 

복소수

c1 = 1+7j
print(c1)
print(type(c1))
print(c1.real); print(c1.imag)

(1+7j)
<class 'complex'>
1.0
7.0

c2 = complex(2, 3)
print(c2)

(2+3j)

 

연산

a = 1
b = 2
ret = a + b
print('a와 b를 더한 값은 ', end='')
print(ret, end='')
print(' 입니다')

a와 b를 더한 값은 3 입니다

 

불리언

a = True
b = False

print(a == 1)       # True가 출력됨
print(b != 0)        # False가 출력됨

True

False

 

비교 연산자

x = 1; y = 2
str1 = 'abc'; str2 = 'python'

print(x == y)  # False가 출력됨
print(x != y)   # True가 출력됨
print(str1 == str2)   # False가 출력됨
print(str2 == 'python')   # True가 출력됨
print(str1 < str2)        # True가 출력됨, 아스키코드 내에서 비교

False

True

False

True

True

 

논리연산자

and - 둘다 만족하는가

or - 둘 중 하나만 만족해도됨

not  - 반대값 출력

bool1 = True; bool2 = False; bool3 = True; bool4 = False

print(bool1 and bool2)    # False가 출력됨
print(bool1 and bool3)    # True가 출력됨
print(bool2 or bool3)     # True가 출력됨
print(bool2 or bool4)     # False가 출력됨
print(not bool1)          # False가 출력됨
print(not bool2)          # True가 출력됨

False

True

True

False

False

True

 

& 연산자 (비트 AND 연산자)
두 비트가 모두 1일 때 결과가 1이 되는 연산자입니다.

  • a & b
  • a = 5 (이진수: 0101)
  • b = 3 (이진수: 0011)
  • a & b = 1 (이진수: 0001)


| 연산자 (비트 OR 연산자)
두 비트 중 하나라도 1이면 결과가 1이 되는 연산자입니다.

  • a | b
  • a = 5 (이진수: 0101)
  • b = 3 (이진수: 0011)
  • a | b = 7 (이진수: 0111)


^ 연산자 (비트 XOR 연산자)
두 비트가 서로 다를 때 결과가 1이 되는 연산자입니다.

  • a ^ b
  • a = 5 (이진수: 0101)
  • b = 3 (이진수: 0011)
  • a ^ b = 6 (이진수: 0110)


>> 연산자 (비트 우측 시프트 연산자)
비트를 오른쪽으로 이동시키는 연산자입니다. 오른쪽으로 이동하면 비트가 버려지고 왼쪽은 0으로 채워집니다.

  • a >> n
  • a = 8 (이진수: 1000)
  • n = 2
  • a >> 2 = 2 (이진수: 0010)


<< 연산자 (비트 좌측 시프트 연산자)
비트를 왼쪽으로 이동시키는 연산자입니다. 왼쪽으로 이동하면 비트가 버려지고 오른쪽은 0으로 채워집니다.

  • a << n
  • a = 3 (이진수: 0011)
  • n = 2
  • a << 2 = 12 (이진수: 1100)

 

 

 

 

 

bit1 = 0x61
bit2 = 0x62

print(hex(bit1 & bit2))    # 0x60이 출력됨
print(hex(bit1 | bit2))     # 0x63이 출력됨
print(hex(bit1 ^ bit2))     # 0x3 이 출력됨
print(hex(bit1 >> 1))      # 0x30이 출력됨
print(hex(bit1 << 2))      # 0x184가 출력됨

0x60

0x63

0x3

0x30

0x184

 

변수들이 하나가 아니라 여러 개가 모여서 구성된 데이터의 형태

- 리스트, 튜플, 딕셔너리

 

리스트(List)

- 리스트는 대부분의 프로그래밍 언어에서 배열, Array라고 표현하는 것과 비슷함.

    - 배열은 동일한 형태(실수끼리, 문자열끼리... 등)의 데이터 여러 개가 순서대로 모여 있는 것을 말하지만 파이썬의 List        는 꼭 동일한 형태가 아니어도 관계없다.
    - 예를 들면 Java와 같은 언어에서의 Collection 이란 것과 비슷하다고 볼 수 있다.
    - 리스트의 데이터는 대괄호 [ ]로 둘러싸서 표시하며 내부의 데이터는 콤마( , )로 구분한다.

    - 리스트 속에 또 다른 리스트들이 들어갈 수 있다.

list1 = [1,2,3,5,7]
list2 = ['hello', 'good morning', 'a', 'b', 'c']
list3 = [2,4,'bye',[6,8,10],['see', 'you', 'later']]

 

 

 

튜플(Tuple)

- 튜플은 리스트와 비슷한데 리스트는 안에 들어있는 값을 바꿀 수 있는 반면에 튜플은 바꿀 수 없다는 차이가 있다.

- 튜플의 데이터는 괄호 ( ) 로 둘러싸서 표시하며 안에 있는 데이터는 콤마( , )로 구분한다.

 

 

딕셔너리(Dictionary)

  • 딕셔너리의 데이터는 중괄호 { } 로 둘러싸서 표시하며 내부의 데이터는 콤마( , )로 구분한다.
  • 딕셔너리의 데이터는 "키:값"의 형태를 가진 한 쌍의 요소로 구성되어 있다.
  • 리스트, 튜플과 달리 딕셔너리는 데이터에 인덱스가 지정되어있지 않다.

다음 포스팅에서 시퀀스 자료형에 대해서 자세하게 다룰 예정입니다!

 

 

 

 

 

 

 

 

728x90

'PYTHON-BACK' 카테고리의 다른 글

#파이썬 기초 5일차_1  (1) 2024.07.03
#파이썬 기초 4일차_2  (1) 2024.07.02
#파이썬 기초 4일차_1  (0) 2024.07.02
#파이썬 기초 3일차  (1) 2024.07.01
#파이썬 기초 1일차  (0) 2024.06.27