[문제1] 조건문1

홍길동씨는 5,000원의 돈을 가지고 있고 카드는 없다고 한다. 이러한 홍길동씨의 상태는 아래와 같이 표현할 수 있을 것이다.

>>> money = 5000
>>> card = False

홍길동씨는 택시를 타고 목적지까지 가려고 한다. 목적지까지 가기 위해서는 카드를 소유하고 있거나 4,000원의 택시요금이 필요하다고 한다. 홍길동씨는 택시를 탈 수 있는지를 판별할 수 있는 조건식을 작성하고 그 결과를 출력하시오.


>>> if card or money >= 4000:

...     print("U can use TAXI")

...

U can use TAXI


[문제2] 조건문2

홍길동씨의 행운권 번호는 23번 이라고 한다. 다음은 행운권 당첨번호 리스트이다.

>>> lucky_list = [1, 9, 23, 46]

홍길동씨가 당첨되었다면 “야호”라는 문자열을 출력하는 프로그램을 작성하시오.


>>> lucky_list = [1, 9, 23, 46]

>>> if 23 in lucky_list:

...     print("야호")

...

야호



[문제3] 홀수 짝수 판별

주어진 수가 짝수인지 홀수인지 판별하는 프로그램을 작성하시오.

>>> a = 12

>>> if a%2 ==1:

...     print("홀수")

... elif a%2 == 0:

...     print("짝수")

...

짝수


[문제4] 문자열 분석

다음 문자열을 분석하여 나이가 30미만이고 키가 175이상인 경우에는 YES를 출력하고 아닌 경우에는 NO를 출력하는 프로그램을 작성하시오.

나이:30,키:180


>>> if 나이 < 30 and 키 >= 175:

...     print("yes")

... else:

...     print("NO")

...

NO



[문제5] 조건문3

다음 코드의 결과값은 무엇일까?

>>> a = "Life is too short, you need python"
>>> if 'wife' in a:
...     print('wife')
... elif 'python' in a and 'you' not in a:
...     print('python')
... elif 'shirt' not in a:
...     print('shirt')
... elif 'need' in a:
...     print('need')
... else:
...     print('none')


shirt


튜플 vs 리스트


1. 리스트는 항목값이 변화 가능함.

2. 튜플은 항목값이 변화가 불가능 함. 따라서 값이 변하지 않길 원한다면 튜플을 써야한다.



 [문제1] 튜플 작성

숫자 3만을 요소값으로 가지는 튜플을 작성하라.


a = (3,) 1개의 요소값 갖는 튜플은 항상 콤마 포함하기!

a  = 3, 도 가능!



[문제2] 튜플 변경

다음은 튜플 (1, 2, 3)을 (1, 4, 3)과 같이 변경하려고 시도했을 경우이다. 오류의 원인에 대해서 설명하시오.

>>> a = (1, 2, 3)
>>> a[1] = 4
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment


튜플은 리스트와 다르게 항목값 변경이 불가능하다. 따라서 오류가 나온것.



[문제3] 튜플 추가

(1,2,3)이라는 튜플에 4라는 값을 추가하여 (1,2,3,4)처럼 만들어 출력해 보자.


a = (1,2,3)

a = a + (4,)

해주면 

a 는 (1,2,3,4) 가 완성 된다.


일단 Mysql 로 DB 를 다루기 전에 그냥 파일로 저장해봤다. 

로그인 완료창이랑 로그아웃때 템플릿엔진으로 좀 괜찮은 디자인을 사용하고 싶은데

디자인하는거는 너무 어려워서 나중에 디자이너한테 부탁해야겠다. 

디자인이 일단 너무 구림...


코딩하기 전 구상... 와 글씨 너무 끔찍하다 아무리 나 혼자 보는거지만...






코드...




var express = require('express')

var session = require('express-session')

var MySQLStore = require('express-mysql-session')(session)

var bodyParser = require('body-parser')

var app = express()

app.use(bodyParser.urlencoded({ extended: false }));

app.use(session({

  secret: 'djqiowjd2212@@!sd32dk9023kjd09j',

  resave: false,

  saveUninitialized: true,

  store:new MySQLStore({

    host: 'localhost',

    port: 3306,

    user: 'root',

    password: 'root',

    database: 'adopt'

  })

}));


app.set('view engine', 'ejs')

app.set('views', './views')


