
let num = 10;
if (num>10) {
console.log("큽니다.");
} else if (num<10) {
console.log("작습니다.");
} else {
console.log("같습니다.");
}
int i = 0;// PYTHON for i in range(0,10,1):
for (let i = 0; i < 10; i++){
console.log("반복문")
}
// PYTHON while True:
while (true) {
break;
}
list = ["정형", "광주", "골프"]
dict = {
"이름": "정형"
, "지역": "광주"
, "취미": "골프"
}
data = {
"제목": ["book1", "book2", ...] # list
, "발행연도": [2011, 1999, ...]
}
list[0], dict["이름"]에 모두 "정형"이라는 값이 담겨 있지만let name = ["정형", "최영화", "박병관"];
name.push("양하영");let data = name.pop();name.unshift("서현수");let data2 = name.shift();push, shift는 꼭 기억하기
name.includes("최영화");forEach: 배열 전용 for문array.forEach((item,index)=>{}) ← arrow function 사용
map: 원본 배열을 복제해서 새로운 배열을 만들 때 사용PYTHON으로 다시 생각해보기:
arr=[1,2,3]에서
for i in range(len(arr)):가 기존 for 문(for(let i=0; i<pizza.length; i++))이라면
→ 인덱스 활용
forEach는for i in arr과 같음
→ 값을 그대로 넣어서 활용
// JavaScript - 일반 함수 선언식
function add(a, b) {
return a + b;
};
add(1, 2); // 3
// JavaScript - 일반 함수 표현식
const add = function(a, b) {
return a + b;
};
add(1, 2); // 3
// JavaScript - 화살표 함수
const add = (a, b) => {
return a + b;
};
add(1, 2); // 3
배열 중요 POINT
배열: 같은 의미를 가진 데이터를 관리하는 공간✨
배열의 맨 마지막 인덱스에 값을 넣는 함수: push✨
배열의 맨 앞의 인덱스의 값을 빼는 함수: shift✨
forEach: 원본 데이터를 조작해서 반복하는 로직을 작성할 때 사용 → 반복문의 대체품✨
map: 원본 데이터를 활용해서 새로운 배열을 만들 때 사용✨
filter: 원본 데이터를 활용해서 새로운 배열을 만드는데, 조건을 추가해서 만들 때 사용✨
function myFunction() { ... }) 전체가 호이스팅 됩니다. 즉, 함수를 선언하기 전에도 함수를 호출할 수 있습니다.const myFunction = function() { ... })은 변수와 동일하게 처리되어 선언만 호이스팅 됩니다. console.log(x); // 결과: undefined (변수 호이스팅)
var x = 10;
console.log(y); // 결과: ReferenceError: Cannot access 'y' before initialization (let 호이스팅)
let y = 20;
myFunction(); // 결과: "Hello" (함수 호이스팅)
function myFunction() {
console.log("Hello");
}
anotherFunction(); // 결과: TypeError: anotherFunction is not a function (함수 표현식 호이스팅)
const anotherFunction = function() {
console.log("World");
}
자바스크립트의 "호이스팅(Hoisting)"은 함수나 변수의 선언부가 실행 시점보다 코드 상단으로 끌어올려지는 것처럼 동작하는 현상입니다. 즉, 코드가 실제로는 순서대로 작성되어 있어도 자바스크립트 엔진이 실행 전에 먼저 선언을 처리하기 때문에, 아래와 같은 코드가 동작합니다. 즉, 변수나 함수를 선언하기 전에 사용해도 에러가 발생하지 않고, undefined 값을 가지거나 초기화되지 않은 상태로 사용됩니다.
console.log(hi); // undefined var hi = 'hello';이 코드에서는 선언(var hi)이 코드의 맨 위로 끌어올려져(undefined로 초기화됨) 있어서 오류가 나지 않습니다. let, const는 이와 달리 "TDZ(Temporal Dead Zone)"에 걸리기 때문에, 선언 전에 참조하면 에러가 납니다.
반면, 파이썬은 이런 호이스팅 개념이 없습니다. 파이썬에서 아래와 같이 변수 선언 전에 사용하면 일반적으로 NameError가 발생합니다.print(a) # NameError a = 10파이썬에서는 변수나 함수를 선언하기 전에 사용하면 NameError가 발생합니다. 파이썬은 코드를 실행하기 전에 미리 선언된 변수나 함수를 "끌어올리는" 대신, 코드가 실행되는 순서대로 변수와 함수를 처리합니다.
- 혼동되기 쉬운 파이썬의 인터프리터 동작
- 파이썬에는 호이스팅과 유사한 현상이 일부 발생할 수 있지만, 이는 호이스팅이라기보다는 인터프리터의 동작 방식과 관련이 있습니다.
- 파이썬의 "호이스팅과 유사한 현상"은 실제로 호이스팅이 아니라, 파이썬 인터프리터가 전체 블록(함수, 클래스 등)을 한 번에 읽고 난 다음에 실행을 시작하는 동작 방식과 관련이 있습니다.
- 예를 들어, 파이썬 클래스 정의 안에서는 클래스 변수나 메서드가 클래스 정의가 끝나고 나서야 쓸 수 있습니다.
- 클래스 정의 내에서 클래스 변수를 사용할 때, 클래스 정의 전체가 로드된 후에야 변수에 접근할 수 있습니다. 그러나 이는 호이스팅과는 다릅니다
- 즉, 파이썬은 코드가 위→아래로 한 줄씩 실행된다는 점에서 명확하게 자바스크립트와 다릅니다. 따라서 파이썬에는 자바스크립트의 "호이스팅"과 같은 자동 선언 이동/초기화 현상은 없습니다.
- 파이썬에서 호이스팅처럼 보이는 부분은 실제로 "코드를 어떻게 읽고 실행하느냐"의 차이에서 오는 착각일 뿐이며, 호이스팅 그 자체는 일어나지 않습니다.
- 결론
- 자바스크립트: 선언만 미리 처리(호이스팅), 함수/var 변수는 선언 전 접근 가능, let/const는 TDZ로 보호됨.
- 파이썬: 한 줄씩 위→아래로 실행, 선언 전 변수 사용 불가(오류 발생), 호이스팅 현상 없음.
- 이 차이가, 두 언어의 "인터프리터 동작 방식"과 실행 환경 차이에서 비롯된다는 점을 기억해두면 좋습니다.
요소.text

