Cpython: 파이썬 설치 시 기본적으로 제공하는 인터프리터
레퍼런스
를 메모리 주소 값
을 이용하여 구현하고 있습니다.소스코드 → 컴파일링→ 기계어(바이트 코드) →프린팅/런타임
컴파일타임에 작동을하는 코드인지 런타임에 작동하는 코드인지 잘 생각하며 코드를 짜자
https://yomangstartup.tistory.com/105
Generator Functions and Generator Expressions are better than Iterators.
Generator Expressions
Iterators and generators can only be iterated over once.
Iterators allow lazy evaluation, only generating the next element of an iterable object when requested. This is useful for very large data sets.
def check_prime(number):
for divisor in range(2, int(number ** 0.5) + 1):
if number % divisor == 0:
return False
return True
#iterator
class Primes:
def __init__(self, max):
self.max = max
self.number = 1
def __iter__(self):
return self
def __next__(self):
self.number += 1
if self.number >= self.max:
raise StopIteration
elif check_prime(self.number):
return self.number
else:
return self.__next__()
primes = Primes(100000000000)
print(primes) #<__main__.Primes object at 0x1021834a8>235711...
#generator
def Primes(max):
number = 1
while number < max:
number += 1
if check_prime(number):
yield number
primes = Primes(100000000000)
print(primes) #<generator object Primes at 0x10214de08>235711...
#generator using Generator Expressions
primes = (i for i in range(2, 100000000000) if check_prime(i))
입력값 〉 "z", 1
기댓값 〉 "a"
실행 결과 〉 실행한 결괏값 "\u0001"이 기댓값 "a"과 다릅니다.
출력 〉 letter: z idx: 123
letter2: z idx2: 1
왜 유니코드가 나올까 니가 잘못했으니까...
문자열.replace()는 해당하는 문자가 있으면 다 바꿔버려서 반복문에 넣으면 이미 바뀌어서 저장된 결과값에도 영향을 미친다.
ex. 'ab'를 한칸씩 민다고 했을 때
1회차에 a->b로 바꿔서 bb로 바꾸고
2회차에 b->c로 바꾸면 cc가 된다
replace뒤에 하나만 바꾼다고 쓰면 맨 앞에있는 것만 바뀌어서 여기선 효과가 없었다.
def solution(s, n):
ans=[]
for letter in s:
if not letter.isalpha():
ans.append(letter)
else:
idx=ord(letter.upper())+n
if idx>90:
idx-=26
if letter.islower():
ans.append(chr(idx).lower())
else:
ans.append(chr(idx))
return ''.join(ans)
공백은 그대로 append하고
알파벳을 무조건 대문자로 바꿔서 고려해야하는 아스키코드 범위를 줄이고 원래 소문자였다면 소문자로 바꿔준 값을 append
def caesar(s, n):
s = list(s)
for i in range(len(s)):
if s[i].isupper():
s[i]=chr((ord(s[i])-ord('A')+ n)%26+ord('A'))
elif s[i].islower():
s[i]=chr((ord(s[i])-ord('a')+ n)%26+ord('a'))
return "".join(s)
💡 주어진 리스트 요소 값만 변경하는 작업을 할 경우 내가 그렇게 싫어하는 index out of range 에러가 날 일이 없으니까 새 리스트 만들어서 append하거나 문자열을 써서 문자열 연산을 하는 것보다는 리스트 요소로 접근해서 필요한 부분만 변경하는 게 가장 좋은 것 같다.
def caesar(plain, no):
result = ""
for k in plain:
if k.isalpha():
if k.islower():
result += chr((ord(k) - ord("a") + no) % 26 + ord("a"))
else:
result += chr((ord(k) - ord("A") + no) % 26 + ord("A"))
else:
result += k
return result
기준부터 몇 칸 밀렸는지 계산
⭐ 후 다시 +기준값==그래야 아스키코드 값으로 바꿀 값(65~90 범위)이 나옴 )def solution(s, n):
def inner(word):
c = (lambda a: a+26 if 97>a else a-26 if a>122 else a)(ord(word.lower()) + (n%26))
return chr(c).upper() if word.isupper() else chr(c)
return "".join([inner(w) if w.isalpha() else w for w in list(s)])
a+26 if 97>a else
이 부분은 지워버려도 된다. 애초에 인자로 들어가는 값이 소문자의 아스키코드 값을 구하는 거라서 97보다 작은 경우가 있을 수가 없고def solution(s, n):
s=list(s)
for i,letter in enumerate(s):
if letter.isalpha():
idx=(ord(letter.upper())-ord('A')+n)%26+ord('A')
if letter.islower():
s[i]=(chr(idx).lower())
else:
s[i]=(chr(idx))
return ''.join(s)
letter=
을 쓰면 letter값은 변경되지만 list에 반영이 안된다는 걸 잊지말자 ⭐⭐⭐→ 파이썬의 딕셔너리
key에 해당하는 데이터를 고정된 길이의 hash로 바꿔줌(해싱)
해시값을 고르게 생성할수록 좋은 해시함수
key-value가 1:1로 매핑되어 있기 때문에 삽입, 삭제, 검색의 과정에서 모두 평균적으로O(1)의 시간복잡도를 가지고 있다.
문제점
메모리 낭비
데이터가 저장되기 전에 미리 저장공간을 잡아놓기 때문
해시값 충돌
보통 실제 키의 갯수보다 테이블의 크기를 작게 잡아놓기 때문에 해시충돌이 발생하는 경우가 많다.
if 키 갯수 == 테이블의 크기 : direct address table 충돌이 발생하지 않는다.
해결방법