728x90
반응형

 

* 본 포스팅은 주피터 노트북에서 진행되었다.

 

url = "https://hello-ming.tistory.com/"
res=rq.get(url,params={"key":"홍길동","key1":"홍말자","key2":"김개똥"})
res.url #한글은 꺠진다.

 

res=rq.get(url,params={"key":"hong","key1":"malga","key2":"hi"})
res.url

 

url = "https://hello-ming.tistory.com//?key=hong&key1=malga"
res.url #위와 같은방식인데 이거는 오타날 확률이 있음

 

Post로 데이터 보내기

 

url = "https://hello-ming.tistory.com/"
res=rq.post(url, data={"key1":"hong","key2":"icebear"})
res.url #post로 body에  싣어 보냄

dict1 = {"key1":"hong","key2":"icebear"}
import json
json.dumps(dict1) # '{"key1": "hong", "key2": "icebear"}'
str(dict1) # '{"key1": "hong", "key2": "icebear"}'

둘다 문자열 형태로 감 json 형태 유지의 차이

 

from urllib.request import urlopen,Request
req = Request(url)
page = urlopen(req)
page

 

 

728x90
반응형
728x90
반응형
import requests as rq
url = "https://hello-ming.tistory.com/"
res=rq.get(url) #get방식으로 접근

이 url을 res로 지정 후

 

res.text #html 코드를 가져온다.

res.content #content, text는 한글 깨짐, utf-8 euc-kr

 

res.encoding #이 브라우저 페이지가 인코딩을 utf-8로 함을 알 수 있다.

 

 

 

 

728x90
반응형
728x90
반응형

 

* 주피터 노트북에서 실행하였다.

 

import requests

 

만약 실행되지 않는다면 주피터 노트북 상에서 설치하는 방법이 있다.

 

!pip install requests

 

pwd #현재 위치

실명이라 가렸다.

 

import requests as rq
url = "https://hello-ming.tistory.com/"
res=rq.get(url) #get방식으로 접근
print(res) # <Response [200]>

rq.post(url) # <Response [200]>

res.status_code # 200

 

def url_check(url):
    res = rq.get(url)
    
    print(res)
    sc = res.status_code
    if sc==200:
        print("%s 요청 성공"%(url))
    elif sc==404:
        print("%s 알 수 없는 에러 "%(url))
    else:
        print("%s 알 수 없는 에러:%s "%(url,sc))

headers=res.headers #헤더들을 가져온다.
headers

type(headers) 

딕셔너리인것을 알 수 있다.

 

headers['Date'] #딕셔너리라 key값을 주면 value를 불러올 수 있다.

 

#반복문을 이용하여 항목 출력
for i in headers:
    print('1) key : ',i,' 2) values : ',headers[i])

728x90
반응형
728x90
반응형

2021.06.07 - [BACK-END/Django] - [Django] cmd로 가상환경 만들기 / 기본환경셋팅

 

[Django] cmd로 가상환경 만들기 / 기본환경셋팅

cmd를 이용하여 Django에 필요한 가상환경을 만들것이다. 파이썬이 있어야한다! django를 설치할 파일을 미리 만들어 주었다. 로컬 디스크 c에 python3이라는 폴더를 만들어 주었다. cmd창에 들어간다. c

hello-ming.tistory.com

 

위의 포스팅 이후에 작성한 글이므로 전 포스팅의 기본환경셋팅과 연결된다!

 

나는 그동안 PyCharm Edu로 써왔어서 이번에 다시 설치하게 되었다.

 

파이참(PyCharm)  Community 버전으로 설치한다.

https://www.jetbrains.com/pycharm/download/#section=windows 

 

 

파이참을 실행해서 프로젝트를 새로 만든다.

 

 

Virtualen을 이용해서 C:\python3\venv 폴더에 파이썬 3.6의 가상환경을 생성하겠다는 뜻이다.

 

가상환경 생성중

 

CLI 환경을 파이참에서 설치할 것이다.

 

settings - Project Interpreter 에 들어간다.

 

 

+ 버튼을 눌러준다.

 

 

전 포스팅에서 cmd로 Django를 설치했는데 그 패키지 안의 python.exe와 연결해준다.

 