app.get('/adopt_login', function(req, res){

  res.render('view')

})


app.get('/adopt_logout', function(req, res){

  delete req.session.displayName;

  res.redirect('/welcome')

})


var users =[

  {

    username:'Jeong',

    password:'111',

    displayName:'Jeong'

  }

];


app.post('/adopt_login', function(req, res){

  var uname = req.body.username;

  var pwd = req.body.password;

  for(var i=0; i<users.length; i++){

    var user = users[i];

    if(uname === user.username && pwd === user.password){

      req.session.displayName = user.displayName;

      return res.redirect('/welcome');

    }

  }

    res.send('Who are u <a href="/Adopt_login">Login</a>');

});


app.get('/welcome', function(req, res){

  if(req.session.displayName){

    res.send(`

      <h1>Hello, ${req.session.displayName}</h1>

      <a href="/adopt_logout">logout</a>

      `)

  } else {

    res.send(`

      <h1>Welcome</h1>

      <a href="/adopt_login">Login</a><br>

      <a href="/adopt_register">Register</a>

    `);

  }

})


app.get('/adopt_register', function(req, res){

  var output=`

  <h1>Register</h1>

  <form action="/adopt_register" method="post">

    <p>

      <input type="text" name="username" placeholder="username"

    </p>

    <p>

      <input type="password" name="password" placeholder="password"

    </p>

    <p>

      <input type="text" name="displayName" placeholder="displatName"

    </p>

    <p>

      <input type = "submit">

    </p>

  </form>

  `

  res.send(output)

})


app.post('/adopt_register', function(req, res){

  users.push({

    username:req.body.username,

    password:req.body.password,

    displayName:req.body.displayName

  })

  req.session.displayName = req.body.displayName;

  req.session.save(function(){

    res.redirect('/welcome')

  })

})


app.listen(3003, function(){

  console.log('Connected 3003!');

});



느낀점...

실제 서비스를 이용할때는 파일로 DB 관리를 하면 전혀 실용적이지 않을 것같다.

포트연결이 끊어지는 순간 다 휘발...

sql 로 빨리 만들어봐야겠다.



리스트 자료형에 대한 정리.


[문제1] 리스트 인덱싱

다음과 같은 리스트 a가 있다.

>>> a = ['Life', 'is', 'too', 'short', 'you', 'need', 'python']

a 리스트를 이용하여 다음과 같은 문자열을 출력하시오.

you too


-> 풀이

a[4]+' '+a[2] 




[문제2] 리스트 조인

['Life', 'is', 'too', 'short'] 라는 리스트를 Life is too short라는 문자열로 만들어 출력해 보자.





[문제3] 리스트의 갯수

다음과 같은 리스트 a가 있다.

>>> a = [1, 2, 3]

이 리스트의 갯수(사이즈)를 구하시오.


[문제4] 리스트의 append와 extend

다음과 같은 리스트 a가 있다.

>>> a = [1, 2, 3]

리스트 a에 [4, 5]를 append 했을 때와 extend했을 때의 차이점은 무엇인가?


-> 풀이

a.append([4, 5]) 를 하면 a = [ 1, 2, 3, [4, 5] ]

a.extend([4, 5]) 를 하면 a = [ 1, 2, 3, 4, 5 ]

로나온다


즉, 리스트의 append 함수는 한 개의 값을 추가하는 함수이다. 여기서 사용된 한 개의 값은 [4, 5]라는 리스트이므로 리스트 a에 [4, 5]라는 리스트가 가장 마지막에 추가된 것이다.

반면 expend 함수는 리스트값에 입력받은 리스트를 더하는 함수이다. 따라서 [ 1, 2, 3, 4, 5 ] 가 나온다.




[문제5] 리스트 정렬

[1, 3, 5, 4, 2]라는 리스트를 [5, 4, 3, 2, 1]로 만들어보자. (힌트. 리스트의 내장함수인 sort와 reverse를 활용해 보자.)

먼저 a = [1,3,5,4,2] 로 리스트값을 준다.

그 다음 순서가 엉망 진창이니까 a.sort() 로 순서를 맞춰주면 a = [ 1,2,3,4,5 ]

가 된다.

그리고 순서를 뒤집어야 하기에 a.reverse() 를 해주면서 a = [ 5,4,3,2,1 ] 이 완성된다.




[문제6] 리스트 삭제

