세션 복습/파이썬 세션

파이썬 베이직 (3)

경민212 2025. 1. 13. 16:34

* 실습

 

- 1번 문제

 

문자열을 입력 받아 각 단어가 몇 번 등장했는지 계산하는 word_frequency 함수를 작성하세요.

  • 빈 문자열 인 경우 "입력한 문자열이 없습니다."를 반환해주세요.
  • 힌트
    • 문자열을 split() 메서드로 나눌 수 있습니다.
    • 딕셔너리를 사용해 단어 빈도를 계산하세요.

정답

def word_frequency(text):
    # not text는 text가 빈 문자열이거나 None일때 True를 반환한다.
    if not text:
        return("입력한 문자열이 없습니다.")
    
    # 입력 문자열을 단어 단위로 분리한다(공백을 기준으로)
    words = text.split()
    frequency = {}
    # 리스트 words의 각 단어 순회
    for word in words:
        # 딕셔너리에 해당 단어가 이미 존재하는지 확인
        if word in frequency:
            frequency[word] += 1
        else:
            frequency[word[ = 1
    return frequency
# 테스트 1
text1 = "hello world hello python world"
print(word_frequency(text1))  
# 출력: {'hello': 2, 'world': 2, 'python': 1}

# 테스트 2
text2 = ""
print(word_frequency(text2))
# 출력: 입력한 문자열이 없습니다.

 

- 2번 문제

 

Seaborn 라이브러리에서 제공하는 Penguins 데이터셋을 활용하여 다음을 수행하세요:

  • 조건 1) 데이터 null값을 확인하고, 모든 칼럼에서 null값을 삭제하세요.
  • 조건 2) 선택된 데이터에서 species, sex, bill_length_mm, bill_depth_mm 열만 추출하세요.
  • 조건 3) species가 "Adelie"이면서 bill_length_mm이 40 이상이거나, species가 "Chinstrap"이면서 bill_length_mm이 30 이하인 데이터를 선택하세요.

final_result 데이터 프레임에 저장하고, shape을 출력하세요.

 

정답

import seaborn as sns

# Penguins 데이터셋 로드
penguins = sns.load_dataset("penguins")

penguins.dropna(how = 'any', inplace = True)

- 주의 : penguins.dropna(how = “any”, inplace = True) - inplace = True 옵션 사용

- how = any 행에 하나라도 결측값이 있으면 삭제하는 옵션

- 주의 : 열 선택 -> '이중리스트'

# 'species'가 'Adelie' 면서 'bill_length_mm'이 40 이상이거나
# 'species'가 'Chinstrap'면서 'bill_length_mm'이 30 이하인 데이터 선택

cond1 = (result["species"] == "Adelie") & (result["bill_length_mm"] >= 40)
cond2 = (result["species"] == "Chinstrap") & (result["bill_length_mm"] <= 30)

- 주의 : AND(&)와 OR(|) 연산자를 사용할 때 각 조건을 괄호로 감싸야 함

            .shape : 행과 열 개추 출력

# 앞부분 5개 행 확인
penguins.head()

# 칼럼별 정보 확인
penguins.info()

# 칼럼의 값 분포 확인
penguins['species'].value_counts()

# 행, 열 확인
penguins.shape

# 데이터 타입 확인
penguins.dtypes

# 칼럼명 확인
penguins.columns

 

1. 함수

 

1.1 함수

코드의 재사용성과 가독성을 높이기 위해 기능을 분리

- 정의 : def 함수명(매개변수) : 구문으로 함수 정의

def greet(name):
    return f"Hello, {name}!"

- 호출 : 함수 이름과 매개변수를 사용하여 호출

print(greet("Alice"))

- 기본값 매개변수 : 매개변수에 기본값을 설정

def greet(name = "Guest"):
    return f"Hello, {name}!"

 

* return 과 print 의 차이

return : 함수의 결과값을 반환하며 함수 호출이 끝난 후에도 값을 다른 변수에 저장하거나 추가 계산에 사용할 수 있다.

def add(a, b):
    return a + b

result = add(3, 5)
print(result)  # 8 출력

 

print : 화면에 값을 출력하는 역할을 하며, 값을 반환하지 않음

def add_and_print(a, b):
    print(a + b)

result = add_and_print(3, 5)  # 8 출력
print(result)  # None 출력 (값 반환 없음)

 

* 함수 작성 시 유의할 점

1. 매개변수의 개수 

- 매개 변수가 없는 경우 : 함수가 고정된 동작을 수행하고 외부 입력을 받지 않음 

def greet():
    return "Hello!"
print(greet())  # 출력 : Hello!

- 매개변수가 여러 개인 경우 : 명확하게 순서를 정의하고, 기본값을 사용하여 선택적 매개변수를 제공할 수 있다.

def introduce(name, age, city = "Unknown"):
    return f"My name is {name}, I am {age} years old and I live in {city}."
print(introduce("Alice", 25)) # 도시 기본값 사용
print(introduce("Bob", 30, "Seoul")) # 모든 매개변수 지정

 

