현대 오토에버 클라우드 스쿨

파이썬 프로그래밍

Gom3rye 2025. 5. 20. 09:31

1. 자료형 변환

  • int, float, bool, str 함수를 이용
  • 실수를 정수로 변환할 때 어떤 일이 발생? ValueError: invalid literal for int() with base 10: '55.9’
  • 모든 데이터를 문자열로 변환할 때는 에러가 발생하지 않는데 숫자로 변환할 수 없는 문자열을 숫자로 변환했을 때는? ValueError: invalid literal for int() with base 10: 'F55’
  • 웹에서 주는 모든 숫자는 문자열, 1page로 가고 싶으면 int로 바꿔야 한다.

가상환경 : Application 개발할 때 쓰는 것! 대부분 개발 환경과 운영 환경은 분리되어 있다.

(운영 환경에서는 대부분 프로그램 한 개만 돌린다. ex. database server → database만 있고 web server 두지 않을 것)

클라우드 네이티브 환경 → 왠만한 일은 항상 코드로 해라. 인간이 하면 실수를 할 수 있으니까. 그리고 그 코드는 immutable로 만들어라. 그럼 더 실수나 문제가 생길 가능성이 없어질 것

개발 환경의 가상 환경을 운영 환경에 가지고 가는 것 → 도커 ⇒ 이걸 여러 개 배포해주는 건 k8s

Lib - 나중에 설치하는 것

Include - 처음부터 가지고 오는 것 (Lib, Include 둘 다 비슷하다고 보면 된다.)

Scripts - 명령어들의 모음

bat - 배치 파일의 약자 (고정된 명령어들의 파일, 맥에서는 sh)

확장자가 bat이면 확장자 안 적어도 된다. But, 맥에서는 sh를 생략하는 것과 안 하는 것은 다른 의미이다.

.exe 같은 실행 확장자 아니면 사실 없어도 별 필요 없음, 그냥 더블 클릭했을 때 바로 실행될 수 있게끔 하는 거지

int(x, base=10) → integer (base는 진법, 2진법으로 주고 싶으면 base=2 하면 된다.)

age = int(age) 왠만하면 이렇게는 안했으면 좋겠다. → 원래 가지고 있던 문자열 55를 쓸 수 가 없게 되니까 왠만하면 다른 변수명으로 해서 넣어라. 프로그래밍을 하면서 한 번에 성공하는 경우는 없음. 만약 안 되었을 때 다시 찾아야 하니까

2. 콘솔 입출력

  • Console: Windows에서는 Command 창이고 리눅스나 맥에서는 Terminal 창이며 IDE에서는 별도의 콘솔 창을 제공
  • 출력은 print() 이용
    • 서식을 설정해서 출력 : 콘솔 응용 프로그램 만들 때 보기 좋게 출력하기 위해서 사용하거나 데이터를 포함해서 출력하고자 할 때 사용
      • %s : 문자열 데이터
      • %d, %i : 정수
      • %f : 실수
      • %% : 문자 자체
      • 자릿수를 지정해서 출력 가능, 실수의 경우는 소수 부분을 반올림해서 출력 가능 ex) print("파이 값을 소수 세 째 자리에서와 소수 다섯 째 자리에서 반올림 %.2f %.4f" %(pi, pi))
    • f-Strings : 파이썬에서 다른 데이터를 포함해서 문자열을 만들 때 f”문자열 나열 {데이터 이름}” 의 형태로 문자열을 생성하는 방식 → 이 방식으로 쓰길 권장!! Not 문자열 + 문자열 BC 자원의 낭비
      • age = 55, 나의 나이는 age 입니다. 형태의 문자열 만들기
      • f”나의 나이는 {age} 입니다. ⇒ O
      • ”나의 나이는 “ + str(age) + “입니다.” ⇒ X (문자열은 immutable 이어서 복사해서 붙여넣고 하면 메모리 낭비될 수 있음)
  • help(print) 입력
    • *args : 데이터 몇 개를 주든지 상관 없음
    • sep=’ ‘ : 공백으로 데이터 나눠줘라 (print(1, 2, sep=’\n’) = print(1), print(2)한 결과)
    • end=’\n’ 출력 다 하면 줄바꿈 해주겠다.
    • file=None : 파일을 넣었을 때 안 돌려준다.
    • flush=False : 버퍼를 안 비우겠다.

