파이썬 베이직 (3)
* 실습
- 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 칼럼만 반환