0908 - Python

오늘·2022년 9월 13일
0

A

목록 보기
11/46

복습문제

1. Sport 라는 클래스 안에 이름과 플레이어수를 생성자로 추가하시오
[답변]
class Sport :
  def __init__(self, name, players) :
    self.name = name
    self.players = players



2. explain() 메소드를 만들고, print()를 한다.
내용은 '축구는 한 팀당 11명이 하는 스포츠입니다'
[답변]
class Sport :
    def __init__(self, name, players) :
        self.name = name
        self.players = players
    def explain(self) :
        print('축구는 한 팀당 11명이 하는 스포츠입니다')
        # 입력값으로 축구, 11명을 받아서 출력해도 된다.
        # print(f"{self.name}은 {self.players}명이 하는 스포츠입니다")

soccer = Sport("홍길동", "11")
soccer.explain()



3. Plant() 클래스를 만들건데
1) 생성자에서 name을 받아들인다
2) color 메소드는 인자 없이 'green'인 색을 변수로 설정
[답변]
class Plant :
    def __init__(self, name) :
        self.name = name
    def color(self) :
        self.color = 'green'
        return self.color



4. 클래스 Plant를 상속하는 Apple클래스를 만들고,
color메서드를 오버라이딩해 color = 'Red'로 바꾸세요
[답변]
class Apple(Plant) :
    def color(self) :
        self.color = 'Red'
        return self.color



5. 다음과 같이 "new.txt" 파일 안에 "Hello"10줄 입력하고
그것을 읽은 후 출력하세요
[답변]
f = open("new.txt", "w")
for i in range(10):
    f.write("Hello\n")
f.close()
f = open("new.txt", "r")
print(f.read())



6. 파일을 읽을 수 있게 해주는 함수 3가지는?
[답변]
read(), readlines(), readline()



7. 파일을 만들고자 하는데 f.close를 쓰지 않고 만들어주세요
[답변]
with open("new.txt", "w") as f: 



8. 상속을 해야하는 이유가 있다면?
[답변]
-부모 클래스의 것을 그대로 가져와 사용할 수 있다는 편리성
-중복된 내용을 또다시 작성하지 않아도 된다는 장점
-부모 클래스의 기능을 변경하지 않고도 기능을 추가, 재정의할 수 있는 편리성
-기존 클래스가 라이브러리 형태로 제공되거나 수정이 허용되지 않는
상황이라면


9. 메소드 오버라이딩 = 재정의


10. 다음과 같은 구구단 결과를 보여주는 txt 파일을 만드려면?
[내용]

[답변]
f = open("gugu.txt", "w")
for i in range(2,10):
    for j in range(1, 10) :
        f.write(f"{i*j} ")
    f.write("\n")
f.close()

f = open("gugu.txt", "r")
print(f.read())

클래스 변수

클래스 안에 변수를 선언하여 생성하는 것

class Family :
  lastname="박"
  def __init__(self, name) :
    self.name = name

family = Family("철수")
family.lastname

>

오류없이 접근이 가능하다. 함수가 아니기때문에 ()표기는 하지 않는다.

[특징]
클래스 변수는 클래스로 만든 모든 객체에 공유된다는 특징이 있다.

# class Family에 직접 접근하여 lastname을 "김" 으로 변경하였다.
Family.lastname = "김"
# 이후 Family 클래스를 상속받는 객체들의 lastname도 변경된것을 확인할 수 있다.
family.lastname
> 김
a.lastname
>

내부 함수에서 self로 접근할 수도 있다.
아래에서 지역변수, 전역변수, 인스턴스변수, 클래스 변수의 모습을 한번 확인해보자

# 글로벌(전역) 변수
name = "장길산"

class Family :
  # 클래스 변수
  lastname = "박"
  def __init__(self, name) :
    # 인스턴스(지역) 변수
    self.name = name
  def show_name(self) :
    # 클래스 변수에 접근
    print(self.lastname)
    print(Family.lastname)
    # 인스턴스 변수에 접근
    print(self.name)
    # 전역변수에 접근
    print(name)
a = Family("철수")
a.show_name()

>
박
박
철수
장길산

상속 후 변수 추가(+super().init())

class Person :
  def __init__(self) :
    self.name = "Lee"
    self.age = 25

# 기본 상속 모양
class Korean(Person) :
  pass

# 상속 후 추가
class Korean1(Person) :
  def __init__(self) :
    self.lang = "한국어"

p1 = Person()
p1.name

k1 = Korean1()
# 오류 없음
k1.lang
# 오류
k1.name

이때 Korean1은 Person클래스를 부모잡아 상속해왔는데 왜 Person클래스에 있는 name변수를 사용하지 못할까?
→ 초기화가 되어버렸기 때문이다. 자식 클래스인 Korean1에 __init__ 이 재정의 되면서 부모클래스인 Person()의 변수를 가져오지 못했기 때문

이를 해결하기 위해서는 부모의 __init__을 가져오겠다 선언해주면 된다.

