0913 - Python

오늘·2022년 9월 13일
0

A

목록 보기
12/46

복습문제

1. 내장함수란 무엇인가 그 갯수는?
[답변]
파이썬 내장 함수는 외부 모듈과 달리 import가 필요하지 않기 때문에
아무런 설정 없이 바로 사용할 수 있는 함수
692. 아래 리스트에서 짝수만 추출하시오 (filter사용)
[리스트]
num = [1, 6, 99, 3, 28, 8, 9, 12, 56, 17, 284]
[답변]
num = [1,6,99,3,28,8,9,12,56,17,284]
def even(i):
    if i % 2 == 0:
        return i
        
print(list(filter(even, num)))



3. 클래스에 쓸 수 있는 세가지 변수는
[답변]
지역변수, 전역변수, 클래스 변수



4. if __name__=="__main__": 의 용도는?
[답변]
해당 인터프리터에서 직접 실행했을 경우에만 if 문 내부의 코드를 돌리라는 명령이다., 현재 모듈 내에서만 코드가 실행되고 import 당했을 시에는 실행하지 않으려 할때 사용



5. '4/0' 을 계산 실행시 에러가 난다.
이때 에러메시지인 "division by zero" 가 나오도록 하세요
[답변]
try :
  print(4/0)
except ZeroDivisionError as e :
  print(e)



6. 패스를 추가할 때 필요한 라이브러리와 추가하는 방법은?
[답변]
import sys
sys.path.append



7. 아래 클래스에서
나이가 5 이하는 'baby'
13 이하는 'kids'
14 이상이면서 female이면 women's
14 이상이면서 male이면 men's
값을 리턴하는 하는 def 를 생성하시오

[답변]
class Clothes :
    def __init__(self, color, fit) :
        self.color = color
        self.fit = fit
    def target(self, age, gender) :
        self.age = age
        self.gender = gender
        result = ""
        if age <= 5 :
            result = "baby"
        elif 5 < age <= 13 :
            result = "kids"
        elif 14 <= age :
            if gender == "female" :
                result = "women"
            elif gender == "male" :
                result == "men"
        return result

a = Clothes("red", "1")
a.target(13, "female")



8. 위 클래스를 상속받아 Clothes2를 만들고 부모 클래스의
생성자 함수를 그대로 사용하고 싶은 경우 어떻게 작성해야 하는가
또한 season 이라는 생성자를 추가하고 싶다면?
[답변]
class Clothes2(Clothes) :
    def __init__(self, season, color, fit) :
        super().__init__(color, fit)
        self.season = season



9. 아래 id에서 남자만 골라서 새로운 리스트를 만들어주세요
(, filterlambda를 사용하세요)
[리스트]
id= ['970212-1054321','010101-2054321','020202-1065432','220908-1044444']
[답변]
id_male = list(filter(lambda x : x[7] == '1', id))



10. 다음 Smartphone 클래스를 상속하여 인스턴스 변수 'model'을 추가한
Galaxy 클래스를 만드세요
[Smartphone Class]
class Smartphone :
    def __init__(self, brand, price) :
        self.brand = brand
        self.price = price
[답변]
class Galaxy(Smartphone) :
    def __init__(self, brand, price, model) :
        super.__init__(brand, price)
        self.model = model



11. 두 정수를 입력받아 그 사이에 있는 숫자의 리스트를 출력하세요.(a,b 포함), 문자를 입력할 경우 "문자입니다" 예외처리
[답변]
try :
    a, b = map(int, input().split())
    if a > b :
        a, b = b, a
    result = []
    for i in range(a, b+1) :
        result.append(i)
    print(result)
except :
    print("문자입니다")



12. num_list = [ 1, ,2, 3, 4] 일 때
map, lambda 를 이용하여 위에서 추출한 리스트에 *2 를 한 리스트를 만드시오.
[답변]
num_list = [ 1, 2, 3, 4]
num_list = list(map(lambda x: x*2, num_list))
num_list



13. 아래의 리스트에서 짝수만 추출하시오.
filter, lambda 사용
[리스트]
num = [1,6,99,3,28,8,9,12,56,17,284] 
[답변]
num = [1,6,99,3,28,8,9,12,56,17,284] 
list(filter(lambda x:x%2==0, num))



14. filter를 사용해 아래 data에서 여자를 구분해보세요
[data]
data = 
[{'name':'영자','gender':'여자'},
	{'name':'옥순','gender':'여자'},
    {'name':'광수','gender':'남자'},
    {'name':'순자','gender':'여자'}]
[답변]
list(filter(lambda x:x["gender"] == "여자", data))



15. 클래스 이름 : 주문(Order)
	생성자 인자 : 주문메뉴(menu), 손님이름(name)
