티스토리 뷰

AI/Python

[Python] 문자열, 함수

brave_sol 2024. 6. 6. 19:48

[1] 문자열

- 시퀀스 자료형(리스트와 비슷함)으로 문자형 data를 메모리에 저장

- 영문자 한 글자는 1byte의 메모리공간을 사용

 

(1) Byte

- 컴퓨터는 모든 데이터를 2진수로 저장  => 변환 규칙(UTF-8, 아스키코드 등)

- 이진수 한 자리는 1bit로 저장됨, 즉 1bit 는 0도는 1

- 1byte = 8bit = 2^8 = 256까지 저장 가능

*CPU :한번에 처리할 수 있는 데이터 양, 64bit = 2^64까지 처리 가능

- 데이터 타입은 메모리의 효율적 활용을 위해 매우 중요(int 4byte, long 무제한, float 8바이트)

 

(2)인덱싱 indexing a[0]

- 각 문자열의 각 문자는 개별주소(offset)을 가짐

- 이 주소를 사용해 할당된 값을 가져오는 것이 인덱싱

- List와 같은 형태로 데이터를 처리함

 

(3) 슬라이싱 slicing a[시작, 끝+1, step]

- 문자열의 주소값을 기반으로 문자열의 부분값을 반환

- 문자열 뒤집기 : [::-1]

 

(4) 덧셈과 뺄셈 연산 가능, in 명령으로 포함여부 체크

 

(5) 문자열 함수