# 상속 후 추가
class Korean1(Person) :
  def __init__(self) :
    # 부모의 __init__()을 가져오겠다
    super().__init__()
    
    self.lang = "한국어"

예시

# American 클래스를 상속받아서 만들고 쓰는 언어는 English로
class American(Person) :
  def __init__(self) :
    super().__init__()
    self.lang = "English"

a = American()
a.lang
> English

오류없이 잘 출력된다.

부모 클래스에서 인자로 입력받는 것이 있을 때

이때는 상속받는 자식 클래스에서도 초기화시 인자값을 적어주어야한다.
그래야 오류없이 진행할 수 있다.


class Person :
  def __init__(self, name, age) :
    self.name = name
    self.age = age

class Korean(Person) :
  # 부모클래스에서 받아들이는 인수를 자식단에서도 적어줘야 오류x
  # def __init__(self) ---- x
  def __init__(self, name, age) :
    super().__init__(name, age)
    self.lang = "한국어"

k1 = Korean("길동", 22)
k1.name

모듈

함수나 변수 또는 클래스를 모아놓은 파일, 파이썬 파일이라고 할 수도 있다.


예외처리

a = ["Hello", "Good"]
for i in range(3) :
	print(a[i])

위를 실행시킬 경우 list index out of range라는 오류가 뜨게 된다. 만약 오랜 시간이 걸려 실행되는 프로그램에서 갑자기 오류가 나 이전 실행 내용이 모두 사라지게 되면 참... 난감하지 않은가. 따라서 이를 예외처리할 코드가 필요하다

a = ["Hello", "Good"]
try :
  for i in range(3) :
    print(a[i])
except :
  print("에러")

try-except 구문이다. 만약 try 에서 오류가 생기게 되면 오류를 띄우면서 뱉어내는 것 대신 except 부분으로 넘어가 해당 부분에 작성한 코드가 실행되는 것이다.

예시 1)
try :
  print(4/2)
  print(4/0)
except :
  print("올바르지 않은 식입니다.")


예시 2)
# 에러난 이유를 출력해주는 except 옵션
try :
  print(4/2)
  print(4/0)
except ZeroDivisionError as e :
  print(e)


예시 3)
# 여러 except를 한번에 넣기도 가능하다
try :
  print(4/2)
  print(4/0)

  a = ["Hello", "Good"]
  for i in range(3) :
    print(a[i])
    
# 숫자를 0으로 나눠서 에러가 발생했을 시
except ZeroDivisionError as e :
  print(e)
# 범위를 벗어난 인덱스에 접근하여 에러가 발생했을 시
except IndexError as e :
  print(e)
# 만약 그 이외의 이유로 에러가 발생했을 시
except :
  print("작성내용을 확인해주세요")
  • finally
    오류가 있건 없건 마지막에 꼭 실행시킬 것이 있다면 해주는 부분
try :
  print(4/2)
finally :
  print("수고하셨습니다.")

내장함수 몇 가지

abs : 어떤 숫자를 입력받았을 때, 그 숫자의 절댓값을 돌려주는 함수
all : 반복 가능한 자료형 x를 입력수로 받으며 x가 모두 참이면 True, 하나라도 맞지 않으면 False를 돌려준다
any : 하나라도 참이 있으면 True, 모두 거짓을때만 False를 돌려준다.
chr : 아스키 코드 값을 입력받아 그 코드에 해당하는 문자를 출력하는 함수
ord : 문자열을 아스키 코드로 반환해주는 함수
dir : 객체가 자체적으로 가지고 있는 변수나 함수를 보여준다.
divmod : 두개의 숫자를 입력으로 받고 몫과 나머지를 튜플 형태로 돌려주는 함수이다

divmod(7, 3)
# 7 나누기 3 = 몫 2 나머지 1
> 2, 1

enumerate : 열거하다라는 뜻으로 순서가 있는 자료형(리스트, 튜플, 문자열)을 받아 인덱스 값을 포함하는 객체를 돌려준다.

test = ["a", "b", "c"]
for i, j in enumerate(a) :
  print(i, j)
>
0 a
1 b
2 c

예제 1)
# aa와 같은 모양으로 bb를 이용하여 새로운 딕셔너리 cc를 만드세요
aa = {"a" : 0, "b" : 1, "c" : 2}
bb = ["a", "b", "c"]
cc = {}
for i, j in enumerate(bb) :
  cc[j] = i

filter : 여러개의 데이터로 부어 일부의 데이터만 추려낼 때 사용한다. 그래서 주로 list나 tuple을 대상으로 하는 함수

[기본 문법]
filter(조건 함수, 순회 가능한 데이터)
즉
두번째 인자로 넘어온 데이터 중
첫번째 조건함수를 만족한 데이터만을 반환하는 것

예시 1)
# 양수만 취하는 함수 작성
def positive(x) :
	return x > 0

