pip install 모듈 이름
# 모듈 읽어 들임
from urllib import request
from bs4 import BeautifulSoup
# urlopen() 함수로 기상청의 전국 날씨 읽음
target = request.urlopen("http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108")
# BeautifulSoup을 사용해 웹 페이지 분석
soup = BeautifulSoup(target, "html.parser")
# location 태그 찾기
for location in soup.select("location"):
# 내부의 city, wf, tmn, tmx 태그 찾아 출력
print("도시:", location.select_one("city").string)
print("날씨:", location.select_one("wf").string)
print("최저기온:", location.select_one("tmn").string)
print("최고기온:", location.select_one("tmx").string)
print()
# hello 앞에 인사가 시작되었습니다.
# hello 뒤에 인사가 종료되었습니다 출력하는 함수
# 함수 데코레이터 생성
def test(function):
def wrapper():
print("인사가 시작되었습니다.")
function()
print("인사가 종료되었습니다.")
return wrapper
# 데코레이터 붙여 함수 만듦
@test
def hello():
print("hello")
# 함수 호출
hello()
# 실행 결과
----------
인사가 시작되었습니다.
hello
인사가 종료되었습니다.
# 모듈 가져옴
from functools import wraps
# 함수로 데코레이터 생성
def test(function):
@wraps(function)
def wrapper(*arg, **kwargs):
print("인사가 시작되었습니다.")
function(*arg, **kwargs)
print("인사가 종료되었습니다.")
return wrapper
__name__
# 실행 결과
----------
__main__
# 모듈 이름 출력하는 모듈 만들기
# main.py파일
import test_module
print("# 메인의 __name__출력하기")
print(__name__)
print()
# 실행 결과
----------
# 메인의 __name__출력하기
__main__
# test_module.py 파일
print("# 모듈의 __name__ 출력하기")
print(__name__)
print()
# 실행 결과
----------
# 모듈의 __name__ 출력하기
test_module
# 메인의 __name__ cnffurgkrl
__main__
PI = 3.141592
def number_input():
output = input("숫자 입력> ")
return float(output)
def get_circumference(radius):
return 2 * PI * radius
def get_circle_area(radius):
return PI * radius * radius
print("get_circumference(10):", get_circumference(10))
print("get_circle_area(10):", get_circle_area(10))
import test_module as test
radius = test.number_input()
print(test.get_circumference(radius))
print(test.get_circle_area(radius))
# 실행 결과
----------
get_circumference(10): 62.83184
get_circle_area(10): 314.1592
숫자 입력> 10
62.83184
314.1592
# 객체 만들기
# 학생 리스트를 선언함
students = [
{"name":"윤인성", "korean":87, "math":98, "english":88, "science":95},
{"name":"연하진", "korean":92, "math":98, "english":96, "science":98},
{"name":"구지연", "korean":76, "math":96, "english":94, "science":90},
{"name":"나선주", "korean":98, "math":92, "english":96, "science":92},
{"name":"윤아린", "korean":95, "math":98, "english":98, "science":98},
{"name":"윤명월", "korean":64, "math":88, "english":92, "science":92}
]
# 학생을 한 명씩 반복함
print("이름", "총점", "평균", sep="\t")
for student in students:
# 점수의 총합과 평균을 구함
score_sum = student["korean"] + student["math"] +\
student["english"] + student["science"]
score_average = score_sum / 4
# 출력
print(student["name"], score_sum, score_average, sep="\t")
# 실행 결과
----------
이름 총점 평균
윤인성 368 92.0
연하진 384 96.0
구지연 356 89.0
나선주 378 94.5
윤아린 389 97.25
윤명월 336 84.0
클래스는 객체에 포함할 변수와 함수를 미리 정의한 것이며 객체의 설계도에 해당함
class 클래스 이름:
. . . . 클래스 내용
이렇게 만들어진 클래스는 클래스 이름과 같은 함수(생성자)를 사용해서 객체를 만듦
인스턴스 이름(변수 이름) = 클래스 이름() ---> 생성자 함수라고 부름
이러한 클래스를 기반으로 만들어진 객체를 인스턴스(instence)라고 부름
# 클래스 선언
class Student:
### 생성자(constructor)
- 클래스 이름과 같은 함수
- 클래스 내부에__init__이라는 함수를 만들면 객체를 생성할 때 처리를 작성할 수 있음
> class 클래스 이름:
. . . . def __init__(self, 추가적인 매개변수):
. . . . . . . . pass
- 클래스 내부의 함수는 첫 번째 매개변수로 반드시 self를 입력해야 함
### self
- self는 '자기 자신'을 나타내는 딕셔너리라고 생각하면 됨
- self가 가지고 있는 속성과 기능에 접근할 때는 self.<식별자> 형태로 접근함
- self는 키워드가 아니라 단순한 식별자 이므로, 변수 이름을 활용해도 됨
- 그러나 모든 파이썬 개발자가 self라는 이름을 사용하고 있으므로 기본 규칙을 지키는 것이 좋음
```py
# 클래스 선언
class Student:
def __init__(self, name, korean, math, english, science):
self.name = name
self.korean = korean
self.math = math
self.english = english
self.science = science
# 학생 리스트 선언
students = [
Student("윤인성", 87, 98, 88, 95),
Student("연하진", 92, 98, 96, 98),
Student("구지연", 76, 96, 94, 90),
Student("나선주", 76, 96, 94, 90),
Student("윤아린", 95, 98, 98, 98),
Student("윤명월", 64, 88, 92, 92)
]
# Student 인스턴스의 속성에 접근하는 방법
students[0].name
students[0].korean
students[0].math
students[0].english
students[0].science
class 클래스 이름:
. . . . def 메소드 이름(self, 추가적인 매개변수):
. . . . . . . . pass
# 클래스 내부에 함수(메소드)선언
# 클래스 선언
class Student:
def __init__(self, name, korean, math, english, science):
self.name = name
self.korean = korean
self.math = math
self.english = english
self.science = science
def get_sum(self):
return self.korean + self.math +\
self.english + self.science
def get_average(self):
return self.get_sum() / 4
def to_string(self):
return "{}\t{}\t{}".format(\
self.name, \
self.get_sum(), \
self.get_average())
# 학생 리스트 선언
students = [
Student("윤인성", 87, 98, 88, 95),
Student("연하진", 92, 98, 96, 98),
Student("구지연", 76, 96, 94, 90),
Student("나선주", 76, 96, 94, 90),
Student("윤아린", 95, 98, 98, 98),
Student("윤명월", 64, 88, 92, 92)
]
# 학생을 한 명씩 반복
print("이름", "총점", "평균", sep="\t")
for student in students:
# 출력
print(student.to_string())
# 실행 결과
----------
이름 총점 평균
윤인성 368 92.0
연하진 384 96.0
구지연 356 89.0
나선주 356 89.0
윤아린 389 97.25
윤명월 336 84.0
isinstance(인스턴스, 클래스)
# 클래스 선언
class Student:
def __init__(self):
pass
# 학생 선언
student = Student()
# 인스턴스 확인하기
print("isinstance(student, Student):", isinstance(student, Student))
# 실행 결과
----------
isinstance(student, Student): True # student는 Student 클래스를 기반으로 만들었으므로 True를 출력함
# isinstance() 함수와 type()함수로 확인하는 것의 ㅊ아ㅣ
# 클래스 선언
class Human:
def __init__(self):
pass
class Student(Human):
def __init__(self):
pass
# 학생 선언
student = Student()
# 인스턴스 확인
print("isinstance(student, Human):", isinstance(student, Human))
print("type(student) == Human:", type(student) == Human)
# 실행 결과
----------
isinstance(student, Human): True
type(student) == Human: False
# __str__() 함수
# 클래스 선언
class Student:
def __init__(self, name, korean, math, english, science):
self.name = name
self.korean = korean
self.math = math
self.english = english
self.science = science
def get_sum(self):
return self.korean + self.math +\
self.english + self.science
def get_average(self):
return self.get_sum() / 4
def __str__(self):
return "{}\t{}\t{}".format(\
self.name, \
self.get_sum(), \
self.get_average())
# 학생 리스트 선언
students = [
Student("윤인성", 87, 98, 88, 95),
Student("연하진", 92, 98, 96, 98),
Student("구지연", 76, 96, 94, 90),
Student("나선주", 76, 96, 94, 90),
Student("윤아린", 95, 98, 98, 98),
Student("윤명월", 64, 88, 92, 92)
]
# 학생을 한 명씩 반복
print("이름", "총점", "평균", sep="\t")
for student in students:
print(str(student))
# 실행 결과
----------
이름 총점 평균
윤인성 368 92.0
연하진 384 96.0
구지연 356 89.0
나선주 356 89.0
윤아린 389 97.25
윤명월 336 84.0
이름 | 영어 | 설명 |
---|---|---|
eq | equal | 같다 |
ne | not equal | 다르다 |
gt | greater than | 크다 |
ge | greater than of equal | 크거나 같다 |
lt | less than | 작다 |
le | less than or equal | 작거나 같다 |
# 크기 비교 함수
# 클래스 선언
class Student:
def __init__(self, name, korean, math, english, science):
self.name = name
self.korean = korean
self.math = math
self.english = english
self.science = science
def get_sum(self):
return self.korean + self.math +\
self.english + self.science
def get_average(self):
return self.get_sum() / 4
def __str__(self):
return "{}\t{}\t{}".format(\
self.name,
self.get_sum(),
self.get_average())
def __eq__(self, value):
return self.get_sum() == value.get_sum()
def __eq__(self, value):
return self.get_sum() != value.get_sum()
def __eq__(self, value):
return self.get_sum() > value.get_sum()
def __eq__(self, value):
return self.get_sum() >= value.get_sum()
def __eq__(self, value):
return self.get_sum() < value.get_sum()
def __eq__(self, value):
return self.get_sum() <= value.get_sum()
# 학생 리스트 선언
students = [
Student("윤인성", 87, 98, 88, 95),
Student("연하진", 92, 98, 96, 98),
Student("구지연", 76, 96, 94, 90),
Student("나선주", 76, 96, 94, 90),
Student("윤아린", 95, 98, 98, 98),
Student("윤명월", 64, 88, 92, 92)
]
# 학생 선언
student_a = Student("윤인성", 87, 98, 88, 95),
student_b = Student("연하진", 92, 98, 96, 98),
# 출력
print("student_a == student_b = ", student_a == student_b)
print("student_a != student_b = ", student_a != student_b)
print("student_a > student_b = ", student_a > student_b)
print("student_a >= student_b = ", student_a >= student_b)
print("student_a < student_b = ", student_a < student_b)
print("student_a <= student_b = ", student_a <= student_b)
# 실행 결과
----------
student_a == student_b = True
student_a != student_b = False
student_a > student_b = False
student_a >= student_b = True
student_a < student_b = False
student_a <= student_b = True
class 클래스 이름:
. . . . 클래스 변수 = 값
클래스 이름.변수 이름
# 클래스 선언
class Student:
count = 0
def __init__(self, name, korean, math, english, science):
self.name = name
self.korean = korean
self.math = math
self.english = english
self.science = science
# 클래스 변수 설정
Student.count += 1
print("{}번째 학생이 생성되었습니다.".format(Student.count))
# 학생 리스트 선언
students = [
Student("윤인성", 87, 98, 88, 95),
Student("연하진", 92, 98, 96, 98),
Student("구지연", 76, 96, 94, 90),
Student("나선주", 76, 96, 94, 90),
Student("윤아린", 95, 98, 98, 98),
Student("윤명월", 64, 88, 92, 92)
]
# 출력
print()
print("현재 생성된 총 학생 수는 {}명입니다.".format(Student.count))
# 실행 결과
----------
1번째 학생이 생성되었습니다.
2번째 학생이 생성되었습니다.
3번째 학생이 생성되었습니다.
4번째 학생이 생성되었습니다.
5번째 학생이 생성되었습니다.
6번째 학생이 생성되었습니다.
현재 생성된 총 학생 수는 6명입니다.
클래스 변수처럼 그냥 클래스가 가진 함수
일반적인 함수로 만드나 클래스 함수로 만드나 사용에는 큰 차이가 없음
'클래스가 가진 기능'이라고 명시적으로 나타내는 것 뿐
생성하는 방법 : @classmethod 부분을 데코레이터라고 부름
클래스 함수 만들기
class 클래스 이름:
. . . . @classmethod
. . . . def 클래스 함수(cls, 매개변수): ---> cls이외에 원하는 이름을 사용해도 되지만, 관례적으로 cls 사용함
. . . . . . . . pass
클래스 함수 호출하기
클래스 이름.함수 이름(매개변수)
# 클래스 선언
class Student:
# 클래스 변수
count = 0
students = []
# 클래스 함수
@classmethod
def print(cls):
print("------ 학생 목록 ------")
print("이름\t총점\t평균")
for student in cls.students:
print(str(student))
print("------ ------ ------")
# 인스턴스 함수
def __init__(self, name, korean, math, english, science):
self.name = name
self.korean = korean
self.math = math
self.english = english
self.science = science
Student.count += 1
Student.students.append(self)
def get_sum(self):
return self.korean + self.math +\
self.english + self.science
def get_average(self):
return self.get_sum() / 4
def __str__(self):
return "{}\t{}\t{}".format(\
self.name,
self.get_sum(),
self.get_average())
# 학생 리스트 선언
Student("윤인성", 87, 98, 88, 95),
Student("연하진", 92, 98, 96, 98),
Student("구지연", 76, 96, 94, 90),
Student("나선주", 76, 96, 94, 90),
Student("윤아린", 95, 98, 98, 98),
Student("윤명월", 64, 88, 92, 92),
Student("김미화", 82, 86, 98, 88),
Student("김연화", 88, 74, 78, 92),
Student("박아현", 97, 92, 88, 95),
Student("서준서", 45, 52, 72, 78)
# 현재 생성된 학생 모두 출력
Student.print()
# 실행 결과
----------
------ 학생 목록 ------
이름 총점 평균
윤인성 368 92.0
연하진 384 96.0
구지연 356 89.0
나선주 356 89.0
윤아린 389 97.25
윤명월 336 84.0
김미화 354 88.5
김연화 332 83.0
박아현 372 93.0
서준서 247 61.75
------ ------ ------
# 가비지 컬렉터: 변수에 저장하지 않은 경우
class Test:
def __init__(self, name):
self.name = name
print("{} - 생성되었습니다".format(self.name))
def __del__(self):
print("{} - 파괴되었습니다.".format(self.name))
Test("A")
Test("B")
Test("C")
# 실행 결과
----------
A - 생성되었습니다
A - 파괴되었습니다.
B - 생성되었습니다
B - 파괴되었습니다.
C - 생성되었습니다
# 가비지 컬렉터 : 변수에 저장한 경우
class Test:
def __init__(self, name):
self.name = name
print("{} - 생성되었습니다".format(self.name))
def __del__(self):
print("{} - 파괴되었습니다.".format(self.name))
a = Test("A")
b = Test("B")
c = Test("C")
# 실행 결과
----------
A - 생성되었습니다
B - 생성되었습니다
C - 생성되었습니다
A - 파괴되었습니다.
B - 파괴되었습니다.
C - 파괴되었습니다.
# 모듈 가져옴
import math
# 클래스 선언
class Circle:
def __init__(self, radius):
self.__radius = radius
def get_circumference(self):
return 2 * math.pi * self.__radius
def get_area(self):
return math.pi * (self.__radius ** 2)
# 원의 둘레와 넓이 구하기
circle = Circle(10)
print("# 원의 둘레와 넓이를 구합니다.")
print("원의 둘레:", circle.get_circumference())
print("원의 넓이:", circle.get_area())
print()
# __radius에 접근
print("#__radius에 접근합니다.")
print(circle.__radius)
# 실행 결과
----------
# 원의 둘레와 넓이를 구합니다.
원의 둘레: 62.83185307179586
원의 넓이: 314.1592653589793
#__radius에 접근합니다.
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
Cell In[24], line 22
20 # __radius에 접근
21 print("#__radius에 접근합니다.")
---> 22 print(circle.__radius)
AttributeError: 'Circle' object has no attribute '__radius'
# 모듈 가져옴
import math
# 클래스 선언
class Circle:
def __init__(self, radius):
self.__radius = radius
def get_circumference(self):
return 2 * math.pi * self.__radius
def get_area(self):
return math.pi * (self.__radius ** 2)
# 게터와 세터 선언
def get_radius(self):
return self.__radius
def set_radius(self, value):
self.__radius = value
# 원의 둘레와 넓이 구하기
circle = Circle(10)
print("# 원의 둘레와 넓이를 구합니다.")
print("원의 둘레:", circle.get_circumference())
print("원의 넓이:", circle.get_area())
print()
# 간접적으로 __radius에 접근
print("#__radius에 접근합니다.")
print(circle.get_radius())
print()
# 원의 둘레와 넓이를 구하기
circle.set_radius(2)
print("#반지름을 변경하고 원의 둘레와 넓이를 구합니다.")
print("원의 둘레:", circle.get_circumference())
print("원의 넓이:", circle.get_area())
# 실행 결과
----------
# 원의 둘레와 넓이를 구합니다.
원의 둘레: 62.83185307179586
원의 넓이: 314.1592653589793
#__radius에 접근합니다.
10
#반지름을 변경하고 원의 둘레와 넓이를 구합니다.
원의 둘레: 12.566370614359172
원의 넓이: 12.566370614359172
def set_radius(self, value):
. . . . if value <= 0:
. . . . . . . . raise TypeError("길이는 양의 숫자여야 합니다.")
. . . . self.__radius = value
# 모듈 읽어 들임
from flask import Flask
from urllib import request
from bs4 import BeautifulSoup
# 웹 서버 생성
app = Flask(__name__)
@app.route("/")
def hello():
#urlopen() 함수로 기상청의 전국 날씨를 읽음
target = request.urlopen("http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108")
# BeautifulSoup를 사용해 웹 페이지 분석
soup = BeautifulSoup(target, "html.parser")
# location 태그 찾기
output = ""
for location in soup.select("location"):
# 내부의 city, wf, tmn, tmx 태그를 찾아 출력함
output += "<h3>{}</h3>".format(location.select_one("city").string)
output += "날씨: {}<br/>".format(location.select_one("wf").string)
output += "최저/최고 기온: {}/{}"\
.format(\
location.select_one("tmn").string, \
location.select_one("tmx").string\
)
output += "<hr/>"
return output
name과 score 속성만 갖게 구성
class Student:
def __init__(self, name, score):
self.name = name
self.score = score
아래의 결과값이 나오도록 코드 구현하기
실행 결과
학급의 평균 점수는 80.0입니다.
가장 성적이 높은 학생은 구름입니다.
가장 성적이 낮은 학생은 별입니다.
class Student:
def __init__(self, name, score):
self.name = name
self.score = score
class StudentList:
def __init__(self):
# 구성 사용
self.students = []
def append(self, student):
self.students.append(student)
def get_average(self):
return sum([
student.score
for student in self.students
]) / len(self.students)
def get_first_by_score(self):
return max(self.students, key=lambda x: x.score)
def get_last_by_score(self):
return min(self.students, key=lambda x:x.score)
students = StudentList()
students.append(Student("구름", 100))
students.append(Student("별", 49))
students.append(Student("초코", 81))
students.append(Student("아지", 90))
print(f"학급의 평균 점수는 {students.get_average()}입니다.")
print(f"가장 성적이 높은 학생은 {students.get_first_by_score().name}입니다.")
print(f"가장 성적이 낮은 학생은 {students.get_last_by_score().name}입니다.")
class Stack:
def __init__(self):
self.list = []
def push(self, item):
self.list.append(item)
def pop (self):
return self.list.pop()
stack = Stack()
stack.push(10)
stack.push(20)
stack.push(30)
print(stack.pop())
print(stack.pop())
print(stack.pop())
# 실행 결과
----------
30
20
10
class Stack:
def __init__(self):
self.list = []
def push(self, item):
self.list.append(item)
def pop (self):
return self.list.pop(0)
stack = Stack()
stack.push(10)
stack.push(20)
stack.push(30)
print(stack.pop())
print(stack.pop())
print(stack.pop())
# 실행 결과
----------
10
20
30