[1, 2, 3, 4, 5]라는 리스트를 [1, 3, 5]로 만들어 보자.


먼저 remove 함수를 사용한다.

a.remove(2) 로 2삭제

a.remove(4) 로 4삭제


그러면 a = [1,3,5] 가남는다.

Python 의 숫자 자료형같은 경우 자바나 C# 과 비슷해서 큰 어려움이 없었다.


1. ** 연산자의 경우 제곱을 나타낸다.


>>> a = 3 >>> b = 4 >>> a ** b 81


2. // 연산자의 경우 소숫점의 아랫자리를 버려준다.


>>> 7 // 4 1


반면 / 연산자의 경우 소숫점 아랫자리를 보존한다.


>>> 7 / 4 1.75


3. % 연산자는 나머지를 반환 해 준다.


>>> 7 % 3 1 >>> 3 % 7 3



 예전부터 참여하고 싶었던 피로그래밍 리크루팅 날짜가 잡혔다. 학원 알바때문에 참여할 기회가 없었는데 너무 잘된것 같다. 피로그래밍 때문에 수학 학원알바를 과감하게 퇴사했다! 문의 결과 평일 하루 평균 7시간 이상을 프로그래밍에 매진해야 하기에 도저히 학원과 병행이 불가능! 하지만! 올해 휴학의 목표는 프로그래밍의 맛을 보는것이기 때문에 괜찮다!! 

  

 분명 피로그래밍의 멋진 커리큘럼을 알고있는 쟁쟁한 참여자분들이 많을 것이 예상된다! 따라서 피로그래밍 회장님이 추천해 주신 '점프투 파이썬' 을 면접 기간 전 까지 공부하고 가려고 한다.


 사실 나는 프로그래밍을 시작한지 100일도 안 되었다. ( 학원 알바 끝나면 10시가 넘기 때문에 실질적으로 프로그래밍을 다룬 시간 자체는 더 적을 것이다. ) 하지만 피로그래밍은 비전공자를 위한 연합동아리이기 때문에 오히려 나와 더 잘 맞을것이란 생각이 든다! 필자는 지금까지 자바스크립트로 Nodejs 로 서버개발을 해보려 노력하고있다. 하지만 독학을 하다 보니 명확한 가이드라인이 잡히지 않았었다.


 사실 파이썬은 처음 이용해 보는 것이지만 기본적인 문법구조는 자바와 비슷한것 같아서 열심히 한다면 할 수 있을 것 같다! 피로그래밍 9기 합격을 위해 화이팅!




1. 먼저 파이썬의 기본 문법을 살펴 보기 전에 기본 툴로는 Sublime Text 3 를 사용했다. 예전 html 으로 코딩할때 괜찮다고 느껴서 그렇게 하기로 했다. 사용해보고 별로면 바꾸지뭐 ㅋㅋ...


< 첫 hello world >



2. 근데 >>> 를 사용한다고 되어있는데 오류가 난다. 이유는 다음 글 쓰기 전 까지 알아내야겠다.

var express = require('express');
var app = express();
var cookieParser = require('cookie-parser');
app.use(cookieParser());

app.get('/count', function(req, res){
if(req.cookies.count){
var count = parseInt(req.cookies.count);
} else {
var count = 0;
}
count = count+1;
res.cookie('count', count);
res.send('count : '+ count);
});
app.listen(3003, function(){
console.log('Connected 3003 port!');
});


- 쿠키는 하이퍼 텍스트의 시록서 일종으로 인터넷 사용자가 어떠한 웹 사이트를 방문할 경우
그 사이트가 사용하고 있는 서버를 통해 인터넷 사용자의 컴퓨터에 설치되는 작은 기록 정보 파일을 말한다.
- 이 기록 파일에 담긴 정보는 인터넷 사용자가 같은 웹사이트를 방문할 때마다 읽히고 수시로 새로운 정보로 바뀐다.

- cookieParser 로 쿠키를 사용할 미듈웨어 세팅을 한뒤 웹브라우저에서 웹서버에 접속하면 웹 서버에서 cookie 값을 1 로 세팅해 response한다.

- 웹 브라우저는 받은 쿠키값으로 웹 서버에 request 하는 것이다.



 먼저 post 형식으로 정보를 받기 위해 npm body parser 가 필요하다.

따라서 터미널에 npm body paser --save 를 하여 body-parser 모듈을 사용할 준비를 해야 한다.