클라이언트 → 메모리 많이 잡아먹으면 안 된다. 서버는 하나밖에 안 깔아놓으니까 상대적으로 괜찮다.

  • 콘솔 입력 : input 함수를 입력
    • input(메시지) 형태로 사용해서 콘솔로부터 입력을 받는다.
    • 입력 받은 데이터는 문자열로 리턴된다.

3. 제어문

  1. 종류 ⇒ if : 분기문 ⇒ for : 순회 - 데이터의 묶음을 순차적으로 접근 ⇒ while : 반복
  2. 파이썬에서 블록 ⇒ 제어문의 영역, 함수, 클래스, 파일이 코드 블럭이 될 수 있습니다. ⇒ 작성 규칙
  • 내부 블록의 코드는 같은 거리만큼 들여쓰기가 되어야 한다. 일반적으로 4칸
  • 탭을 사용할 수 있지만 권장하지는 않은
  • 제어문, 함수, 클래스를 가지고 내부 블록을 만들 때는 반드시 첫 번째 줄이 : 으로 끝나야 합니다.
  1. if (조건에 의한 분기) ⇒ 표현식의 결과를 확인해서 True와 False인 경우 다른 내용을 수행시키기 위한 제어문 ⇒ 표현식 : True 또는 False가 나오는 연산식이나 변수 또는 함수 호출 구문 ⇒ elif 만들 때 주의할 점은 dead code 만들지 않아야 한다! ex) if score > 90: elif score > 100:
  • Boundary, Value, Analysis : 코테에서는 경계값 잘 확인하기 ⇒ 파이썬은 제어문에서 값 대입이 가능 ex) result = True if x==10 else False
  1. switch (값에 의한 분기) → 파이썬에서는 Switch를 제공하지 않음 ⇒ 딕셔너리를 이용하는 경우
  • 값이 0이면 일요일, 1이면 월, 2면 화, 3이면 수, 4면 목, 5면 금, 6이면 토, 그 외의 경우는 없는 날짜 - get 함수 잘 알기!! for 코테
weekday = {
    0:"일요일", 1:"월요일", 2:"화요일", 3:"수요일",
    4:"목요일", 5:"금요일", 6:"토요일"
}
print(weekday.get(2, "없는 날짜"))
print(weekday.get(9, "없는 날짜")) -> 없을 때 가져올 값 안 정해주면 에러!
  - 파이썬 최신 버전에서는 switch와 유사한 match가 추가됐다. (3.9 버전 밑이면 안 됌)
term = 1
match term:
    case 0:
        print("일요일")
    case 1:
        print("월요일")
case _:
    print("없는 날짜")
1. while
⇒ false가 될 때까지 동작한다. (True일 때 동작하는 게 아니라)
⇒ while - else
while  표현식:
    코드 블록 1
else:
    코드 블록 2
- else는 반복문이 정상적으로 종료된 경우 수행할 내용을 작성
2. for 순회문
- else 사용 가능
- for 임시변수 in 데이터모임: (데이터모임은 __iter__ 가 구현된 객체여야 한다.)
- range : 숫자열을 만들 때 사용하는 함수
⇒ range([시작값], 종료값, [간격])을 이용하면 숫자열 만들 수 있음
- 숫자 하나만 입력 → 종료값으로 인지하고 2개 입력 → 시작값과 종료값으로 인지
3. continue
⇒ 반복문 안에서 continue를 만나면 아래 문장 수행하지 않고 다음 반복으로 넘어간다.
4. break
⇒ 반복문 안에서 반복문을 중단하는 역할

금융쪽은 반복, 재귀에 대한 문제 항상 나옴, 젤 쉬운 게 피보나치 수열

### 4. 함수

: 자주 사용하는 코드 블럭을 하나의 이름으로 두고 호출만으로 사용하도록 하는 것

장점 1. 코드가 간결해지고 유지보수가 수월해진다.

         2. 코드를 분할해서 작성하기 때문에 가독성이 높아진다.

- built in function : 언어나 프레임워크가 제공해주는 함수

⇒ runtime에 생성하는 것이 가능 : 실행 시에 만들어지는 것이 가능

⇒ 함수를 다른 함수의 매개변수로 사용하는 것이 가능하고 함수를 리턴하는 것도 가능