Response[406]


Response[406] 해결하기h = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36"}req.get(url, headers=h)
soup.select("div.ellipsis rank01>span>a") 를 실행했더니 []가 출력돼요class="ellipsis rank01"는 클래스명이 두 개(ellipsis, rank01)라는 의미 soup.select("div.ellipsis rank01>span>a")) 띄어쓰기 뒤의 rank01을 자손 선택자로 인식함: 자손 선택자를 의미하는 기호가 space임 → 두 개의 클래스를 가진 div를 지칭하고 싶으면 div.ellipsis.rank01로 적어야 함!크롤링은 항상 데이터 개수를 확인해야 합니다!

크롤링은 계속 데이터를 확인해주는 과정을 거쳐 주어야 함
soup.select("div.ellipsis.rank02")로 데이터를 가져오면 가수명이 연속해서 2개 수집되는 문제
크롤링 작업은 데이터를 끝까지 확인해 보는 것이 중요합니다!
→ 웹 페이지의 구성을 알 수 없기 때문






<iframe src="주소">에 실제 데이터가 있는 주소(상대 주소)가 있음
# 라이브러리 불러오기
import requests as req
from bs4 import BeautifulSoup as bs
url = "https://finance.naver.com/marketindex/exchangeList.naver"
res = req.get(url)
soup = bs(res.text,"lxml")
# 데이터 확인
soup.select_one("body > div > table > tbody > tr:nth-child(1) > td:nth-child(1)").text.strip() # '미국 USD'
len(soup.select("body > div > table > tbody > tr")) # 58
len(soup.select("body > div > table > tbody > tr:nth-child(1) > td")) # 7
tr = len(soup.select("body > div > table > tbody > tr"))
td = len(soup.select("body > div > table > tbody > tr:nth-child(1) > td"))
# 방법 1
total = []
for i in range(tr):
temp = []
for j in range(td):
temp.append(soup.select_one(f"body > div > table > tbody > tr:nth-child({i+1}) > td:nth-child({j+1})").text.strip())
total.append(temp)
# 리스트 컴프리헨션 ver.
# total = [[soup.select_one(f"body > div > table > tbody > tr:nth-child({i+1}) > td:nth-child({j+1})").text.strip() for j in range(td)]for i in range(tr)]
import pandas as pd
columns = ["통화명", "매매기준율", "사실 때", "파실 때", "보내실 때", "받으실 때", "미화환산율"]
df = pd.DataFrame(total, columns=columns)
df.to_csv("환율.csv", encoding="utf-8-sig", index=False)
# 방법 2: list → dictionary → DataFrame
results = [[soup.select(f"td:nth-child({j+1})")[i].text.strip() for i in range(tr)] for j in range(td)]
currency, tsr, buying, selling, sending, receiving, usa_cr = results
data = {
"통화명":currency
, "매매기준율":tsr
, "사실 때":buying
, "파실 때":selling
, "보내실 때":sending
, "받으실 때":receiving
, "미화환산율":usa_cr
}
df = pd.DataFrame(data)
df.to_csv("환율.csv", encoding="utf-8-sig", index=False)
import requests as req
from bs4 import BeautifulSoup as bs
import pandas as pd
url = "https://finance.naver.com/marketindex/exchangeList.naver"
res = req.get(url)
soup = bs(res.text, "lxml")
# 행과 열 개수
tr = len(soup.select("body > div > table > tbody > tr"))
td = len(soup.select("body > div > table > tbody > tr:nth-child(1) > td"))
# 컬럼명 리스트 (딕셔너리의 키)
keys = ["통화명", "매매기준율", "사실 때", "파실 때", "보내실 때", "받으실 때", "미화환산율"]
# 딕셔너리로 바로 데이터 수집
data_dict = {
key: [soup.select(f"td:nth-child({i+1})")[j].text.strip() for j in range(tr)]
for i, key in enumerate(keys)
}
# DataFrame 생성 후 CSV 저장
df = pd.DataFrame(data_dict)
df.to_csv("환율.csv", encoding="utf-8-sig", index=False)
- 나만의 컨셉: "이 순서를 따라해주세요!"
- 내 컨셉을 설득시키는 근거: "경험 정리 이렇게 해주세요!"
- 경험 정리 시 유의 사항: "정리가 잘 됐으면 말할 땐 이렇게!"
내 컨셉 이렇게 따라해 주세요!
1. 직무 소개
2. 직무 필요 역량
- 문제 해결 능력
- 꼼꼼한 업무 태도
- 계획성 있는 업무 처리
- 동료와의 유연한 협업
- 업무 프로세스 개선 능력
- 성장하려는 자세
- 나만의 장점(내 컨셉) → 경험 정리로 연결
- 꼼꼼한 업무 태도
- 계획성 있는 업무 처리
- 장점에 대한 경험
- 비언어적 요소
자소서던 면접이던 기본적으로 직무를 알아야 함 → 직무를 완벽하게 이해했다면 필요한 역량을 도출할 수 있음 → 필요 역량들을 나열하고 그중 두 개 정도 뽑아서 최대한 구체적으로 어필하는 것이 좋음
직무를 설정하고, 그 직무에 필요한 역량을 설계하고, 그 안에서 내가 어필하고자 하는 장점을 정해서 작성하기 → 장점에 대한 나만의 경험을 '구체적으로' 적기
"왜?"를 계속 질문하기
너무 다 전달하려고 하지 말자!
→ 확실한 것만 말하고 핵심만 말하기