그리고 npm bodyParer 설명서를 보면 


var bodyParser = require('body-parser');


를 하여 bodyParser 를 요청한다. 그 다음


app.use(bodyParser.urlencoded({ extended: false }));


로 바디파서를 사용하는 코드를 use 하면 본격적으로 body 객체를 이용하여 post 방식을 사용 가능하다.


app.post('/topic', function(req, res){

var title = req.body.title;

var description = req.body.description;

res.send('H, post' + '+req.body.title')


을 통해 post 형식으로 잘 작동하는지 확인한다.



파일을 제어하기 위해 (파일 시스템) 'fs' 라는 모듈을 호출 해야한다.


var fs = require('fs'); 


로 fs 를 호출한다.

그리고 밑에


fs.writeFile('data(폴더이름)/'+(파일이름)title,description,(콜백)function(){

if(err){

 res.status(500).send('Internal Server Error');

}

res.send('success')

});


그러면 success 가 뜨면서 data 폴더에 title 을 제목으로 한 파일이 생성된다.


다음에 data 폴더에서 확인해 보면 Sample 파일이 생성되어 있다.



들어가기 전에...


- Post 형식으로 라우팅 해서 연결하는 단계 까지 할 것이다.

- 파일은 app_file.js 로 설정했고 템플릿 엔진(PUG) 는 views_file 폴더에 넣어 뒀다.


코드는 아래와 같다.

먼저 express 를 require 로 불러온다. (express 설치가 선행되어야 함.)


그리고 var app 을 통해 express 정의한 뒤, 템플릿 엔진을 사용하여 html 소스코드가 깔끔하게 보이게 하기 위하여 app.locals.pretty = true; 코드를 입력해 준다.


그 후 템플릿 엔진 'pug' 를 사용하기 위해 


app.set('views', './views_file');

app.set('view engine', 'pug');


코드를 입력해 준다. 


그 다음 pug 템플릿 엔진으로 사용할 text 에 아래 코드를 입력한다.


form 문에서 action 으로 정보를 보낼 곳 을 지정해 준 뒤, method는 post 로 지정해준다.


그리고 아래 코드를 통해


app.get('/topic/new', function(req, res){

  res.render('new');

})


new.pug 파일을 랜더링 해준다.



그리고 아래 코드를 입력하여 3000 포트에 listen 해주고,

app.post 에 'Hi post') 를 입력하여 post 형식이 연결 되었는지 확인한다.


 app.post('/topic', function(req, res){

  res.send('Hi, post');

})

app.listen(3000, function(){

  console.log('connected, 3000...')

})



참고) 들어가기 전에 form 문


- pug 안에서 사용한다.

- URL 을 생성하는 역할을 함.

- 그것을 get 하면 된다.

- form 에서 method=get 을 생략하면 명시적으로 get 으로 인식한다.


< post 방식으로 정보를 전달하는 방법 >


method 에서 'post' 를 입력 할 경우 정보를 post 로 받게 된다. ( mothod 를 생략할 경우 자동으로 get 형식으로 받게 된다. )


post 방식을 이용할 때는 get 방식을 이용할때 app.get 을 하는것 처럼 app.post 로  코드를 입력받는다. (라우트)


즉. app.post('form_receiver', function(req, res){ ......

var title = req.body.title;

var description = req.body.description;

res.send( <- 이런 식으로. 그리고 위의 코드처럼 post 방식에서는 

req.query 대신에 body 객체를 이용한다.


 하지만 이렇게 하면 에러가 발생하는데, 이는 req 안에 body 객체가 존재하지 않기 때문이다. 이를 해결하려면 body-parser 라는 미들웨어 (확장모듈) 을 cdm 에서 설치해야한다. 설치를 하게 되면 body 객체를 사용할 수 있다.


그리고 express.js 홈페이지 설명서를 참고하면


var bodyParser = require('body-parser') 과 app.use(bodyParser.urlencoded({extended: false})) 


코드를 추가 시키라고 한다. 두 코드를 적당한 위치에 넣어주면 body 객체를 사용 할 수 있다. 이는 바디 파서를 리콰이어 한 뒤 app.use 를 통해 붙여 넣는것으로 이해하면 편하다.


그러면 바디라는 객체를 사용하여 get 방식과 처럼 정보를 얻을 수 있다.



+ Recent posts