`return`이 없는 함수는 **자동으로 `None`을 반환**해.

내장 함수 확인하는 방법 :

```python
print(dir(__builtins__))
  • user define function : 사용자가 기능을 정하는 함수

⇒ 개발자가 만들어 쓰는 함수

⇒ 프로그램을 모듈화하기 위해 작성 → 메모리를 효율적으로 사용하는 것이 가능

⇒ 함수를 호출하면 별도의 메모리를 할당받아서 사용하고(stack) 수행이 종료하면 메모리공간을 해체하고 리턴하기 때문 (수행이 끝나면 자기를 불렀던 곳으로 하나의 데이터(자료형 id)를 가지고 넘어감)

⇒ 리턴할 데이터가 없으면 생략하거나 None 하면 되고 여러 개의 데이터를 나열하면 하나의 tuple로 만들어서 리턴한다.

# swap 함수
def swap(a, b):
    return b, a # 2개를 리턴하기 때문에 ( , )로 묶어버린다.

a = 10; b = 20
print(swap(a, b)) # (20, 10)

⇒ 매개변수 (인자, argument, parameter) : 함수를 호출하는 곳에서 함수에게 넘겨주는 데이터

  • 매개변수 이름만 작성
  • 이름 : 자료형의 형태로 작성 → 이 방법을 더 권장함 & 리턴 타입도 기재하기를 권장
# 전통적인 방식
def add(a, b):
    return a + b
# 최근의 방식
def int_add_with_int(a: int, b: int) -> int:
    return a + b

→ 매개변수에 scala 데이터를 넘기면 데이터 자체를 넘기는 것으로 간주하고 scala 데이터가 아닌 vector(container, collection) data를 넘기면 참조를 넘기는 의미가 된다.

  • scala 데이터는 함수 내부에서 아무리 수정을 해도 원본 데이터에 영향 X
  • vector 데이터는 함수 내부에서 수정을 하면 원본 데이터에 영향이 있을 수 O
  • 함수에 매개변수가 있는 경우 매개변수를 대입하지 않고 함수 호출 시 에러 발생
    • *, **는 매개변수 안 줘도 에러 X
  • 파이썬에서는 이름을 이용해서 매개변수를 대입하는 것이 가능하다. (그래프 그릴 때 매개변수가 17개인 무자비한 함수도 있음 → 이럴 때 이름을 이용해서 매개변수 대입해야 함!)
def parameternameuse(a, b):
    print(f"a의 값은 {a}")
    print(f"b의 값은 {b}")
parameternameuse(100,200) # a의 값은 100, b의 값은 200
parameternameuse(b=100, a=200) # a의 값은 200, b의 값은 100
  • 파이썬에서는 매개변수의 기본 값을 설정할 수 있다.
  • 함수를 생성할 때 매개변수 이름 = 기본값 의 형태로 만들면 되고 기본값이 있는 매개변수의 값은 생략 가능) But 한 번 기본값 설정하면 그 이후에 나오는 모든 매개변수는 기본값이 설정되어야 한다.
def basicvalue(a,b=100):
    print(f"a의 값은 {a}")
    print(f"b의 값은 {b}")
basicvalue(100,200) # a=100, b=200
basicvalue(33) # a=33, b=100

⇒ 순수 함수

  • 함수의 실행이 외부 상태에 영향을 주지 않는 함수
  • 유사한 입력에 대해서 동일한 결과가 나온다.
  • 랜덤함수 같은 것을 사용하지 않음

⇒ 매개변수의 unpacking

  • 매개변수가 여러 개인 함수를 호출할 때 *과 함께 대입하면 압축이 해제되서 순서대로 매개변수에 대입된다. 이때 대입하는 데이터는 일반적으로 list, tuple, set 입니다.
  • **을 이용해서 dict를 대입하면 key 이름과 매개변수의 같은 것을 찾아서 매핑한다.
def info(name, age, gender):
    print(f"이름은 {name}, 나이는 {age}, 성별은 {gender}")
# 매개변수 이름을 이용해서 대입
info(name="adam", age=54, gender="남자")

# 매개변수 여러 개를 하나의 dict로 만들어서 한꺼번에 대입
arg = {"name" : "아담", "age" : 54, "gender" : "여자"}
info(**arg)

⇒ 가변 매개변수

  • 매개변수의 개수가 정해지지 않은 형식
  • *이나 **을 추가해서 선언하는데 *을 이용하면 내부에서는 tuple로 해석해서 사용하고 **을 이용하면 dict로 해석해서 사용한다.
# 최댓값 구하는 함수
def maxInt(arg1, arg2, *args): # ***args : 순서 있는 인자를 갯수 제한 없이 튜플로 받음**
    print(type(args)) # <class 'tuple'>
    maximum = arg1
    if maximum < arg2:
        maximum = arg2
    for imsi in args:
        if maximum < imsi:
            maximum = imsi
    return maximum

print(maxInt(100, 333, 50, 900, 200)) # 900
def greeting(**kwargs): # ****kwargs : 이름 있는 인자들을 딕셔너리 형태로 받음**
    if 'name' in kwargs:
        print(f"안녕하세요, {kwargs['name']}님!")
    if 'age' in kwargs:
        print(f"당신은 {kwargs['age']}살이군요.")
        
greeting(name="철수", age=25)
# ---- 결과 -------
# 안녕하세요, 철수님!
# 당신은 25살이군요.
def samplefunc(**kwargs):
    print(type(kwargs))
    print(kwargs.get("name", "이름 없음"))

samplefunc() 
# --- 결과 -------
# <class 'dict'> 
# 이름 없음

samplefunc(name="park", age=55)
# --- 결과 -------
# <class 'dict'> 
# park

⇒ 재귀 함수

  • 함수가 자기 자신을 호출하는 형태로 리턴하는 것
  • 코드가 간결해지는 대신 메모리를 많이 사용하고 실행 속도가 느림 → 메모이제이션(한 번 호출한 결과를 기억하고 있고 다음부터는 안 부르고 재활용 하는 것) 이용하면 이 문제 어느 정도 해결 가능

삼성 코테 → 재귀 (감독관 배치 문제), 하노이의 탑 많이 나온다.

[하노이의 탑 → 공부 못하는 아이들 집중력 기르도록 도와줌! (과학적으로 증명됌)]

⇒ pass

  • 내용 없는 함수나 클래스 만들 때 사용 (함수를 나중에 구현하기 위해 사용함)
def temp():
    pass # -> IndentationError 안 남

⇒ 함수의 도움말을 만드는 방법

  • 함수를 만들고 doc 속성에 작성해도 되고 함수 내부의 가장 첫 상단에 “”” “”” 안에 작성해도 된다.
  • 내가 만든 lib를 등록하고 싶을 때 사용

⇒ 파이썬의 함수는 일급 객체 (함수가 하나의 자료형)

  • 이것 때문에 파이썬에서는 함수를 변수에 대입하는 게 가능하고 함수의 매개변수로 사용할 수 있고 함수를 리턴하는 것도 가능!
def temp():
    print("hello")

variable = temp
variable() # hello

⇒ Lambda : 이름 없는 한 줄 짜리 함수로 동적으로 생성 가능

  • 정적 : 처음에 만들어두고 불변, 속도 빠름 ex) 서버, 임베디드, c언어
  • 동적 : 원하는 시점에 만들고 가변, 속도 느림 ex) 클라이언트

얼마나 데이터를 빠르게 수집해서 빠르게 뿌려주느냐 → 중요 in 클라우드 환경

  • lambda 매개변수 나열 : 리턴할 내용 → 실제 함수를 매개변수로 받는 함수에서 사용됨 ⇒ 주로 데이터를 순회하면서 작업을 수행하는 함수의 매개변수로 이용됨 ex) map, filter, reduce

⇒ map, filter, reduce

  • map(함수, 데이터) : 데이터를 순회하면서 함수를 적용해서 리턴한 값을 가지고 순서열 만듬 → 속도가 일반 반복문보다 빠름
datas = [10, 20, 30]
print(list(map(lambda a: a+1, datas))) # [11, 21, 31]
  • filter : bool 리턴하는 거
  • reduce : 데이터 2개 받아서 연산하는 거 만들어 주기

빅데이터에서의 map reduce : data들 가져와서 join하고 결과 내지 말고, 각각의 data에서 병렬 처리로 결과 낸 다음에 각각의 결과들을 join ⇒ 더 빠름!

sql : join을 하지 말아라! for 최적화

fastAPI 쓰기 왠만하면 (장고 쓰지 말고)

728x90
반응형