Gom3rye
파이썬 프로그래밍 본문
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. 제어문
- 종류 ⇒ if : 분기문 ⇒ for : 순회 - 데이터의 묶음을 순차적으로 접근 ⇒ while : 반복
- 파이썬에서 블록 ⇒ 제어문의 영역, 함수, 클래스, 파일이 코드 블럭이 될 수 있습니다. ⇒ 작성 규칙
- 내부 블록의 코드는 같은 거리만큼 들여쓰기가 되어야 한다. 일반적으로 4칸
- 탭을 사용할 수 있지만 권장하지는 않은
- 제어문, 함수, 클래스를 가지고 내부 블록을 만들 때는 반드시 첫 번째 줄이 : 으로 끝나야 합니다.
- 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
- 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 쓰기 왠만하면 (장고 쓰지 말고)
'현대 오토에버 클라우드 스쿨' 카테고리의 다른 글
데이터베이스 (2) | 2025.05.20 |
---|---|
Web Programming (0) | 2025.05.20 |
파이썬 프로그래밍 (0) | 2025.05.20 |
파이썬 프로그래밍 (0) | 2025.05.20 |
파이썬 프로그래밍 (0) | 2025.05.20 |