2. 함수 이름 

- 함수의 기능을 명확히 나타내는 이름을 사용

- 동사로 시작하는 것이 권장됨

def calculate_sum(numbers):
    pass

 

3. 들여쓰기

- 함수 내부의 코드 블록은 반드시 들여쓰기를 준수

 

4. 문서화 Docstring

- 함수의 목적, 입력값, 반환값을 간단히 설명

def multiply(a, b):
   """
   두 수를 곱한 값을 반환합니다.
   
   Args:
       a (int) : 첫 번째 숫자
       b (int) : 두 번째 숫자
       
   Returns:
       int : 두 수의 곱
   """
   return a * b

 

5. 에러 처리

- 예상되는 입력값 오류를 처리

def divide(a, b):
    if b == 0:
        return "0으로 나눌 수 없습니다"
    return a / b

 

- 실수 방지 팁

  • 함수 정의 시, 반드시 콜론 : 포함
  • return 문 동작시, 함수가 종료됨
def foo(num1 : int, num2: int, num3: int):
    average = (num1 + num2 + num3)/3
    print(average)
    # return 뒤에 아무 값도 지정하지 않았기 때문에, 함수는 None을 반환
    return
    # 첫 번째 return 문은 아무 값을 반환하지 않고 함수 실행을 종료
    # return average는 절대 실행되지 않는 **비사용 코드(dead code)**
    return average
    
x = foo(1, 2, 3)

# 평균값 (1 + 2 + 3) / 3 = 2.0이 출력
# 하지만 함수는 None을 반환하므로 x의 값은 None
  • return 문 누락 주의
# foo함수 반환 값의 타입은?
	
	def foo(hours: int):  # 정의에 따르면 hours는 int 타입으로 입력된다.
		"""
		Precondition: hours > 0
		"""
		salary = 23.23 * hours  # 23.23은 float이고, hours는 int이므로 결과는 float 타입이 된다.
		# return salary (수정)
	
	# A. int
	# B. float
	# C. str
	# D. None  -> return 이 없을 경우 파이썬은 **None**을 반환
	# E. Error.
  • 매개변수로 다양한 타입 사용 가능
# x의 값은?

def foo(xs: list , x: int) -> list:
	xs.append(x)
	return xs

x = [5,9]
x = foo(x,2) + x 

# A. [5,9,2]
# B. [5,9,2,5,9]
# C. [5,9,2,5,9,2]
# D. Error
# E. 닶 없음

 

더보기

함수 호출 foo(x, 2):

  • x는 [5,9]입니다.
  • x.append(2)가 실행되며, 리스트 x는 [5,9,2]로 변경됩니다.
  • foo 함수는 이 리스트 [5,9,2]를 반환합니다.

계산 foo(x, 2) + x

  • foo(x, 2)의 반환 값은 [5,9,2]입니다.
  • 이 반환 값에 원래 x ([5,9,2])를 리스트 덧셈(+)으로 합칩니다:
x = [5,9,2] + [5,9,2]

 

  • 리스트 덧셈은 두 리스트를 이어붙입니다.
  • 결과는 [5,9,2,5,9,2]입니다.

 

  • 타입힌트를 써주는 것이 좋으나, 강제성을 가지는 것은 아니다.
# x의 타입은?

def foo(word1: str, word2: str):
	output = word1 + word2
	return output
	return
	
x = foo(1, 2.0)

	# A. int
	# B. float
	# C. str
	# D. None
	# E. Error
더보기

word1 + word2의 동작:

  • 1(정수)와 2.0(부동소수점)은 더할 수 있습니다.
  • Python에서 정수와 부동소수점을 더하면 결과는 부동소수점(float)으로 반환됩니다.
  • 따라서 output은 3.0이라는 값을 가지게 됩니다.

반환값:

  • return output에 의해 3.0이 반환됩니다.
  • 따라서 x = foo(1, 2.0)의 결과는 x = 3.0이 됩니다.

 

2. Pandas 데이터 선택

 

2.1 데이터 선택

 

* 내용

- 열 선택 : 데이터프레임에서 특정 열을 선택

import pandas as pd
df = pd.DataFrame({"Name": ["Alice", "Bob"], "Age" : [25, 30]})
print(df["Name"])

- 행 선택 iloc : 정수 기반 인덱스로 특정 행을 선택

print(df.iloc[0]) # 첫 번째 행 출력

 

- 행 선택 loc : 라벨 기반 인덱스로 특정 행을 선택

import pandas as pd
df = pd.DataFrame({"Name": ["Alice", "Bob"], "Age" : [25, 30]}), index = ["a", "b"]
print(df.loc["a"])

 

- 실수 방지 팁

  • 열 이름이나 인덱스 라벨은 대소문자를 구분하므로 정확히 입력.
  • .iloc는 정수 인덱스를, .loc는 라벨 인덱스를 사용하는지 확인.
  • 조건 필터링 시, 반드시 df[조건] 형식으로 조회해야 함.
df["Age"] > 25]  #True/False 칼럼만 반환