구일모
최민주
진짜 목표
프로그래밍을 통한 문제 해결, 컴퓨터적 사고방식, 프로그래밍의 재미
Codespace 에서 빌린 컴퓨터
여러분들 컴퓨터
<!DOCTYPE html>
<html>
, <head>
, <body>
태그 포함<h1>
~ <h6>
: 헤딩 태그<p>
: 문단 태그<a>
: 링크 태그<img>
: 이미지 태그<!DOCTYPE html>
<html>
<head>
<title>Sample HTML</title>
</head>
<body>
<h1>This is a Heading</h1>
<p>This is a paragraph.</p>
<a href="https://www.example.com">This is a link</a>
<img src="image.jpg" alt="Sample Image">
</body>
</html>
<ul>
, <ol>
, <li>
<table>
, <tr>
, <td>
, <th>
<ul>
<li>Item 1</li>
<li>Item 2</li>
</ul>
<ol>
<li>First</li>
<li>Second</li>
</ol>
<table>
<tr>
<th>Name</th>
<th>Age</th>
</tr>
<tr>
<td>John</td>
<td>30</td>
</tr>
</table>
color
, font-size
, margin
, padding
/* 태그 선택자 */
p {
color: blue;
}
/* 클래스 선택자 */
.container {
margin: 0 auto;
width: 80%;
}
/* ID 선택자 */
#header {
background-color: #f8f8f8;
padding: 10px;
}
// 변수 선언
let name = "John";
const age = 30;
// 함수 선언
function greet() {
console.log("Hello, " + name);
}
// 함수 호출
greet();
// 요소 선택
const button = document.getElementById('myButton');
// 이벤트 핸들러 추가
button.addEventListener('click', function() {
alert('Button clicked!');
});
// 요소 생성
const newElement = document.createElement('div');
newElement.textContent = "Hello, World!";
document.body.appendChild(newElement);
파이썬(Python)은 1990년 암스테르담의 귀도 반 로섬(Guido van rossum)이 개발한 인터프리터 언어이다. 귀도는 파이썬이라는 이름을 자신이 좋아하는 코미디 쇼인 ‘몬티 파이썬의 날아다니는 서커스(Monty python's flying circus)’에서 따왔다고 한다.
인터프리터 언어란 소스 코드를 한 줄씩 해석한 후 그때그때 실행해 결과를 바로 확인할 수 있는 언어를 말한다.
출처: 점프투파이썬 위키독스, 박응용
if 4 in [1,2,3,4]: print("4가 있습니다")
languages = ['python', 'perl', 'c', 'java']
for lang in languages:
if lang in ['python', 'perl']:
print("%6s need interpreter" % lang)
elif lang in ['c', 'java']:
print("%6s need compiler" % lang)
else:
print("should not reach here")
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
print('hello world')
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
# 정수형 변수 선언 및 출력
int_var = ?
# 부동 소수점형 변수 선언 및 출력
float_var = ?
# 문자열형 변수 선언 및 출력
str_var = ?
# 불리언형 변수 선언 및 출력
bool_var = ?
# 각 변수의 타입 출력
?
1. 변수를 선언하고 각 데이터 타입 (정수, 부동 소수점, 문자열, 불리언)의 값을 할당하세요.
2. 각 변수의 타입을 출력하세요.
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
# 사용자로부터 숫자 입력 받기
num = int(input("숫자를 입력하세요: "))
# if를 사용하여 사용자로부터 받은 숫자
# 입력값에 대해 양수, 음수, 0 판별
1. 사용자로부터 입력받은 숫자가 양수, 음수 또는 0인지 판별하는 프로그램을 작성하세요.
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
# 문자열 값을 가지는 튜플 선언
str_list = ["apple", "banana", "cherry"]
# 모든 요소를 반복문을 사용하여 출력
# 출력:
# apple
# banana
# cherry
1. 문자열 값을 가지는 list를 선언하고, 모든 요소를 반복문을 사용하여 출력하세요.
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
# 과제 1: 1부터 10까지의 숫자 출력 (while 문 사용)
i = 1
while...
# 과제 2: 사용자로부터 비밀번호를 입력받아 1234를
# 받을 때까지 출력
while True:
num = int(input("비밀번호를 입력하세요: "))
if...
else...
1. 1부터 10까지의 숫자를 while 문을 사용하여 출력하세요.
2. 사용자로부터 숫자를 입력받아, 그 숫자가 비번 1234가 될 때까지 계속해서 숫자를 출력하고, 숫자가 1234가 되면 “종료”를 출력하세요.
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
# 곱셈 함수 만들기
def multiple(a, b):
# 덧셈 결과값 짝수 판별기
def check_sum_even(a, b):
1. a, b를 입력받아 a x b 곱셈 결과값을 리턴하는 함수를 만드세요
2. a, b를 입력받아 더한 값이 짝수인지 판별하는 함수를 만드세요
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
# get dict values
x = thisdict.values()
# get dict keys
x = thisdict.keys()
# get dict (key, value)s
x = this dict.items()
car = {
"brand": "Ford",
"model": "Mustang",
"year": 1964
}
dictionary 의 몇 가지 유용한 method 함수들
# 주어진 문자열
text = "hello world hello python hello code"
# 각 단어의 빈도수를 계산하여 딕셔너리에 저장
word_count = {}
# 문자열을 공백으로 분리하여 단어 리스트를 생성
words = text.split()
# 각 단어의 빈도수 계산
for word in words:
if..
else..
# 결과 출력
print(word_count)
1. 주어진 text 문자열에서 각 단어가 얼마나 자주 등장하는지 python dict 를 활용하여 풀어보세요
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
출처: 점프투파이썬, 박응용
라이센스 CC BY-SA 4.0 DEED
식물도감 앱을 만들어 봅시다
data = [
{
"id": 1,
"plant_nm": "깻잎",
"family_kor_nm": "깻잎과",
"family_nm": "Brassica",
"genus_kor_nm": "깻잎속",
"genus_nm": "Brassica",
"img_url": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSr8Uh-buvRfMZZXw4LYjN5OZthg6mmEIFsWA&s",
"desc": "깻잎은 맛있다"
},
{
"id": 2,
"plant_nm": "코코아잎",
"family_kor_nm": "코코아잎과",
"family_nm": "Coccaceae",
"genus_kor_nm": "코코아속",
"genus_nm": "Coccus",
"img_url": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ2GJiBJWcs7UlQQDc5ceHK1li4x22AboerzA&s",
"desc": "코코아 하하"
}
]
fake_data = [
{
"id": 1,
"plant_nm": "깻잎",
"family_kor_nm": "깻잎과",
"family_nm": "Brassica",
"genus_kor_nm": "깻잎속",
"genus_nm": "Brassica",
"img_url": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSr8Uh-buvRfMZZXw4LYjN5OZthg6mmEIFsWA&s",
"desc": "깻잎은 맛있다"
}
]
import sqlite3
conn = sqlite3.connect('plants.db')
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE plants (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
img_url TEXT,
desc TEXT
)
''')
conn.commit()
conn.close()
pip install flask
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run(debug=True)
python app.py / flask run --debug
http://localhost:5000
접속하여 결과 확인
5000 은 개발환경을 위한 컴퓨터 포트 번호이며, 3000 등으로 변경 가능, 중복 불가
<!-- templates/base.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
<title>Plant Encyclopedia</title>
</head>
<body>
<div class="container">
{% block content %}{% endblock %}
</div>
</body>
</html>
<!-- templates/base.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link
rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
/>
<link rel="stylesheet" href="/static/main.css" />
<title>Plant Encyclopedia</title>
</head>
<header>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" href="/">홍길동의 식물도감</a>
<button
class="navbar-toggler"
type="button"
data-toggle="collapse"
data-target="#navbarNav"
aria-controls="navbarNav"
aria-expanded="false"
aria-label="Toggle navigation"
>
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav">
<li class="nav-item active">
<a class="nav-link" href="/"
>Home <span class="sr-only">(current)</span></a
>
</li>
<li class="nav-item">
<a class="nav-link" href="/about">About</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/contact">Contact</a>
</li>
</ul>
</div>
</nav>
</header>
<body>
<div class="container">{% block content %}{% endblock %}</div>
</body>
<footer class="bg-light text-center text-lg-start">
<div class="text-center p-3" style="background-color: rgba(0, 0, 0, 0.05)">
© 2024 산림과학고. All rights reserved.
</div>
</footer>
</html>
{% extends "base.html" %} {% block content %}
<div class="container">
<div class="row mb-3">
<div class="col-12 text-right">
<a
href="/add"
class="btn btn-success"
style="color: white; margin-top: 2em"
>Add New Plant</a
>
</div>
</div>
<div class="row">
{% for plant in plants %}
<div class="col-12">
<!-- This ensures each plant takes a full row -->
<div class="card mb-3">
<div class="row g-0">
<a href="/{{ plant.id }}" class="col-md-3 card-box data-plant-id="{{ plant.id }}">
<img
src="{{ plant.img_url }}"
class="img-fluid rounded-start card-img-top"
alt="{{ plant.family_kor_nm }}"
/>
</a>
<div class="col-md-9">
<div class="card-body">
<h5 class="card-title">과: {{ plant.family_kor_nm }}</h5>
<h5 class="card-title">속: {{ plant.genus_kor_nm }}</h5>
<p class="card-title">이름: {{ plant.plant_nm }}</p>
<button class="btn btn-primary" onclick="window.location.href='/edit/{{ plant.id }}'">Edit</button>
<button class="btn btn-danger" onclick="confirmDelete('{{ plant.id }}', '{{ plant.plant_nm }}')">Delete</button>
</div>
</div>
</div>
</div>
</div>
{% else %}
<div class="col-12">
<p>No plants found.</p>
</div>
{% endfor %}
</div>
</div>
<script>
function confirmDelete(id, name) {
if (confirm('Do you really want to delete ' + name + '?')) {
fetch('/delete/' + id, { method: 'POST' })
.then(response => {
if (response.ok) {
window.location.reload(); // Reload the page to reflect the changes
} else {
alert('Failed to delete the plant.');
}
})
.catch(error => {
console.error('Error:', error);
alert('Error deleting the plant.');
});
}
}
</script>
{% endblock %}
<!-- templates/add_plant.html -->
{% extends "base.html" %} {% block content %}
<h1>Add New Plant</h1>
<form method="POST">
<div class="form-group">
<label for="family_kor_nm">과 이름</label>
<input
type="text"
class="form-control"
id="family_kor_nm"
name="family_kor_nm"
/>
</div>
<div class="form-group">
<label for="genus_kor_nm">속 이름</label>
<input
type="text"
class="form-control"
id="genus_kor_nm"
name="genus_kor_nm"
/>
</div>
<div class="form-group">
<label for="plant_nm">이름</label>
<input
type="text"
class="form-control"
id="plant_nm"
name="plant_nm"
required
/>
</div>
<div class="form-group">
<label for="img_url">사진 저장 주소</label>
<input type="text" class="form-control" id="img_url" name="img_url" />
</div>
<div class="form-group">
<label for="desc">Description</label>
<textarea class="form-control" id="desc" name="desc" rows="3"></textarea>
</div>
<button type="submit" class="btn btn-primary">Add Plant</button>
</form>
{% endblock %}
<!-- templates/edit_plant.html -->
{% extends "base.html" %} {% block content %}
<h1>Edit Plant</h1>
<form method="POST">
<div class="form-group">
<label for="family_kor_nm">과 이름</label>
<input
type="text"
class="form-control"
id="family_kor_nm"
name="family_kor_nm"
placeholder="{{ plant.family_kor_nm }}"
/>
</div>
<div class="form-group">
<label for="genus_kor_nm">속 이름</label>
<input
type="text"
class="form-control"
id="genus_kor_nm"
name="genus_kor_nm"
placeholder="{{ plant.genus_kor_nm }}"
/>
</div>
<div class="form-group">
<label for="plant_nm">이름</label>
<input
type="text"
class="form-control"
id="plant_nm"
name="plant_nm"
placeholder="{{ plant.plant_nm }}"
/>
</div>
<div class="form-group">
<label for="img_url">사진 저장 주소</label>
<input
type="text"
class="form-control"
id="img_url"
name="img_url"
placeholder="{{ plant.img_url }}"
/>
</div>
<div class="form-group">
<label for="desc">Description</label>
<textarea
class="form-control"
id="desc"
name="desc"
rows="3"
placeholder="{{ plant.desc }}"
></textarea>
</div>
<button type="submit" class="btn btn-primary">수정하기</button>
</form>
{% endblock %}
fake_data = {
1: {'name': '소나무', 'img_url': 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSRc378mgNcg7LzXbaxUYNd9mHFPQCAvCG_SA&s', 'desc': '늘 푸른 소나무'},
2: {'name': '갈대풀', 'img_url': 'https://newsteacher.chosun.com/site/data/img_dir/2017/10/16/2017101600044_0.jpg', 'desc': '누구 마음은 갈대 바람'}
}
@app.route('/plants')
def get_plants():
# get some plants data
return render_template('plants.html', plants=fake_data)
@app.route('/plant/<int:plant_id>')
def get_plant(plant_id):
# get one plant data
if plant:
return render_template('plant.html', plant=plant)
else:
return 'Plant not found', 404
@app.route('/add_plant', methods=['POST'])
def add_plant():
new_id = max(fake_data.keys()) + 1
fake_data[new_id] = {
'name': request.form['name'],
'img_url': request.form['img_url'],
'desc': request.form['desc']
}
return redirect(url_for('get_plants'))
@app.route('/edit_plant/<int:plant_id>', methods=['POST'])
def edit_plant(plant_id):
plant = fake_data.get(plant_id)
if plant:
fake_data[plant_id] = {
'name': request.form['name'],
'img_url': request.form['img_url'],
'desc': request.form['desc']
}
return redirect(url_for('get_plants'))
else:
return 'Plant not found', 404
@app.route('/delete_plant/<int:plant_id>', methods=['POST'])
def delete_plant(plant_id):
if plant_id in fake_data:
del fake_data[plant_id]
return redirect(url_for('get_plants'))
else:
return 'Plant not found', 404
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:////Users/johnnykoo/repos/codespaces-flask/data.db"
db.init_app(app)
@app.route('/plants')
def get_plants():
plants = DataItem.query.all()
@app.route("/<int:id>")
def get_plant(id):
plant = DataItem.query.get(id)
@app.route('/add_plant', methods=['POST'])
def add_plant():
new_plant = DataItem(
family_kor_nm=request.form['family_kor_nm'],
genus_kor_nm=request.form['genus_kor_nm'],
img_url=request.form['img_url'],
plant_nm=request.form['plant_nm'],
desc=request.form['desc'],
)
db.session.add(new_plant)
db.session.commit()
@app.route("/edit/<int:id>", methods=['GET', 'POST'])
def edit_plant(id):
plant_to_edit = DataItem.query.get(id)
# do some edit work here
db.session.commit()
@app.route("/delete/<int:id>", methods=['POST'])
def delete_plant(id):
plant_to_delete = DataItem.query.get(id)
if plant_to_delete:
db.session.delete(plant_to_delete)
db.session.commit()
/project
│
├── /templates
│ ├── base.html
│ ├── plants.html
│ ├── plant.html
│ ├── add_plant.html
│ └── edit_plant.html
│
├── app.py
└── data.db
@app.route('/search', methods=['GET', 'POST'])
def search():
if request.method == 'POST':
keyword = request.form['keyword']
db = get_db()
cursor = db.execute('SELECT * FROM plants WHERE name LIKE ? OR description LIKE ?',
('%' + keyword + '%', '%' + keyword + '%'))
plants = cursor.fetchall()
return render_template('plants.html', plants=plants)
return render_template('search.html')
<!-- templates/search.html -->
{% extends "base.html" %}
{% block content %}
<h1>Search Plants</h1>
<form method="POST">
<div class="form-group">
<input type="text" class="form-control" name="keyword" placeholder="Enter plant name or description" required>
</div>
<button type="submit" class="btn btn-primary">Search</button>
</form>
{% endblock %}
끝