count 를 0 에서부터 주문이 들어올 때마다(클래스가 생성될 때마다) 1 씩 늘리면서
손님(클래스)마다 count 를 부여해준다 주문을 받은 순서(count)3 의 배수인 분들에게
"이벤트 당첨!" 이라는 문구를 보여드리는 event 메소드를 만들어주세요
[답변]
class Order() :
    def __init__(self, menu, count, name) :
        self.menu = menu
        self.name = name
        self.count = count
        self.count += 1
    def event(self) :
        if self.count % 3 == 0 :
            print("이벤트 당첨!")
        else :
            print("아쉽습니다")

c1 = Order("coffee",3, "철수")
c2 = Order("beer",2, "영희")
c3 = Order("soju",5, "길동")



16. 아래와같은 리스트 a에서 "KOR" 문자열을 제거해주세요
pop 사용
[리스트]
a = ["C#" ,"C++" ,"C", "KOR","JAVA" ,"R" ,"Python"]
[답변]
a.pop(3)
[풀이답변]
for i,j in enumerate(a) :
    if a[i] == "KOR" :
        a.pop(i)

내장함수 몇가지

int : 안에 들어온 값을 정수형태로 돌려주는 함수
int(x, 진수단위) : radix 진수로 표현된 문자열 x를 10진수로 변환하여 돌려준다

예를 들어
2진수 숫자 1110진수 값을 보고 싶다면
>>> int('11', 2)
3

16진수로 표현된 1A10진수 값은
>>> int('1A', 16)
26

isinstance(object, class) : 첫번째 인수로 인스턴스 명, 두번째 인수로 클래스 이름을 받는다. 입력으로 받은 인스턴스가 그 클래스의 인스턴스인지 판단하여 True, False로 돌려준다

>>> class Person :
	pass
>>> a = Person()
# a가 Person클래스의 인스턴스인지 확인
>>> isinstance(a, Person)
True

>>> b = 3
>>> isinstance(b, Person)
False

map(f, iterable) : 함수(f)와 반복가능한(iterable) 자료형을 입력으로 받는다.
→입력받은 자료형의 각 요소를 함수가 수행한 결과를 묶어 돌려주는 함수 (원본 리스트는 변경하지 않고 새 리스트를 생성한다)

# 리스트의 모든 요소를 정수로 변환하는 코드
>>> a = [1.2, 2.5, 3.1, 4.6]
>>> for i in range(len(a)) :
		a[i] int(a[i])
>>> a
[1, 2, 3, 4]

# 반복하면서 요소를 변환하는 for 형식을 대신하여
# map을 사용하여 a 리스트를 int()에 넣어서 정수를 만들겠다
>>> a = list(map(int, a))
>>> a
>>> [1, 2, 3, 4]

# input().split() 과 map
# 가끔 input().split() 으로 여러 개의 값을 입력받고
# 정수, 실수로 변환할 때도 map을 사용했었다.
# 들어온 문자열 값을 int로 변환하겠다
>>> map(int, input().split())

pow(x, y) : 거듭제곱. x를 y제곱한 결과값을 돌려주는 함수
round : 숫자를 입력받아 반올림해주는 함수

>>> round(4.6)
4

# (응용)소수점 2자리까지만 반올림 하겠다
>>> round(3.141592, 2)
3.14

엑셀 파일 읽기

사전 처리(jupyter lab)

pip install folium
pip install openpyxl

import pandas as pd
import os
import folium
import openpyxl

파일 불러오기

pd.read_excel("서울지역대학교위치.xlsx")

>>> df = pd.read_excel("서울지역대학교위치.xlsx")
# 한개의 칼럼에만 접근
>>> df.대학교

0       KAIST 서울캠퍼스 
1              KC대학교
2       가톨릭대학교(성신교정)
3       가톨릭대학교(성의교정)
4           감리교신학대학교
5              건국대학교
6       경기대학교 서울캠퍼스 
7       경희대학교 서울캠퍼스 
8              고려대학교
9              광운대학교
10             국민대학교

zip 함수 사용 (+지도 시각화)

for i, j, k in zip(df.대학교, df.위도, df.경도) :
    print(i, j, k)

# lacation = 입력한 위, 경도 좌표를 기준으로 지도를 그릴수 있다
# zoom_start = 확대의 정도를 지정할 수 있다. 최대 18

seoul_map = folium.Map(location=[37.55, 126.98], zomm_start = 12)
seoul_map

# 만들어진 'seoul_map' 위에 마커 찍기
# location = 마커를 추가할 위 경도 좌표를 입력
# popup = 마우스 클릭시 표기되는 문구
# tooltip = 마우스 오버시 표기되는 문구

for name, lat, long in zip(df.대학교, df.위도, df.경도) :
    folium.Marker([lat, long], tooltip=name).add_to(seoul_map)
    
seoul_map


2차원 리스트