함수명 기능 예시
len(a) 문자열의 문자 개수를 반환  
a.upper() 대문자로 변환  
a.lower() 소문자로 변환  
a.capitalize() 첫 문자를 대문자로 변환 a= "dgsdf abcdefg"
print(a.title()) 출력→ Dgsdf Abcdefg
print(a.capitalize()) 출력→ Dgsdf abcdefg
* 원본은 바뀌지 않음
a.title() 제목형태로 변환
띄어쓰기 후 첫글자만 대문자
a.count('abc') 문자열 a에 'abc'가 들어간 횟수 반환  
a.find('abc')
a.rfind('abc)
문자열 a에 'abc'가 들어간 위치(오프셋) 반환  
a.startswith('abc') 문자열 a는 'abc'로 시자하는 문자열여부 반환  
a.endswith('abc') 문자열 a는 'abc'로 끝나는 문자열여부 반환  
a.strip() 좌우 공백을 없앰  
a.rstrip() 오른쪽 공백을 없앰  
a.lstrip() 왼쪽 공백을 없앰  
a.split() 공백을 기준으로 나눠 리스트로 반환  
a.split('abc') abc를 기준으로 나눠 리스트로 반환  
a.isdigit() 문자열이 숫자인지 여부 반환  
a.islower() 문자열이 소문자인지 여부 반환  
a.isupper() 문자열이 대문자인지 여부 반환  

 

(6) 다양한 문자열 표현

- 문자열 선언은 큰 따옴표("")나 작은따옴표('')를 활용

a. 예시

상황 예시
 It's ok. '를 출력해야 하는 상황

① '앞에 \붙여줌
② 큰 따옴표로 작은 따옴표를 감싸줌
print("it's ok.")
print('it\'s ok.')

출력 →

it's ok.
두 줄 이상 저장

① \n 개행
② 큰따옴표 또는 작은따옴표 세 번 연속 사용
print("it's\n\nok.")
print("""it's
      
ok.""")

출력 →

it's

ok.
it's

ok.

 

b. 이스케이프 \ 문자

문자 설명 문자 설명
\ [Enter]

다음 줄과 연속임을 표현 \n 줄 바꾸기
\\ \문자 자체 \t tab키
\` `문자 \e esc키
\" "문자 \b 백 스페이스

 

c. raw string : r"문자열"

print(r"안녕하세요\n하이") → 안녕하세요\n하이 # \n 그대로 출력

 

[2] 함수

(1) 함수에서 parameter를 전달하는 방식

값에 의한 호출(Call by Value) 참조에 의한 호출(Call by Reference) 객체 참조에 의한 호출
(Call by Object Reference)
함수에 인자를 넘길 때 값만 넘김. 함수 내에 인자 값 변경시, 호출자에 영향을 주지 않음 함수에 인자를 넘길 때 메모리 주소를 넘김. 함수 내에 인자 값 변경 시, 호출자의 값도 변경됨
*C의 포인터처럼
- 파이썬은 객체의 주소가 함수로 전달되는 방식, 객체를 그대로 받아옴
- 전달된 객체를 참조하여 변경 시 호출자에게 영향을 주나, 새로운 객체를 만들 경우 호출자에게 영향을 주지 않음
* list의 메모리 방식과 유사
def f(x): ← a에 있던 5가 넘어감
  x = 7 ← a는 그대로 5

a=5
f(a)
  def f(x):
→ x도 같은 메모리의 주소값을 가리킴
  x.append(1) # [0,1]
→ 가리키턴 곳에 1 추가
  x = [2,3] 
 a 주소를 가리키던게 끊기고
x는 새로운 곳에 [2,3] 생성


a = [0] → a는 메모리의 주소값을 가리킴
f(a)
print(a) # [0,1]

 

(2) swap(교환) : 함수를 통해 변수 간의 값을 교환(swap)하는 함수, call by ... 를 설명하기 위한 전통적인 함수 예시

 swap_value swap_offset swap_reference
a = [1,2,3,4,5]

def swap_value(x,y):
  temp = x
  x = y
  y = temp
swap_value( a[1],a[2] )
print(a) #  [1,2,3,4,5]
def swap_offset(offset_x, offset_y):
  temp = a[offset_x]
  a[offset_x] = a[offset_y]
  a[offset_y] = temp

swap_offset(1,2) 
print(a) # [1, 3, 2, 4, 5]
def swap_reference(list, offset_x, offset_y):
  temp = list[offset_x]
  list[offset_x] = list[offset_y]
  list[offset_y] = temp

swap_reference(a,0,3)
print(a) # [4, 3, 2, 1, 5]
a에 영향 X a리스의 전역 변수 값을 직접 변경 a리스트 객체의 주소값을 받아 값을 변경

 

(3) 주의사항

append()같은걸 잘못 하면 값 자체가 바뀌기 때문에 바로 변경하지 말고 복사한 값을 쓰는게 안전함!

 

(4) 변수의 범위

- 변수가 사용되는 범위(함수 또는 메인 프로그램0

- 지역변수 local variable : 함수 내에서만 사용

- 전역변수 Global variable : 프로그램 전체에서 사용

def f():

   global s → 밖에있는 전역 변수 s 쓸게~

   s= "I love London!"

   print(s)

 

s = "I love Paris!"

f()  # I love London!

print(s)  # I love London!

 

(5) 재귀함수

- 자기자신을 호출하는 함수

- 점화식과 같은 재귀적 수학 모형을 표현할 때 사용

- 재귀 종료 조건 존재, 종료 조건까지 함수호출 반복

 

(6) Type hints

- 파이썬의 가장 큰 특징: dynamic typing

- 처음 함수를 사용하는 사용자가 interface를 알기 어렵다는 단점이 있음

=> type hints 기능 제공

def 함수이름(변수이름: 변수타입)-> 리턴 타입:

   return 

 

*Type hints의 장점

- 사용자에게 인터페이스를  명확히 알려줄 수 있다

- 함수의 문서화시 parameter에 대한 정보를 명확히 알 수 있다.

- mypy 또는 IDE, linter등을 통해 코드의 발생 가능한 오류를 사전에 확인

- 시스템 전체적인 안정성을 화보할 수 있다.

 

(7) docstring (함수에 다는 주석, 목적을 사전에 적음 """ """ 형식으로)

- 파이썬 함수에 대한 상세스펙을 사전에 작성하여 함수 사용자의 이해도를 높임

- 세개의 따옴표 docstring 영역 표시(함수명 아래)

- 목적, 파라미터내용, 리턴값에 대한 상세한 설명, 예제 등

- vscode에 익스텐션 설치하면 좋음 python docstring generator

 

(8) 함수 작성 가이드라인

- 함수는 가능하면 짧게 작성할 걸(줄 수를 줄일 것)

- 함수 이름에 함수의 역할(verb), 의도(object)가 명확히 들어낼 것

- 함수명: verb_obejct 형태로, 띄어쓰기대신_ 

- 하나의 함수에는 유사한 역할을 하는 코드만 포함 (더하기+출력 같이 묶지 X)

- 인자로 받은 값 자체를 바꾸진 말 것 (임시변수 선언), 값을 복사해서 처리

 

(9) 함수는 언제 만드는가?

- 공통적으로 사용되는 코드는 함수로 변환

- 복잡한 수식(ex.근의공식)은 식별 가능한 이름의 함수로 변환

- 복잡한 조건은 식별 가능한 이름의 함수로 변환

 

(10) 코딩은 팀플!

컴퓨터가 이해할 수 있는 코드는 어느 바보나 다 짤 수 있다.

좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다. -마틴 파울러-

코드 = 보고서, 쉽게, 남이 이해할 수 있게

=> 규칙: 코딩컨벤션

=> flake8 모듈로 체크, flake8<파일명> 

=> 최근에는 black모듈 활용하여 pep8 like 수준 준수(black codename.py명령을 사용)

- 명확한 규칙은 없음. 구글python 컨벤션 참고하기

- 때로는 팀마다, 프로젝트마다 따로

- 중요한건 일관성

- 읽기 좋은 코드가 좋은 코드

- 들여쓰기는 Tab 보다 4 Space (공백4칸 권장)많이 사용, 중요한건 혼합하지마라!

- 한 줄은 최대 79자 까지

- 불필요한 공백은 피함

- 연산자는 1칸 이상 안 띄움

- 주석은 항상 갱신, 불필요한 주석은 삭제

- 코드의 마지막에는 항상 한 줄 추가

- 소문자l, 대문자O, 대문자I 금지

- 함수명은 소문자로 구성, 필요하면 밑줄로 나눔

 

 

 

 

※ 출처 : 네이버 부스트코스 - 인공지능 기초 다지기(https://www.boostcourse.org/ai100)

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함