[Python]파이썬 자세히 공부하기 2️⃣

포동동·2023년 3월 2일
0

8. 모듈 "re"를 이용하여 이메일 id를 확인하는 표현식을 작성하라.


9. 아래 코드의 아웃풋 값은 무엇인가?

list = ['a', 'b', 'c', 'd', 'e']
print (list[10:])

답은 []이다. 만약, print(list[10])이라고 단순히 인덱싱을 하면 IndexError: list index out of range와 같은 에러를 반환하지만 슬라이싱을 하면 그렇지 않다. 이유는 무엇일까?

나는 아래와 같은 글에서 답을 찾았다.

Indexing is supposed to always return one single element. Slicing is supposed to return a subsequence of a variable number of elements. If you index a non-existent element, there’s nothing to return and Python must throw an error—everything else wouldn’t make any sense. But if you slice an out-of-bounds sequence, it makes perfect sense to return an empty sequence.

즉, 인덱싱은 언제나 최소 하나의 값을 리턴해야 한다. 이 때, 범위를 넘어가는 값을 리턴할 수 없으니 "", []와 같은 None의 의미를 가지는 값을 리턴할 수도 있지만, 그렇게 되면 그 변수 안에 진짜 빈 문자열이나 빈 리스트 값을 리턴할 때 문제가 생기니 indexerror를 일으키는 것이다. 참고

하지만, 슬라이싱은 범위를 넘어가는 값들은 전부 None을 의미하는 []로 반환할 수 있다. 이 문서에 따르면 아래와 같이 쓰여져 있는 걸 알 수 있다.

The slice of s from i to j with step k is defined as the sequence of items with index x = i + nk such that 0 <= n < (j-i)/k. In other words, the indices are i, i+k, i+2k, i+3*k and so on, stopping when j is reached (but never including j). When k is positive, i and j are reduced to len(s) if they are greater

즉, 인덱스가 i부터 j까지 k개씩 증가하는 s라고 하는 객체가 있다면, 이것의 인덱스는 x = i + n*k 이런식으로 부여가 되고 j(j를 포함하진 않지만) 에 달할 때 까지 부여된다. 그리고 k가 양수면 i랑 j가 len(s)보다 크다면 len(s)로 줄게된다. 슬라이싱을 할 때 범위값을 len(전체 객체)보다 길게 하면 알아서 자른다는 얘기다.

s = "Hello"
s[1:]
>>> 'ello'

s[4:]
>>> 'o'

10. 파이썬에 스위치나 케이스 문이 있는가? 그렇지 않다면 같은 이유는 무엇인가?

우선, switch는 파이썬에는 없는 조건문 형식이다. switch문은 if문과 비슷한 역할을 하는데 아래의 코드를 보면 이해가 빠를 것이다.

//C언어
switch(변수){
    case1 : 
        실행문; 
        break;
    case2 : 
        실행문; 
        break;  
    default :
        실행문;    
}
# python
if 변수 ==1 :
	실행문
elif 변수 ==2 :
	실행문
else :
	실행문

문법만 보면 if문과 비슷하다는 것을 알 수 있는데, 다만 switch문 안의 case문은 값을 > < 등과 같은 비교연산자가 사용불가능 하다. 오로지 ==만 비교 가능하다. 현재(2023)는 switch문이 있는 타 언어들에서 if문과의 큰 차이를 발견할 수 없지만 예전엔 조건이 많아질수록 if문 보다 살짝 빨라 자주 사용되었다고 한다.

이러한 switch문은 왜 파이썬에 구현되지 않았는가 하면, 얘기가 안 되었던 것은 아니고 그냥 굳이 만들 이유도 없고 인기도 없었기 때문이라고 한다(PEP3103).

다만 필요하다면 아래와 같이 딕셔너리나 클래스를 이용하여 구현할 수는 있다고 한다.

def switch(x) :
    print({0:"영", 1:"일", 2:"이"}.get(x, "default"))

switch(2)
>>> "이"

class Switch :
    def switch(self, arg) :
        self.case_name = "case_" + str(arg)
        self.case = getattr(self, self.case_name, lambda:"default")
        return self.case()
    def case_0(self) :
        print("영")
    def case_1(self) :
        print("일")
    def case_2(self) :
        print("이")
    def case_default(self) :
        print("default")

sw = Switch()
sw.switch(2)
>>> "이"

11. 파이썬이 숫자 시퀀스에서 반복하기 위해 사용하는 내장 함수는 무엇인가?

range()이다. range()는 루프를 반복하는 데 사용되는 숫자 목록을 생성한다. for문과 함께 사용되며 for i in range([start], stop[, step])과 같은 문법으로 사용된다. start나 step은 명시를 해도 되고 안 해도 되지만 한 개의 매개변수만 작성하면 stop으로 인식한다. range는 아래와 같은 주요 특징을 가진다.

  • 정수 인수만 사용할 수 있다.
  • 매개 변수는 양수 또는 음수일 수 있다.
  • 파이썬의 range() 함수는 0번째 인덱스에서 시작한다.

