0907 - Python

오늘·2022년 9월 7일
0

A

목록 보기
10/46

복습문제

1. lambda 명령어는 return이 없어도 결과값을 돌려준다
[답변] o


2. lambda는 어떠한 함수인가?
[답변] 익명


3. 입력된 값을 a+b하는 add 함수를 작성하세요
[답변]
def add(a,b) :
	return a+b


4. 1부터 100까지의 숫자합을 while문으로 구하세요
[답변]
i = 1
sum = 0
while i < 101 : 
  sum += i
  i += 1
print(sum)


5. 1부터 45까지 중에서 6개 숫자를 임의로 고르고 오름차순으로 정리하시오
[답변]
import random
num = []
for i in range(6) :
  a = random.randint(1, 45)
  num.append(a)
sorted(num)


6. 리턴값이 딕셔너리로 나오는 함수를 만드시오
[답변]
def diction(**args) :
  dic = {**args}
  return dic
diction(a = 1, b = 3, c = "Hello")


7. 이스케이프 문자를 한가지 이상
[답변] \n	\t	\'	\"	\\


8. 함수를 만드는 과정 중 printreturn의 차이점은?
[답변]
return 값은 연산이 가능하지만
print는 출력이기 때문에 결과물을 보여주기만 하고 연산 불가능


9. while문으로 1부터 30까지 출력하는데, 3의 배수는 "짝" 으로 출력
[답변]
i = 0
while i < 30 :
  i+= 1
  if i % 3 == 0:
    print("짝")
    continue
  print(i)
  
  
10. 3개의 숫자를 입력받고 최댓값과 최소값의 차이를 구해주는 함수를 만들어주세요
[답변]
def max_min(a,b,c) :
  max_min = [a,b,c]
  return int(max(max_min)) - int(min(max_min))


11. 아래 코드를 한줄로 변경해보세요
[코드]
a = [1, 2, 3, 4]
b = []

for i in a : 
  if i%2 == 0 :
    b.append(i*3)
[답변]
b = [i*3 for i in a if i % 2 == 0]
b


12. 입력한 두 수 사이에 있는 값들의 합을 구해주는 함수 만들기
[코드]
1)
def add(a, b) :
  sum = 0
  li = [a, b]
  for i in range(min(li), max(li)+1):
    sum += i
  return sum

2)
def add(a, b) :
  sum = 0
  if a > b :
    a, b = b, a
  for i in range(a, b+1) :
    sum += i
  return sum

수업

파일 입출력(쓰기)

파일을 생성하기 위해 내장함수 open을 사용해볼 것이다.
파일 객체 = open(파일이름, 파일 열기 모드)
파일 열기 모드에는 다음과 같은 것이 있다

r : 읽기모드
w : 쓰기모드
a : 추가모드

만약 이미 있는 파일을 쓰기모드로 열 경우, 이미 존재하던 내용이 모두 사라지기 때문에 주의해야 한다.

f = open("new.txt", 'w')
f.write("Hello")
f.close()

f = open("new.text", 'a')
for _ in range(10) :
  f.write("Hello \n")
f.close()

+) with open as f

사용법은 크게 다르지 않다. 단, f.close가 없다

with open("new.txt", "w") as f :
  f.write("good \n")

with open("new.txt", "a") as f :
  f.write("\n")
  for _ in range(10) :
    f.write("good \n")

파일 입출력(읽기)

  1. readLines 함수 사용하기
f = open("new.text", 'r')
data = f.readlines()
print(data)
f.close()

위와 같이 사용하면 아래와 같은 결과물이 나오는 것을 알 수 있다

그렇다면 for문을 사용해 한 줄씩 뽑아내면 되지 않겠는가

f = open("new.text", 'r')
# 담을 변수 = 파일 객체.readlines()
data = f.readlines()
for i in data :
  print(i, end="")
f.close()
  1. read 함수 사용하기
f = open("new.text", 'r')
data = f.read()
print(data)
f.close()

-> 당연히 with open() as f 가능하다

with open("new.text", 'r') as f :
  data = f.readlines()
  for i in data :
    print(i, end="")

연습

[문제 1]
0번째 입니다
...
10번째 입니다

[답변]
with open("new.text", 'w') as f :
  for i in range(10):
    f.write(f"{i+1}번째 입니다 \n")



[문제 2]
만들어진 파일을 읽어오세요

[답변]
with open("new.text", "r") as f :
  data = f.readlines()
  for i in data :
    print(i, end="")


[문제 3]
Life is good 문자열을 저장한 후 다시 그 파일을 읽어서 출력하는 코드를 작성하였다.
하지만 예상한 Life is good 문장을 출력하지 않는다. 수정해보자
[코드]
  f1 = open("test.txt", 'w')
  f1.write("Life is good")
  f2 = open("test.txt", "r")
	print(f2.read())