2차원 리스트는 리스트 안에 리스트를 넣는 형태로 만들 수 있다.
list = [값, 값], [값, 값], [값, 값]]

>>> a = [[10, 20], [30, 40], [50, 60]]
>>> a
[[10, 20], [30, 40], [50, 60]]

위는 가로2 세로3 의 2차원 리스트를 만든것이다.

요소에 접근하기

리스트 뒤에 대괄호([ ]) 두번으로 세로인덱스와 가로 인덱스를 지정해주면 된다

>>> a = [[10, 20], [30, 40], [50, 60]]
>>> a[0] [0]            # 세로 인덱스 0, 가로 인덱스 0인 요소 출력
10

만약 사람이 알아보기 쉽도록 2차원 리스트의 사각형 구조를 유지하도록 출력하려면 pprint를 사용하면된다

>>> from pprint import pprint
>>> # indent는 들여쓰기 칸 수, width는 가로 폭
>>> pprint(a, indent=4, width=20)
[   [10, 20],
    [30, 40],
    [50, 60]]

반복문으로 요소 출력하기

1) for 반복문 한번

# 리스트 a에서 요소 두 개를 꺼내자
>>> a = [[10, 20], [30, 40], [50, 60]]
>>> for x, y in a:
...     print(x, y)
...
10 20
30 40
50 60

2) for 반복문 두 번

>>> a = [[10, 20], [30, 40], [50, 60]]
>>> for i in a :
		for j in i :
        	print(j, end=' ')
        print()
>>>
10 20
30 40
50 60

3) for와 range

# 가로 세로 크기를 지정해 인덱스로 접근해보기
# 세로 크기
for i in range(len(a)) :
	# 가로 크기
    for j in range(len(a)) :
    	print(a[i][j], end=' ')
    print()

4) while 반복문 한번

i = 0
# 리스트의 세로 크기만큼 반복하겠다
while i < len(a) :
	# 요소 두개를 한번에 가져와 각각 담아주기
    x, y = a[i]
    print(x, y)
    i += 1

5) while 반복문 두 번

i = 0
# 세로 크기
while i < len(a) :
	# 안에 지정해줘야 돌때마다 초기화 되어 행에 있는 값들 모두 출력
    j = 0
    # 가로 크기
    while j < len(a[i]) :
    	print(a[i][j], end=' ')
        j += 1
    print()
    i += 1

2차원 리스트 만들기(리스트 표현식)

# for 문 한번 사용하기
>>> a = [[0] * 2 for i in range(3)]
>>> a
[[0, 0], [0, 0], [0, 0]]

# for 문 두번 사용하기
>>> a = [[0 for j in range(2)] for i in range(3)]
>>> a
[[0, 0], [0, 0], [0, 0]]

# 톱니형(일정하지 않은 모양) 만들기
>>> a = [[0] * i for i in [3, 1, 3, 2, 5]]
>>> a
[[0, 0, 0], [0], [0, 0, 0], [0, 0], [0, 0, 0, 0, 0]]

2차원 리스트 sorted하기

sorted(반복가능한객체, key=정렬함수, reverse=T or F)
아래는 학생 정보가 저장된 2차원 리스트를 정렬하는 예시이다

students = [
    ['john', 'C', 19],
    ['maria', 'A', 25],
    ['andrew', 'B', 7]
]

# 안쪽 리스트의 인덱스 1을 기준으로 정렬
print(sorted(students, key=lambda student: student[1]))

3차원 리스트

'''
높이 2, 세로크기 4, 가로크기 3인
3차원 리스트를 만드세요
'''

>>> a = [[[0 for col in range(3)] for row in range(4)] for depth in range(2)]
>>> a

[[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]],
 [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]]

3차원 리스트는 2차원 리스트가 여러겹 있는 모양이다. 따라서 한 면을 완성한 다음 다른 면을 완성하는 방식으로 작성해야 한다


문자열 조작

replace

replace("기존 문자열", "바꿀 문자열")
문자열 자체는 변경하지 않으며 결과만 보여주기 때문에, 바뀐 결과를 유지하고 싶다면 변수에 재할당 해주어야 한다.

>>> 'Hello, world!' = a
>>> a.replace('world', 'Python')
'Hello, Python!'
>>> a
'Hello, world!'
>>> a = a.replace('world', 'Python')
>>> a
'Hello, Python!'

translate

str.maketrans('기존 문자열', '새로운 문자')

# 주어진 문자열에서 a, e, i, o, u 가 있다면
# 1, 2, 3, 4, 5 로 치환하겠다는 말

>>> table = str.maketrans('aeiou', '12345')
>>> 'apple'.translate(table)
'1ppl2'

split()

split(구분자)
주어진 구분자를 기준으로 문자열을 분리, 리스트로 만든다.