12. try-except 블록 내에서 가능한 옵션 문은 무엇인가?

try-except문에서는 두 개의 옵션 문을 사용할 수 있다.

else

  • except문이 실행되지 않았을 때 try문 다음으로 코드가 실행된다.

finally

  • 예외 발생 여부에 관계없이 일부 단계를 실행한다.

아래와 같이 정리할 수 있다. 참고

try:
	예외가 발생할 수도 있는 코드
except:
	예외가 발생했을때 실행할 코드
else :
	예외가 발생하지 않았을 때 실행할 코드
finally:
	예외 발생 여부와 상관없이 무조건 실행할 코드

예시)

while True:
    try :
        x = int(input("Please enter a number: "))
    except ValueError :
        print("Oops!  That was no valid number.  Try again...")
    else :
        y = x * 10
        print(f"Value {x} * 10 is", y)
        break
    finally :
        print("Try more")


13. 파이썬에서 문자열은 무엇인가?

파이썬의 문자열은 영숫자 문자의 시퀀스이다. 그것들은 불변의 객체이기 때문에 일단 값이 할당되면 수정을 허용하지 않는다. 파이썬은 문자열을 변경하기 위해 join(), replace(), split()와 같은 여러 메서드를 제공한다. 그러나 이것들 중 어느 것도 원래의 객체를 바꿀 순 없다. 이것은 id값을 확인하는 것으로 증명 가능하다. 참고

또한, 모듈로도 사용가능한데 재밌는 메서드들이 있으니 확인해보면 좋겠다.참고

import string

string.ascii_letters
>>> 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
string.ascii_lowercase
>>> 'abcdefghijklmnopqrstuvwxyz'
string.ascii_uppercase
>>> 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
string.digits
>>> '0123456789'
string.hexdigits
>>> '0123456789abcdefABCDEF'
string.octdigits
>>> '01234567'
string.punctuation
>>> !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~.
string.printable # ASCII 문자의 문자열. digits, ascii_letters, punctuation, whitespace 의 조합.
>>> 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ 




string.whitespace # 공백으로 간주하는 모든 ASCII 문자를 포함하는 문자열. 여기에는 스페이스, 탭, 줄 바꿈, 캐리지 리턴, 세로 탭 및 폼 피드 문자가 포함


14. 파이썬에서 슬라이싱이란 무엇인가?

슬라이싱은 문자열의 일부 또는 목록의 일부를 추출하는 문자열 작업이다. 파이썬에서 문자열은 인덱스 0에서 시작하고 n번째 문자는 인덱스 [n-1]에 저장된다. 파이썬은 음수의 도움을 받아 역방향 인덱싱을 수행할 수도 있다. 파이썬에서 슬라이스는 슬라이스 객체를 생성하는 생성자 함수이기도 하다. 결과는 범위[start, stop, step]로 언급된 일련의 인덱스이다.


15. 파이썬에서 %s은(는) 무엇인가?

파이썬은 임의의 값을 문자열로 포맷하는 것을 지원한다. 그것은 꽤 복잡한 표현을 포함할 수 있는데, 일반적으로 사용되는 방법 중 하나는 %s 형식 지정자가 있는 문자열에 값을 밀어 넣는 것이다. 파이썬의 포맷 작업은 C 함수 printf()와 유사한 구문을 갖는다.

%s 말고도 정수는 %d 실수는 %f를 사용할 수 있으며, format을 사용하기도 하지만, 최근에는 f-string이 자료형의 구애를 크게 받지 않기 때문에 애용되고 있다.


16. 문자열은 파이썬에서 변경 가능한가?

파이썬 문자열은 immutable한 객체이다.

예를 들어보자. 문자열 값을 갖는 "str" 변수가 있습니다. 컨테이너, 즉 문자열을 변환할 수는 없지만 변수의 값을 의미하는 컨테이너의 내용을 수정할 수는 있다. 이 사이트를 참고하면 이해가 빠르다.


17. 파이썬의 인덱스는 무엇입니까?

파이썬에서 str, list, tuple, dictionary, set, range과 같은 iterable한 자료형 중 str, list, tuple에서 0부터 시작하는 위치값이라고 생각하면 된다. 인덱스를 통해 해당 위치의 값을 불러오거나 접근할 수 있다.

기본적인 문법은 listName.index(element, start, end) 와 같다. listName에 str이나 tuple을 담은 변수명을 넣어주면 된다. 이 때, 반환값은 intValueError이다.

간단한 예시는 아래와 같다.

alpha = ['a', 'b', 'c', 'd', 'e']

indexOfD = alpha.index('d') # start와 end는 넣어도 되고 안 넣어도 된다.

print('The index of d:', indexOfD)
>>> 3

indexNotPresent = alpha.index('i')
print('The index of i:', indexNotPresent)
>>> vlaue error

profile
완료주의

0개의 댓글