Django와 연결됨을 확인할 수 있다.

 

파이참 내의 terminal을 연다.

 

 

이런식으로 (django)로 시작하면 성공된 것이다.

 

mysite 라는 django 프로젝트 이름을 생성할 것이다. 

 

중요한 것은 [ mysite . ]  여기에 . 이 없으면 mysite 안에 또 만들어서 꼭 . 를 붙여줘야 한다.

 

어플리케이션은 생성되었고 polls를 생성해보자

 

polls는 여론조사 같은것이다.  실행하면 polls라는 앱이 생성된다.

 

mysite는 프로젝트 이름이고 polls는 어플리케이션이다.

 

 

runserver는 브라우저를 돌리는 것이다.

 

 

위 사이트를 CTRL을 누른채로 클릭하면 새창에 뜨는데 밑에 그림이 뜬다면 연결된것이다.

 

 

django를 시작할 준비가 되었다는 뜻이다.

728x90
반응형
728x90
반응형

https://devbruce.github.io/python/py-17-decorator/

 

[Python] Decorator (1)

 

devbruce.github.io

 

위 사이트에 Decorator의 설명가 예제가 잘 되어있어

 

사이트에 있는 예제를 기반으로 공부하고 내가 추가로 함수를 만들어 보며 Decorator에 대해 알아보았다!

 

Decorator란

  • 어떤 함수를 받아 명령을 추가한 뒤 이를 다시 함수의 형태로 반환하는 함수.
  • 어떤 함수의 내부를 수정하지 않고 기능에 변화를 주고 싶을 때 사용한다.
  • 함수를 꾸며준다.

자바의 Closure와 비슷하다.

 

Decorator의 구조

def 데코레이터이름(func):  # 기능을 추가할 함수를 인자로 받아온다.
    def 내부함수이름(*args, **kwargs):
        기존 함수에 추가할 명령
        return func(*args, **kwargs)
    return 내부함수이름

 

사이트에 있는 예제로 Decorator에 대해 이해해 보았다.

 

def test(a,b):
    print("계산 시작합니다.")
    print(a+b)
    print("계산 완료되었습니다.")
def test2(a,b):
    print("계산 시작합니다.")
    print(a*b)
    print("계산 완료되었습니다.")
