顯示具有 python 標籤的文章。 顯示所有文章
顯示具有 python 標籤的文章。 顯示所有文章

python之找到區域變數們。

沒有留言:
雖然小小一篇,但是這可是讓我回想了好久呀。
python有一個小函數可以回傳當下的區域變數列表,不過如果在最外層就locals(),就是回傳全域變數們了!XDDD

locals()

python 讀 bitmap 顯示它的值

沒有留言:
原本想寫一個smooth演算法的。
但是,想不到python的前置作業還滿麻煩的。(小小的不習慣)

我準備了一張這樣的影像
顏色: 灰階
色階: 8bit/pixel (我比較喜歡叫演色性)
大小: 5 pixel ×5 pixel

原本不打算使用任何的lib進行coding,但是因為手邊並無「沒有檔頭」的影像。
準備好的影像檔,也是.bmp格式,所以就去找了一下適合的lib來解決檔頭的問題。

找到了一個叫PIL的lib,好像很厲害。
跟著這一份教學,有小小的練習了一下,如果當初研究(研究影像處理)所是用python,不知道會是怎麼樣的情況呀(遠望)

說遠了

然後,這次的實作,只有將影像讀取出來,並且顯示所有的pixel值。
from PIL import Image

bmp_image = Image.open( 'sample.bmp' )

for i_vertical in range(bmp_image.height):
    line_horizon = [bmp_image.getpixel((i_horizon, i_vertical)) for i_horizon in range(bmp_image.width) ]
    print(*line_horizon)

bmp_image.close()
effective python說用這樣比較快
from PIL import Image

bmp_image = Image.open( 'sample.bmp' )

line_horizon = (bmp_image.getpixel((i_horizon, i_vertical)) for i_vertical in range(bmp_image.height) for i_horizon in range(bmp_image.width))
for x in range(bmp_image.height):
   for y in range(bmp_image.width):
      print(next(line_horizon), ' ', end = '')
   print('')

bmp_image.close()
執行結果:
(我有手動讓它對齊)
255   0   0   0   0
255 255   0   0   0
255   0 255   0 255
  0 255   0 255   0
  0   0   0 255   0
255 255 255 255 255

python call C++ API by Boost~初體驗

沒有留言:
原則上,是將c++編譯成dll檔。
只是這個dll檔,是要給python用的

建立專案檔

建立一個Win32 Console的dll檔專案

原本的C++程式碼

先來看看一個cpp原本的code

.h檔

#include <string>
#include <map>

class Persion
{
    std::string m_Name;
    std::string m_HomeNumber;
public:
    Persion();
    explicit Persion(const std::string &name);
    virtual ~Persion();
    void SetName(const std::string &name);
    std::string GetName() const;
    void SetHomeNumber(const std::string &number);
    std::string GetHomeNumber() const;
};

class PersionWithCell : public Persion
{
    std::string m_CellNumber;
public:
    PersionWithCell();
    explicit PersionWithCell(const std::string &name);
    void SetCellNumber(const std::string &number);
    std::string GetCellNumber() const;
};

class PhoneBook
{
    std::map<std::string, Persion*> m_PhoneBook;
public:
    int GetSize() const;
    void AddPerson(Persion *p);
    void RemovePersion(const std::string &name);
    Persion *FindPerison(const std::string &name);
};

.cpp檔

#include "phonebook.h"

Persion::Persion():
m_Name(""), m_HomeNumber("")
{}

Persion::Persion(const std::string &name):
m_Name(name), m_HomeNumber("")
{}

void Persion::SetName(const std::string &name)
{
    m_Name = name;
}

std::string Persion::GetName() const
{
    return m_Name;
}

void Persion::SetHomeNumber(const std::string &number)
{
    m_HomeNumber = number;
}

std::string Persion::GetHomeNumber() const
{
    return m_HomeNumber;
}

Persion::~Persion()
{}

int PhoneBook::GetSize() const
{
    return (int)m_PhoneBook.size();
}

void PhoneBook::AddPerson(Persion *p)
{
    m_PhoneBook[p->GetName()] = p;
}

void PhoneBook::RemovePersion(const std::string &name)
{
    m_PhoneBook.erase(name);
}

Persion *PhoneBook::FindPerison(const std::string &name)
{
    return m_PhoneBook[name];
}

void PersionWithCell::SetCellNumber(const std::string &number)
{
    m_CellNumber = number;
}

std::string PersionWithCell::GetCellNumber() const
{
    return m_CellNumber;
}

PersionWithCell::PersionWithCell():m_CellNumber(""), Persion()
{}

PersionWithCell::PersionWithCell(const std::string &name):m_CellNumber(""), Persion(name)
{}

為C++ code 建立表皮

再來我們為了這一個cpp程式,建立一份「皮」
在此可以注意的是,如果你要為屬性設定get/set,使用.add_property(),如果是只有get或只有set,就如同新增一個function一樣,用.def()
#include "phonebook.h"
#include <boost/python.hpp>

using namespace boost::python;

static std::string PrintPersion(const Persion &p)
{
    std::ostringstream stream;
    stream << p.GetName() << ": " << p.GetHomeNumber();
    return stream.str();
}

std::ostream &operator<<(std::ostream &os, const Persion &p)
{
    os << p.GetName() << ": " << p.GetHomeNumber();
    return os;
}