[답변]
  f1 = open("test.txt", 'w')
  f1.write("Life is good")
  f1.close()
  f2 = open("test.txt", "r")
  print(f2.read())
  f2.close()
  
  쓰기모드가 켜진채 꺼지지 않았기 때문에 제대로 출력이 되지 않았던 것 같다.


[문제 4]
show_file()이라는 함수를 만들어서 파일이 출력되도록 만들어보자
[답변]
  def show_file(a) :
    f1 = open(a, "r")
    print(f1.read())

  show_file("test.txt")


[문제 5]
이름과 나이를 입력받아 people.txt 만들기
단, while문을 사용해 빈칸을 입력하면 종료되도록
[답변]
  f = open("people.txt", "w")
  while True :
    name = input('name : ')
    if name == "":
      break
    else :
      age = input('age : ')
      f.write(f"name : {name} / age : {age} \n")
  f.close()

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


[문제 6]
다음과 같은 내용을 지닌 파일이 있다.
이 내용중 "java""python"으로 바꾸어 저장해라
[문자열]
	Life is good
    i need java
[코드]
  f = open("test.txt", "r")
  body = f.read()
  f.close()

  body = body.replace("java", "python")

  f = open("test.txt", "w")
  f.write(body)
  f.close()
 
 
[문제 7]
홍길동 씨의 평균점수를 구해보세요
[코드]
  kor = 80
  eng = 75
  mat = 55

  print((kor + eng + mat)/3)


[문제 8]
홍길동씨의 주민등록번호는 881120-1068234이다.
연월일과 숫자부분으로 나누어 출력하시오
[코드]= "881120-1068234"
  yyyymmdd, num =.split("-")
  print(yyyymmdd)
  print(num)


[문제 9]
a = ['Life', ' is', ' too', ' short']
위 리스트를 Life is too short 문자열로 만들어 출력하세요
[코드]
result = "".join(a)
result


[문제 10]
a = [1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 5]
위 리스트에서 중복 숫자를 제거해보자
[코드]
aSet = set(a)
b = list(aSet)
print(b)


[문제 11]
while 문을 사용해 1부터 100까지의 자연수 중 4의 배수 합을 구해라
[코드]
  result = 0
  i = 1
  while i <= 100 :
    if i % 3 == 0 :
       result += i
    i += 1

Set

집합 자료형 set()에 리스트나 문자열을 입력하여 만들 수도 있다
[특징]
-중복을 허용하지 않는다
-순서가 없다 → 인덱싱으로 값을 얻을 수 없다
∴ set자료형에 저장된 값을 인덱싱으로 접근하려면 리스트나 튜플로 변환 후 접근 해야한다.


리스트 내포(list comprehension)

리스트 안에 for문을 사용하면 조금 더 직관적으로 작성할 수 있다.

for num in a  :
  result.append(num*3)

위와 아래는 같은 계산을 한다

result = [num * 3 for num in a]

일반 문법은 다음과 같다.
[표현식 for 항목 in 반복 가능 객체 if 조건]
예를 들어

result = [num * 3 for num in range(10) if num%2 == 0 ]
result
> [0, 6, 12, 18, 24]
  • 연습문제
리스트 중에서 홀수에만 2를 곱하여 저장하는 다음 코드가 있다
  number = [1, 2, 3, 4, 5]
  result = []
  for n in number :
    if n%2 == 1 :
      result.append(n*2)
      
이를 리스트 내포를 사용해 표현해보자
  
  number = [1, 2, 3, 4, 5]
  result = [n * 2 for n in number if n%2 == 1]
  result

class

만들기

기본모양

class 클래스이름 :
	# 메서드의 첫번째 매개변수는 반드시 self 지정
	def 메서드(self) :
    	코드

예시

class Person :
  def greeting(self) :
    print("Hello")

위에서 클래스를 작성해줬다면 사용하기 위해 변수에 할당
a = Person()

할당하고 나면 클래스 안에있는 메서드를 호출할 수 있다
a.greeting()

이때 Person()이 할당된 변수 a를 인스턴스(instance)라고 한다. 클래스는 특정 개념(메소드)들을 담고 있을 뿐 사용하기 위해서는 이렇게 인스턴스를 생성해야 한다.

또한 메서드를 호출하려면 이 인스턴스를 통해 호출하면된다. 이렇게 인스턴스를 통해 호출하는 메서드를 인스턴스 메서드 라고 한다.

# 사칙연산 클래스 만들기
class FourCal() :
  def setdata(self, first, second) : 
    self.first = first
    self.second = second
  
  def add(self) :
    result = self.first + self.second
    return result
  
  def mul(self) :
    result = self.first * self.second
    return result
  
  def sub(self) :
    result = self.first - self.seccond
    return result
  
  def div(self) :
    result = self.first / self
    return result