>>> 'apple, pear, grape, pineapple, orange'.split(', ')
['apple', 'pear', 'grape', 'pineapple', 'orange']

join()

'구분자'.join(리스트)
구분자 문자열과 문자열리스트의 요소를 연결해준다.

# 공백으로 연결하겠다
>>> ' '.join(['apple', 'pear', 'grape', 'pineapple', 'orange'])
'apple pear grape pineapple orange'

# -로 연결하겠다
>>> '-'.join(['apple', 'pear', 'grape', 'pineapple', 'orange'])
'apple-pear-grape-pineapple-orange'

strip() - 특정 문자 삭제하기

strip, lstrip, rstrip()는 공백을 제거 할때 뿐 아니라 특정문자를 삭제할 때도 사용할 수 있는데 ('삭제할 문자들') 을 넣어주면된다

# 왼쪽의 특정 문자 삭제하기
>>> ', python.'.lstrip(',.')
' python.'

# 오른쪽의 특정 문자 삭제하기
>>> ', python.'.rstrip(',.')
', python'

# 양쪽의 특정 문자 삭제하기
>>> ', python.'.rstrip(',.')
', python'

+) 구두점 간단하게 모두 삭제하기

string 모듈의 punctuation에는 모든 구두점이 들어있다. strip 메소드에 string.punctuation을 넣으면 문자열 양쪽의 모든 구두점을 간단히 삭제할 수 있다.

>>> import string
>>> ', python.'.strip(string.punctuation)
' python'
>>> string.punctuation
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'

메서드 체이닝

문자열 메서드는 처리한 결과를 반환하도록 만들어져있다. 따라서 메서드를 계속 연결하며 호출하는 메서드 체이닝(method chaining)이 가능합니다.


zfill(길이)

지정된 길이에 맞춰서 문자열의 왼쪽에 0을 채운다.

>>> '35'.zfill(4)        # 숫자 앞에 0을 채움
'0035'
>>> 'hello'.zfill(10)    # 문자열 앞에 0을 채울 수도 있음
'00000hello'

find()

find('찾을문자열')
특정 문자열을 찾아 없다면 -1을 있다면 그 위치(인덱스)를 반환한다. 단, 하나만 찾는다

# find는 왼쪽부터 문자열을 찾는다.
# 같은 문자열이 여러개일 경우 처음 찾은 문자열의 인덱스를 반환
>>> 'apple pineapple'.find('pl')
2

# rfind()는 오른쪽부터 탐색하여 인덱스 반환
>>> 'apple pineapple'.rfind('pl')
12

index()

index('찾을 문자열')
마찬가지로 왼쪽에서부터 특정 문자열을 찾아 인덱스를 반환한다. 단, index()의 경우 찾는 문자열이 없으면 에러를 발생시킨다.

# 찾을 문자열이 여러개일 경우 처음 찾은 문자열의 인덱스만 반환시킨다
>>> 'apple pineapple'.index('pl')
2

# rindex('찾을문자열')은 오른쪽에서부터 특정 문자열을 찾아서 인덱스를 반환
>>> 'apple pineapple'.rindex('pl')
12

count()

count('문자열')
현재 문자열에서 특정 문자열이 몇번이나 나오는지 알아낸다.

>>> 'apple pineapple'.count('pl')
2

문제풀기

구구단 함수 만들기

입력된 수의 구구단 결과 값만 모여있는 리스트를 만들어주세요

1.
def GuGu(n) :
    result = []
    for i in range(1, 9+1) :
        result.append(n * i)
    return result


2.
def GuGu(n):
    result =[n*i for i in range(1,10)]
    return result


3.
def GuGu(n) :
    result = []
    i = 1
    while i < 10 :
        result.append(n*i)
        i += 1
    return result

3, 5의 배수 더하기

1부터 100 사이에 있는 3의 배수와 5의 배수들을 모두 합하는 프로그램을 만들어보자

1.
def hap() :
    i = 0
    result = 0
    while i < 100:
        i += 1
        if i%15 == 0 :
            result += i
        elif i%3 == 0 or i%5 == 0:
            result += i
    return result


2.
def hap() :
    result = 0
    for i in range(1, 100+1) :
        if i%15 == 0 :
            result += i
        elif i%3 == 0 or i%5 == 0 :
            result += i
    return result

3.
def hap():
  result = [i for i in range(1,100+1) if i % 3 == 0 or i % 5 == 0]
  return sum(result) 

게시물 페이지 수 출력

게시물의 총 건수와 한 페이지에 보여 줄 게시물 수를 입력으로 받아, 총 페이지 수를 출력하는 프로그램 작성

# 게시물의 총건수 m, 한페이지에 보여줄 게시물 수 n
def getTotalPage(m, n) :
    if m % n == 0 :
        return m // n
    else :
        return m // n + 1
getTotalPage(15, 10)

0개의 댓글