BOOST_PYTHON_MODULE(phonebook)
{
    class_<Persion>("Persion", init<>())
        .def(init<std::string>())
        .add_property("name", &Persion::GetName, &Persion::SetName)
        .add_property("home_number", &Persion::GetHomeNumber, &Persion::SetHomeNumber)
        .def("__str__", &PrintPersion)
        .def(self_ns::str(self))
        ;

    class_<PhoneBook>("PhoneBook")
        .def("size", &PhoneBook::GetSize)
        .def("add_persion", &PhoneBook::AddPerson)
        .def("remove_persion", &PhoneBook::RemovePersion)
        .def("find_persion", &PhoneBook::FindPerison,
            return_value_policy<reference_existing_object>())
            ;
}


編譯

編譯成.dll檔!

用python呼叫之前


  1. 將.dll改成.pyd
  2. 將.pyd檔的檔名設定成BOOST_PYTHON_MODULE()裡定義的名字
  3. 將Boost的boost_python-vc80-mt-gd-1_60.dll copy 到和.py檔同目錄
    (這一步如果有人知道怎麼不移動檔案,還麻煩請告訴我呢!)

寫python

import debug.phonebook as phonebook

book = phonebook.PhoneBook()
p = phonebook.Persion()
p.name = "Chris"
p.home_number = '(123) 456-7890'
book.add_persion(p)
p = phonebook.Persion('Mary')
#p.name = 'Mary'
p.home_number = '(123) 456-7890'
book.add_persion(p)
print('No. of contacts =', book.size())
print(book.find_persion('Mary').home_number)
print(p)
print('--------')
import debug.phonebook as phonebook
p = phonebook.Persion('Mary')
print(p)
p.home_number = '(123) 456-7890'
print(p)

def persion_str(self):
    return "Name: %s\nHome: %s" % (self.name, self.home_number)

phonebook.Persion.__str__ = persion_str
p = phonebook.Persion()
p.name = "Chris"
p.home_number = "(123) 456-7890"
print (p)

book = phonebook.PhoneBook()

class PyPersionWithCell(phonebook.Persion):
    def get_cell_number(self):
        return self.cell
    def set_cell_number(self, n):
        cell = n
    celll_number = property(get_cell_number, set_cell_number)

p = PyPersionWithCell()
p.name = 'Martin'
p.home_number = '(123) 456-7890'
p.celll_number = '(123) 097-2134'
p2 = book.find_persion('Martin')
print(p2)

執行pythony就可以看見結果啦!

python import的用法

沒有留言:

import as

import 資料夾.python檔名 as 命名
import python檔名 as 命名

from import

from 資料夾.python檔名 import Class名稱

混合使用

from 資料夾.python檔名 import Class名稱 as 命名

Django//1.7版教學+1.8版的程式遇到的困難之一

沒有留言:
頭一個遇到的困難,就是靜態網頁放置的放置找不到。
在這篇的教學中,是教我們這麼做
# mysite/settings.py

TEMPLATE_DIRS = (
    os.path.join(BASE_DIR, 'templates').replace('\\', '/'),
)
但是如果真的這樣寫的話,就會在Browser上發生,找不到Template的問題。
出錯的檔案會提示在Exception Location上。如果它不是你寫的code,那就看看Exception Value。

上網找一下問題之後,找到另一篇是這麼寫的。
# mysite/settings.py
#找到這一段
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, 'templates'), #加入這一行
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
因為Django的1.7版和1.8版的差異,所以1.8版會找到TEMPLATES 並且要在DIR中加入路徑。
1.7的話就要自己新增TEMPLATE_DIRS。

我想就是要讓使用上更好上手吧?畢竟1.8的設計有提示你可以加入TEMPLATES的DIR,而1.7的,卻是要靠教學,無中生有的keyin出一段設定出來。

不過為了避免跟著這一篇教學一直卡關,我已經把1.8的Django改成1.7了!先學會再說呀!><

python WebService//在Ubuntu安裝Django

沒有留言:
開開心心的Google了一本教學來看,結果不是很順利,研究了一下才知道....

在Ubuntu安裝Django,有幾件事要注意
  1. 安裝python3,不可以刪掉python2
  2. 建利虛擬環境的 python3 -m venv VENV 不會順利Work

跟著國外的教學,順利唷!
它補足了上一篇缺的問題解決。
順利的把python的模擬環境功能(我也不知道是什麼)更新得可以work了。
  1. sudo apt-get update  #更新Ubuntu的更新內容
  2. sudo apt-get install python3-pip #更新python package manager(python3版)
  3. sudo pip3 install django  #從pip更新django(python3版)
  4. django-admin --version  #查看目前django的版本(也可以看是不是有順利裝好)

Build用sublime Text,無顯示!!

沒有留言:
使用Sublime Text當作python的編輯環境寫程式。
寫好,按下Ctrl+B,可以看見結果,相當的方便。

但是,有一天Build完,看不到結果?

把code改成print("---"),也沒有用,連這條線都不出現了?!
是Sublime Text發生了什麼問題嗎??還是怎麼了呢?

結果,是xxx.py檔,放在中文路徑之下[1]造成的!囧~

參考資料:
[1] 有哪位兄台用sublime text 编译过 python代码的?

用Sublime Text練習python

沒有留言:
先前,介紹過用g++和make可以直接在Sublime Text進行編譯、執行(不包含輸入行為)C++的code。

今天,來說說,如何執行python
不過,由於Sublime Text本身是由python而撰寫的,所以可以說這昧內建功能,只是怎麼使用呢?

先說一下,再也不用「IDLE開新檔案→打code→存檔→cmd執行」才能看見結果了!超棒的吧!^^

依下列步驟進行就知道怎麼回事了!

  1. 在Sublime Text中開新檔案
  2. 打python的code、存檔
  3. 在Sublime Text功能列找「Tool→Build System→Python」
  4. 就可以按下「Ctrl+B」或在Sublime Text功能列找「Tool→Build」
就可以在下方看見執行結果了!