a = FourCal()
a.setdata(1, 2)
a.add()

인스턴스와 객체의 차이점

보통 객체만 지칭할때는 object(객체)라고 부르지만 클래스와 연관지어서 말할때는 instance(인스턴스)라고 부르는것

속성

속성(attribute)을 만들 때는 __init__ 메서드 안에서 self.속성에 값을 할당

class 클래스이름:
    def __init__(self):
        self.속성 =

__init__ 메서드는 인스턴스에 클래스를 할당하는 것(ex) a = Person()) 처럼 클래스에 괄호를 붙여서 인스턴스를 만들때 호출되는 특별한 메서드

이 메서드는 파이썬이 자동으로 호출해주는 메서드라 special method 또는 magic method 라고 부르기도 한다.

self = 인스턴스 자기 자신

말그래도 자기 자신을 의미한다. __init__의 매개변수 self에 들어가는 값은 할당해줬던 클래스(ex. Person()) 이라고 할 수 있다. 클래스의 구성을 생각할때 정형화된 구문으로 기억해주면 괜찮은 것 같다.

인스턴스 생성시 값 받기

class Person() :
  def __init__(self, name, age, address) :
    self.hello = "반갑습니다"
    self.name = name
    self.age = age
    self.address = address
  def greeting(self) :
    print("{0} 저는 {1} 입니다".format(self.hello, self.name))

mimi = Person("mimi", "25", "서초구 반포동")
mimi.greeting()
print("이름 : ", mimi.name)
print("나이 : ", mimi.age)
print("주소 : ", mimi.address)
  • 위와 같이 Person의 괄호 안에 넣은 값은 __init__ 메서드에서 self 뒤에 있는 매개변수에 차례대로 들어간다.
  • 클래스 내에서 속성에 접근할때는 self.속성 형식이였다면, 클래스 바깥에서 속성에 접근할 때는 인스턴스.속석의 형식으로 접근하면 된다. 이렇게 인스턴스를 통해 접근하는 속성을 인스턴스 속성 이라 한다.

+) 클래스의 위치인수

*args를 사용하면 된다. 매개변수에서 값을 가져오려면 args[0] 처럼 사용

class Person:
    def __init__(self, *args):
        self.name = args[0]
        self.age = args[1]
        self.address = args[2]
 
maria = Person(*['마리아', 20, '서울시 서초구 반포동'])

키워드 인수와 딕셔너리 언패킹

**kwars를 사용한다. 매개변수에서 값을 가져오려면 kwargs['name'] 과 같이 사용

class Person:
    def __init__(self, **kwargs):    # 키워드 인수
        self.name = kwargs['name']
        self.age = kwargs['age']
        self.address = kwargs['address']
 
maria1 = Person(name='마리아', age=20, address='서울시 서초구 반포동')
maria2 = Person(**{'name': '마리아', 'age': 20, 'address': '서울시 서초구 반포동'})

비공개 메서드

변수 앞에 __ 를 붙여서 비공개 속성으로 만든다.
클래스 밖에서 값을 막 변경하거나 주무를 수 없도록 직접 접근을 막은것

class Person:
    def __init__(self, name, age, address, wallet):
        self.name = name
        self.age = age
        self.address = address
        # 비공개 메서드 wallet
        self.__wallet = wallet

# maria = Person() -- Error
maria = Person('마리아', 20, '서울시 서초구 반포동', 10000)
# maria.__wallet -= 10000    # Error

이를 사용하고 싶다면 클래스 내에서 저 값을 사용하는 함수를 생성해주면 된다.

class Person:
    def __init__(self, name, age, address, wallet):
        self.name = name
        self.age = age
        self.address = address
        # 비공개 메서드
        self.__wallet = wallet
 
    def pay(self, amount):
    	# 비공개 속성은 클래스 안 메서드에서만 접근가능
        self.__wallet -= amount 
        print('이제 {0}원 남았네요.'.format(self.__wallet))

-클래스 밖에서 접근할 수 있는 속성을 공개속성(public attribute)
-클래스 안에서만 접근할 수 있는 속성을 비공개속성(private attribute)

문제

연습문제 : 게임 캐릭터 클래스 만들기
class Knight() :
  def __init__(self, health, mana, armor) :
    self.health = health
    self.mana = mana
    self.armor = armor
  def slash(self) :
    print("베기")

x = Knight(health=542.4, mana=210.3, armor=38)
print(x.health, x.mana, x.armor)
x.slash()

메서드 오버라이딩(=재정의)

상속할 때 할 수 있는 재정의. 이름은 같지만 기능은 다르게 주고 싶을 때 상속 받은 자식 단계에서 메서드를 재정의 해주는 일.

0개의 댓글