def test3(a,b):
    print("계산 시작합니다.")
    print(a//b)
    print("계산 완료되었습니다.")

 

 print문이 매우 노가다이므로 이걸 Decorator를 사용한다!

 

def deco_func(origin_func):
    def nested_func(*args, **kwargs):
        print("계산 시작합니다.")
        origin_func(*args,**kwargs) #여기 내부함수 nested_func 함수에서 origin_func
        print("계산 완료되었습니다.")
        return
    return nested_func

 

  • 구조를 이해하기 위해서는 Closure 에 대해 알아야 하는데
클로저의 3가지 조건
1. 외부함수에서 내부함수를 반환
2. 함수가 중첩(외부함수 내부함수가 있어야한다)
3. 내부함수에서 외부함수의 지역변수를 참조하고 있어야 한다.

 

배우다 보니 스프링의 AOP 기능과 비슷하다고 느꼈다.

 

@deco_func
def test(a,b):
    print(a+b)
@deco_func
def test2(a,b):
    print(a*b)
@deco_func
def test3(a,b):
    print(a//b)

 

Decorator한 함수를 실행시켜 보니

 

test(5,2)
print("-"*30)
test2(5,2)
print("-"*30)
test3(5,2)

 

신기하다.

 

def new_func(a,b,c,d,e):
    print(a,b,c,d,e)

 

데코레이터가 적용되는 과정은 결국 클로저 활용과 동일하다.

 

deco_func(new_func)(1,2,3,100,200)

 

def a(**u):
    for i in u:
        print(i)
a(t=6, q=8) #키와 벨류로 전달

728x90
반응형
728x90
반응형

 

cmd 창에 들어가서 아래의 코드를 입력하면 자동으로 설치가 된다.

 

pip install requests

 

import requests

url = 'https://www.naver.com'
html = requests.get(url)

print(html.text)

 

파이참에 위 코드를 실행하면 console창에 url에 입력한 사이트를 html 형식으로 변환해준다.

 

Cisual Studio Code에 띄어 보았다.

 

 

 

728x90
반응형
728x90
반응형

 

https://gist.github.com/saleph/a301957b16dff7ad2892

 

[qt5] grid layout - calculator skeleton

[qt5] grid layout - calculator skeleton. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

 

전 포스팅인 PT Designer를 이용하여 계산기를 만들면서 구글링을 통해 위 사이트를 알게 되었다.

 

사이트에 있는 코드는 grid 계산기의 layout만 있었다. 이 코드를 이용하여 계산기의 기능을 구현하고자 한다.

 

def init_ui(self): 까지는 사이트에 있던 코드의 내용이고

 

def func_a는 내가 계산기의 기능을 추가한 것이다!

 

import sys
from PyQt5.QtWidgets import (QWidget, QGridLayout, QPushButton, QApplication, QPlainTextEdit, QLabel)

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.str =''
        self.label =QLabel();
        self.init_ui()

    def init_ui(self):
        grid = QGridLayout()
        self.setLayout(grid)

        names = ['Cls', 'Bck', '', 'Close',
                 '7', '8', '9', '/',
                 '4', '5', '6', '*',
                 '1', '2', '3', '-',
                 '0', '.', '=', '+']

        positions = [(i,j) for i in range(5) for j in range(4)]

        for position, name in zip(positions, names):
            if name == '' : continue
            btn = QPushButton(name)
            btn.clicked.connect(self.func_a)
            grid.addWidget(btn, *position)
        grid.addWidget(self.label)
        self.move(300,150)
        self.setWindowTitle('Calculator')
        self.show()
        self.str=""

    def func_a(self,x) -> None:
        sender = self.sender()  # 어떤 콤포넌트 또는 위젯에서 어떤 signal이 발생했는가?
        self.str = self.str + sender.text()

        self.label.setText(self.str)
        result=[]
        first_operand = 0

        if 'C' in self.str: #비우기
            self.label.clear()
            self.str = '' #문자열 내용 비우기

        for i in list(self.str):
            result_str = ''.join(result)
            if i == '=': # =일 경우 계산 결과를 label에 적용
                print("결과는 =",i, 'result :', result)
                print('결과는 ',result_str)
                print('비어있나', first_operand)
                print('계산 결과는', int(result_str)+first_operand)
                if '+' in self.str:
                    self.label.setText(str(int(result_str) + first_operand))
                if '-' in self.str:
                    self.label.setText(str(first_operand - int(result_str)))
                if '*' in self.str:
                    self.label.setText(str(first_operand * int(result_str)))
                if '/' in self.str:
                    self.label.setText(str(first_operand / int(result_str)))

            elif i in ['+','-','*','/']:
                first_operand += int(result_str)
                print('덧셈 누르면',result_str)
                print(i)
                result=[]

            else:
                result.append(i)
                print(i, '결과 : ',result)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

 

실행화면

 

2/3 입력

 

= 누른 순간 0.6666666666이 계산되었다.

728x90
반응형
728x90
반응형

이전 포스팅에서는 .ui를 .py로 바꾸는 방법을 소개했다.

 

이번에는 다른 방법으로 파이참 내에서 .ui를 실행하는 코드를 소개할 것이다.

 

파이참 파일에서 실행할 아무파일 .py를 생성하고 

 

필수적으로 띄울 .ui를 프로젝트파일에 옮겨놔야 한다!

.ui가 있어야 한다.

 

import sys
from PyQt5.QtWidgets import *
from PyQt5 import uic

from_class = uic.loadUiType("qt0602.ui")[0]
#QMainWindo, from_class를 상속받아 내 클래스 MyWindow
class MyWindow(QMainWindow, from_class):
    def __init__(self):
        super().__init__()
        self.setupUi(self) #this가 상속받은곳에 없으면 부모를 찾아감

if __name__ == "__main__":
    app = QApplication(sys.argv)
    mywindow = MyWindow()
    mywindow.show()
    app.exec_()

 

728x90
반응형
728x90
반응형

* 본 포스팅은 주피터 노트북에서 실행하였다.

 

클래스와 특수 메소드

2차원 벡터를 표현하는 Vector2D라는 클래스를 구현하고 이 클래스를 통해서 특수 메소드의 필요성에 대해 살펴볼 것이다.

class Vector2D:
    def __init__(self,x,y):
        self._x=x
        self._y=y
    def __str__(self):
        return '({},{})'.format(self._x, self._y)
    def add(self, other):
        return Vector2D(self._x + other._x, self._y+other._y)
    

2차원 벡터를 표현하는 Vector2D라는 클래스를 구현하고 이 클래스를 통해서 특수 메소드의 필요성에 대해 살펴보자.

v1 = Vector2D(30,40)
v2 = Vector2D(110,20)
v3 = v1 + v2
print(v3)

 

  • 에러가 나타나는 이유는 클래스 내부에 어떤 방식으로 덧셈을 할지 그 방법을 서술해야 하기 때문이다.
  • add()라는 메소드를 정의하고 두 벡터의 x 성분과 y 성분을 더하고 이 성분값을 초기값으로 가지는 Vector2D를 반환하도록 하자
v3 = v1.add(v2)                 # Vector2D의 add() 메소드 사용
print('v1 + v2 = ',v3)

  • v1.add(v2)는 두 벡터의 합을 출력한다.
  • add() 메소드 대신에 +, - 와 같은 연산자를 사용하면 보다 편리하다.

 

class Vector2D:
    def __init__(self,x,y):
        self._x=x
        self._y=y
    def __str__(self):
        return '({},{})'.format(self._x, self._y)
    def add(self, other):
        return Vector2D(self._x + other._x, self._y+other._y)
    def __sub__(self,other):
        return Vector2D(self._x - other._x, self._y-other._y)
    def __mul__(self,other):
        return Vector2D(self._x * other._x, self._y*other._y)
v1 = Vector2D(30,40)
v2 = Vector2D(10,20)
v3 = v1.add(v2) #v1+v2도 가능
v4 = v1-v2
print(v3)
print(v4)

 

v1 = Vector2D(30,40)
v2 = Vector2D(10,20)
v5 = v1*v2
print(v5)


class Circle:
    PI=3.1415 #클래스 변수
    def __init__(self, name,radius):
        self._name=name
        self._radius = radius
    def area(self):
        return Circle.PI * self._radius**2
        
c1 = Circle('C1',4)
print('c1의 면적 ',c1.area())

 

c2 = Circle('C2',6)
print('c2의 면적 ',c2.area())

 

dictionary로 key값 보기

c1 = Circle('C1',4)
print('c1의 속성들 ',c1.__dict__)

 

print('c1의 name 변수값 ',c1.__dict__['_name'])

 

print('c1의 radius 변수값 ',c1.__dict__['_radius'])

728x90
반응형
728x90
반응형

* 본 포스팅은 주피터 노트북에서 실행하였다.

 

객체의 동일성(identity)에 대해 알아보자

 

list_a = [10, 20, 30]
list_b = [10, 20, 30]
if list_a is list_b:
    print('list_a is list_b')
else :
    print('list_a is not list_b')
    

list_a와 list_b가 다르다고 한다. 왜일까?

id(list_a) #2454901262600

id(list_b) #2454901262088

id()를 이용하여 각각의 id값을 확인했는데 다름을 확인할 수 있었다...

 

두 인스턴스의 속성값 즉 인스턴스 변수값이 서로 일치하는지 확인하기 위해서는 == 사용

파이썬 == -> 자바 equals
자바 == -> 파이썬 is

 

위를 참고하여 ==을 이용하니 같다고 떴다.

if list_a == list_b:
    print('list_a == list_b')
else :
    print('list_a != list_b')

 

a = 'ABC' #문자열 객체를 참조하는 변수 a
b = 'ABC' #문자열 객체를 참조하는 변수 b
if a is b:
    print('a is b')
else :
    print('a is not b')

 

id(a) # 2454831867584

id(b) # 2454831867584

문자열 객체는 id의 값이 같음을 확인할 수 있다.

 

문자열이 동일하게 결과가 나오는 것은 동일한 메모리에 있다는 것을 의미하고 문자열을 변경하지 못한다. (immutable)

728x90
반응형

+ Recent posts