# 양수와 음수가 섞여있는 리스트 작성
list_a = [1, -3, 2, 0, -5, 6, 9]

# 필터를 통해 positive 함수의 true 값만 뽑아내기
result = list(filter(positive, list_a))
print(result)


예시 1-1)
# 람다함수로 더 줄일수도 있다
# lambda 입력값 : 조건
list(filter(lambda list_a : list_a > 0, list_a))

+) numpy : numpy로 접근해 array 자료형으로 넣어주면 직접 비교가 가능해진다.

import numpy as np
a = np.array(list_a)
print(a>0)
> [ True False  True False False  True  True]

hex : 정수값을 입력받아 16진수로 변환하여 돌려주는 함수
oct : 정수형태의 숫자를 0진수 문자열로 돌려주는 함수
id : 객체를 입력받아 고유 주소값(레퍼런스)를 돌려주는 함수
input : 사용자의 입력을 받는 함수


백준

# 1978 : 소수찾기

# 수의 갯수 N
n = int(input())
# 소수인지 검사할 N개의 수
num = map(int, input().split())

result = 0

# 저장된 수를 하나씩 꺼내오기
for i in num :
  # for문 돌때마다 초기화 시켜야 하니까
  no = 0
  # 1은 소수에서 제외되니까
  if i > 1 :
    # 2부터 저장된 수까지 돌리기
    for j in range(2, i) :
      # 만약 나누어지는 숫자가 있으면 소수가 아니니까
      if i % j == 0:
        # 변수에 저장
        no += 1

    # 만약에 해당 숫자를 나눠봤는데 나누어지는 수가 없다면
    if no == 0 :
      # 그 수는 소수니까 카운팅해주기
      result += 1
print(result)

+

조건문을 이런식으로 해도 될거 같다

# 저장된 수를 하나씩 꺼내오기
for i in num :
  # 1은 소수에서 제외되니까
  if i > 1 :
    # 2부터 저장된 수까지 돌리기
    for j in range(2, i) :
      # 만약 나누어지는 숫자가 있으면 소수가 아니니까
      # 그 수 탐색 정지
      if i % j == 0:
        break
    result += 1





# 2581 : 소수

# 자연수 M, N
M = int(input())
N = int(input())

result = []

# M과 N사이의 소수 찾기
# 처음에는 for i in range(M, N) 으로 해주었는데 틀렸습니다
# 왜일까 임의로 여러 수를 넣어보며 수정
for i in range(M, N+1) :
  no = 0
  if i > 1 :
    for j in range(2, i) :
      if i % j == 0:
        no += 1
        break
    if no == 0 :
      result.append(i)

if len(result) > 0 :
  print(sum(result))
  print(min(result))
else :
  print("-1")





# 11653 : 소인수 분해

# 입력 정수 N
N = int(input())

# 함수 작동 x
# 소인수분해하는 함수 작성
# def fac(x) :
#   num = 2
#   while x >= num :
#     if x % num == 0 :
#       print(num)
#       x = x / num
#     else : 
#       num = 2 + 1

# 풀어서 작성 -> 왜 이것도 시간 초과가 뜨지?
# num = 2
# while n >= num :
#   if n % num == 0 :
#     print(num)
#     n = n/num
#   else :
#     num = 3

# 제출
num = 2
while N != 1:
  if N % num==0: 
    print(num) 
    N = N//num
  else:
    num += 1
    
    
    
    
    
# 1929 : 소수 구하기
M, N = map(int, input().split())

def sosu(x) :
  # 1은 소수가 아니니까 제외
  if x == 1:
    return False
  else :
    # 2부터 i의 제곱근까지만 검사하는 것으로
    for i in range(2, int(x**0.5)+1) :
      # 만약 나누어 떨어진다면 소수가 아니니 제외
      if x % i == 0 :
        return False
    return True

for i in range(M, N+1) :
  if sosu(i) :
    print(i)





# 4948 : 베르트랑 공준

# 함수 작성
def sosu_num(x) :
  for i in range(2, int(x**0.5)+1):
    if x <= 1 or x % i == 0 :
      return False
  return True

# 입력되는 자연수 n
while True :
  n = int(input())
  cnt = 0
  if n == 0 :
    break

  for i in range(n, 2*n+1) :
    if sosu_num(i) :
      cnt += 1

  print(cnt)
################### 시간초과
# 검색해보니 제한 범위때문인것 같아 그 쪽으로 수정

# 함수 작성
def sosu_num(x) :
  for i in range(2, int(x**0.5)+1):
    if x <= 1 or x % i == 0 :
      return False
  return True

# 저장할 리스트
result = []

# 범위를 제한해 그 안에서만 돌려준다
for i in range(2, 246912) :
  if sosu_num(i):
    result.append(i)

# 입력되는 자연수 n
while True :
  n = int(input())
  cnt = 0
  if n == 0 :
    break

  for i in result :
    if n < i <= 2*n :
      cnt += 1

  print(cnt)

0개의 댓글