統計與分析要有互相比較才有意義
比較越多 分析越正確, 對於觀察研究法尤其是如此
觀察研究法:先選定自己要當哪一群人
常常因果互想 正反推論
要知道觀察法的侷限性
利用 Python,R,Excel VBA,multicharts 自造決策中心,取得量化交易能力, 再利用資訊不對稱,站在對你有利的這邊。
2016年3月31日 星期四
2016年3月30日 星期三
[bash] check system CPU busy top 10, check sys memory status, monitor CPU usage every 2 sec
[check system CPU busy top 10]
list entire table
$ ps aux | sort -rk 3,3 | head -n 10
[Monitor the CPU usage every 2 sec]
watch "ps aux | sort -rk 3,3 | head -n 6"
[check sys memory status]
$ cat /proc/meminfo
MemTotal: 3918656 kB
MemFree: 1422332 kB
Buffers: 36868 kB
Cached: 929076 kB
SwapCached: 107124 kB
Active: 1166772 kB
Inactive: 1077372 kB
or you can check out ...
grep MemTotal /proc/meminfo | awk '{print $2}'
2016年3月29日 星期二
[python] python 3.x read excel xls file in list.
office doc
https://secure.simplistix.co.uk/svn/xlrd/trunk/xlrd/doc/xlrd.html?p=4966
https://secure.simplistix.co.uk/svn/xlrd/trunk/xlrd/doc/xlrd.html?p=4966
import xlrd
def open_file(path):
"""
Open and read an Excel file
"""
book = xlrd.open_workbook(path)
# print number of sheets
print book.nsheets
# print sheet names
print book.sheet_names()
# get the first worksheet
first_sheet = book.sheet_by_index(0)
# read a row
print first_sheet.row_values(0)
# get how many rows in this sheet
print first_sheet.nrows
# read a cell
cell = first_sheet.cell(0,0)
print cell
print cell.value
# read a row slice
print first_sheet.row_slice(rowx=0,
start_colx=0,
end_colx=2)
return
[python] python 3.4 install xlrd to handle excel .xls file.
$ sudo gedit /etc/apt/sources.list
add below
deb http://us.archive.ubuntu.com/ubuntu vivid main universe
save
then
$ sudo apt-get update
$sudo apt-get install python3-xlrd
----------------------------------------------------------------------
check the doc
https://secure.simplistix.co.uk/svn/xlrd/trunk/xlrd/doc/xlrd.html?p=4966
[python] python 3.x install pandas under Ubuntu 14.04
$ sudo apt-get install python3-pandas
detail: http://pandas.pydata.org/pandas-docs/stable/install.html
Installing using your Linux distribution’s package manager.
The commands in this table will install pandas for Python 2 from your distribution. To install pandas for Python 3 you may need to use the package python3-pandas.Distribution | Status | Download / Repository Link | Install method |
---|---|---|---|
Debian | stable | official Debian repository | sudo apt-get install python-pandas |
Debian & Ubuntu | unstable (latest packages) | NeuroDebian | sudo apt-get install python-pandas |
Ubuntu | stable | official Ubuntu repository | sudo apt-get install python-pandas |
Ubuntu | unstable (daily builds) | PythonXY PPA; activate by: sudo add-apt-repository ppa:pythonxy/pythonxy-devel && sudo apt-get update | sudo apt-get install python-pandas |
OpenSuse & Fedora | stable | OpenSuse Repository | zypper in python-pandas |
[python] 計算日期 min , Max 和求 日期差距(含假日), check the date is what day of the week (or weekend)
from datetime import *
# create a date( ) list
datetime_list=[date(2016,6,30),date(2016,6,31).............]
print(min(datetime_list),max(datetime_list))
delta_days=max(datetime_list)-min(datetime_list)
print(delta_days.days)
delta_days=date(2016,3,28)-date(2016,3,21)
print(delta_days.days)
#------------- check the date is what day of the week-----------------------------------------
dt=date(2016,3,20)
if dt.isoweekday()==6 or dt.isoweekday()==7:
print('do someting')
detail: https://docs.python.org/2/library/datetime.html
# create a date( ) list
datetime_list=[date(2016,6,30),date(2016,6,31).............]
print(min(datetime_list),max(datetime_list))
delta_days=max(datetime_list)-min(datetime_list)
print(delta_days.days)
delta_days=date(2016,3,28)-date(2016,3,21)
print(delta_days.days)
#------------- check the date is what day of the week-----------------------------------------
dt=date(2016,3,20)
if dt.isoweekday()==6 or dt.isoweekday()==7:
print('do someting')
detail: https://docs.python.org/2/library/datetime.html
[IDE] Sublime text 3 Jump to definition and back with ctrl+ mouse left click. Ubuntu/Mac/Windows
Ubuntu:
create "Default (Linux).sublime-mousemap"
in ~/.config/sublime-text-3/Packages/User
Mac:
create "Default (OSX).sublime-mousemap" in ~/Library/Application Support/Sublime Text 3/Packages/User
Windows
create "Default (Windows).sublime-mousemap" in %appdata%\Sublime Text 3\Packages\User
pasted below into the file you just created.
[ { "button": "button1", "count": 1, "modifiers": ["ctrl"], "press_command": "drag_select", "command": "goto_definition" }, { "button": "button2", "count": 1, "modifiers": ["ctrl"], "press_command": "jump_back", "command": "jump_back" } ]
save. restart sublime text3
Then you can press ctrl then click a function to jump to definition,
and press right click will jump back.
2016年3月27日 星期日
[python] python 用 matplotlib 畫出散點圖 scatter 筆記, 標記上點的text
matplotlib 提供能畫的種類
http://matplotlib.org/gallery.html
source code example included.
============================
import matplotlib.pyplot as plt
import numpy as np
#find max under list of list, sublist[x] means the target column
def max_value_lol(inputlist,target_column):
return max([sublist[target_column] for sublist in inputlist])
#畫出上下兩個圖根據不同data欄位, data is list of list , head_title is list for title
def data_Visualization(head_title,data):
#print(max_value((data)))
max_submit_times=max_value_lol(data,1)
point_scale=6
#print(len(data))
fig=plt.figure(figsize=(6,4))
ax=fig.add_subplot(211)
N = len(data)
for item in data :
x = float(item[6])
y = float(item[7])
colors = np.random.rand(N)
area = np.pi * (15 * (x+y)/2)**2
#add wording besides the points
ax.text(x, y, item[0])
#area = np.pi * (15 * (item[1]/max_submit_times)*point_scale)**2 # 0 to 15 point radiuses
plt.scatter(x, y, s=area, c=colors, alpha=0.5)
plt.xlabel(head_title[6])
plt.ylabel(head_title[7])
plt.xlim(-0.2,float (max_value_lol(data,6))+0.2)
plt.ylim(-0.2,float (max_value_lol(data,7))+0.2)
#plt.legend()
#second pic
ax=fig.add_subplot(212)
for item in data :
x = float(item[8])
y = float(item[9])
colors = np.random.rand(N)
area = np.pi * (15 * (float(item[8])+float(item[9]))/15)**2
#area = np.pi * (15 * (item[1]/max_submit_times)*point_scale)**2 # 0 to 15 point radiuses
plt.scatter(x, y, s=area, c=colors, alpha=0.5)
plt.xlabel(head_title[8])
plt.ylabel(head_title[9])
plt.xlim(-0.2,float (max_value_lol(data,8))+1)
plt.ylim(-0.2,float (max_value_lol(data,9))+5)
plt.show()
return
=====================
http://matplotlib.org/gallery.html
source code example included.
============================
import matplotlib.pyplot as plt
import numpy as np
#find max under list of list, sublist[x] means the target column
def max_value_lol(inputlist,target_column):
return max([sublist[target_column] for sublist in inputlist])
#畫出上下兩個圖根據不同data欄位, data is list of list , head_title is list for title
def data_Visualization(head_title,data):
#print(max_value((data)))
max_submit_times=max_value_lol(data,1)
point_scale=6
#print(len(data))
fig=plt.figure(figsize=(6,4))
ax=fig.add_subplot(211)
N = len(data)
for item in data :
x = float(item[6])
y = float(item[7])
colors = np.random.rand(N)
area = np.pi * (15 * (x+y)/2)**2
#add wording besides the points
ax.text(x, y, item[0])
#area = np.pi * (15 * (item[1]/max_submit_times)*point_scale)**2 # 0 to 15 point radiuses
plt.scatter(x, y, s=area, c=colors, alpha=0.5)
plt.xlabel(head_title[6])
plt.ylabel(head_title[7])
plt.xlim(-0.2,float (max_value_lol(data,6))+0.2)
plt.ylim(-0.2,float (max_value_lol(data,7))+0.2)
#plt.legend()
#second pic
ax=fig.add_subplot(212)
for item in data :
x = float(item[8])
y = float(item[9])
colors = np.random.rand(N)
area = np.pi * (15 * (float(item[8])+float(item[9]))/15)**2
#area = np.pi * (15 * (item[1]/max_submit_times)*point_scale)**2 # 0 to 15 point radiuses
plt.scatter(x, y, s=area, c=colors, alpha=0.5)
plt.xlabel(head_title[8])
plt.ylabel(head_title[9])
plt.xlim(-0.2,float (max_value_lol(data,8))+1)
plt.ylim(-0.2,float (max_value_lol(data,9))+5)
plt.show()
return
=====================
[python][data_Visualization] python 3.x install matplotlib under ubuntu 14.04
check matplotlib still here.
$ apt-cache search python3-matplotlib
If you find it like its available then you can install it from
$ sudo apt-get install python3-matplotlib
good to go
---------------
Check what you like.
http://matplotlib.org/gallery.html
---------------
Check what you like.
http://matplotlib.org/gallery.html
2016年3月25日 星期五
[python] python 3.x 抽象型別介紹(2) list MutableSequence Sequence 方法比較
print(dir(Sized))
['__abstractmethods__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '_abc_cache', '_abc_negative_cache', '_abc_negative_cache_version', '_abc_registry']
[Finished in 0.0s]
print(dir(Container))
['__abstractmethods__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '_abc_cache', '_abc_negative_cache', '_abc_negative_cache_version', '_abc_registry']
[Finished in 0.0s]
print(dir(Iterable))
['__abstractmethods__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '_abc_cache', '_abc_negative_cache', '_abc_negative_cache_version', '_abc_registry']
[Finished in 0.0s]
print(dir(Sequence))
['__abstractmethods__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '_abc_cache', '_abc_negative_cache', '_abc_negative_cache_version', '_abc_registry', 'count', 'index']
[Finished in 0.0s]
print(dir(MutableSequence))
['__abstractmethods__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__setattr__', '__setitem__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '_abc_cache', '_abc_negative_cache', '_abc_negative_cache_version', '_abc_registry', 'append', 'clear', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse']
[Finished in 0.0s]
li=[1,2]
print(dir(li))
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
[Finished in 0.0s]
應該列成excel 來橫向比較比較好看
['__abstractmethods__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '_abc_cache', '_abc_negative_cache', '_abc_negative_cache_version', '_abc_registry']
[Finished in 0.0s]
print(dir(Container))
['__abstractmethods__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '_abc_cache', '_abc_negative_cache', '_abc_negative_cache_version', '_abc_registry']
[Finished in 0.0s]
print(dir(Iterable))
['__abstractmethods__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '_abc_cache', '_abc_negative_cache', '_abc_negative_cache_version', '_abc_registry']
[Finished in 0.0s]
print(dir(Sequence))
['__abstractmethods__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '_abc_cache', '_abc_negative_cache', '_abc_negative_cache_version', '_abc_registry', 'count', 'index']
[Finished in 0.0s]
print(dir(MutableSequence))
['__abstractmethods__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__setattr__', '__setitem__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '_abc_cache', '_abc_negative_cache', '_abc_negative_cache_version', '_abc_registry', 'append', 'clear', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse']
[Finished in 0.0s]
li=[1,2]
print(dir(li))
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
[Finished in 0.0s]
應該列成excel 來橫向比較比較好看
[python] python 3.4 抽象型別介紹, 實作範例
Part1:
int 是一個type (型別), list 也是一個型別(type), 而各自不同的type 有自己能使用的method, 方法就如同前幾篇印出來看的結果.
現在, Sequence 是一個型別(type), 當然自己也有自己能用的方法.
但是, list, int 或 str... 等等這種型別, 可以自己產生物件,
ex: a=[1,2,3] => 產生了一個list 物件
ex: t=(1,2,3) =>產生了tuple 物件
而 Sequence 無法產生一個實體物件 => 因此只能算是一個抽象的型別, 概念性的, 不能真的拿來用的型別.
那你會問說, 不能用的Sequence 是要作甚呢?他就像一張賽車的設計藍圖
在Sequence的藍圖中, 畫出了賽車車輪的位置和大小, 畫出了座位的樣子等等等
但是並沒有實際的寫上細節, 沒有真正要用哪些廠牌的資訊, 因為這些細節和實際
製作的工法, 就留給那到藍圖的下游廠商去作就好, 所以換言之, 下游廠商如果接了這個
案子, 就要照著Sequence 的設計藍圖製造, 但是細節由自己決定, 可是不能有少, 否則就
沒有照這個設計圖走了.
所以, 那最源頭的抽象型別是誰呢?我們可以在 Collections Abstract Base Classes,
(https://docs.python.org/3/library/collections.abc.html)
抽象型別的集合中, 看到所有python 定義的抽象型別列表, 如下 (放在collections.abc)
舉例來看, 在ABC這欄, 有個Sized, 也就是說, python 想營造出一個抽象的東西,
希望能夠處裡有關大小的事情, 所以我的藍圖裡想要有這個概念,
而他右邊那攔 inherits from 是沒有填, 代表Sized 這個概念是原創, 他是第一個頭,
在右邊那攔有個abstracts methods, 他填的是 __len__, 就是說, 希望後人在處裡
有關Sized 的概念時, 請將實作的function 做在__len__裡面, 所以之後, 只要想要找有關
大小的訊息時, 就去你的__len__找, 才不會大家function 名稱不一樣, 搞的亂七八糟的.
另外一個 ABC攔中的 Container 也是類似的, 就是他有個概念是, 我想要找出甚東西
包含在其中, 希望後人們能提供這個方法, 因為還蠻常用的,而你們後人要實作的話
請作在__contains__ 裡面.
那現在看Sequencs , 他繼承了 Sized, Container, Iterable, 這三個人, 所以一定會有
這三個人當初要求要作的方法,但他自己又加入了__getitem__ __len__,這兩個抽象方法
意思是說, 我序列這種類別, 將會提供sized, container, iterable, 和 getitem, len 的方法
如果你要繼承我, 之後你得做出這些東西, 而你看到 __len__不是Sized 裡面就有嗎?
怎又出現在Sequences 的 抽象方法中呢?那是因為 他仍然沒有實作, 繼續擺著, 希望後面的人能作, 而最右邊 Mixin Method, 告訴你, 我還加進了這些方法(已經做好你可以用).
而MutableSequence , 又繼承了Sequence 但列出了一些抽象型別, 等著給別人實作
__getitem__, __setitem__, __delitem__, ...等, 而可用的方法除了繼承了 Sequence
已經有的, 又加入了 append, reversed ,....等等等
這個MutableSequence 抽象型別, 也就是常聽到的[可變序列], 而list , str 都在他的下面,
所以 也就是說, list 得實作這一連串的方法, 加上list 自己想提供的方法, 而 tuple ,
因為是設計來用為不可改變的物件, 當然就不會去繼承 MutableSequence了, 但他仍然
是個序列相關的物件, 所以可見得, tuple 一定是在sequence 之下, 但實際上,
中間還有一層tuple 物件, 而 真正我們在用的實體tuple 是tuple 物件的實作.
you can use it to print the abstract class tree.
def classtree(cls):
print(cls.__bases__)
c = list(cls.__bases__)
for base in c:
c.extend(classtree(base))
return c
classtree(MutableSequence)
output:
(<class 'collections.abc.Sequence'>,)
(<class 'collections.abc.Sized'>, <class 'collections.abc.Iterable'>, <class 'collections.abc.Container'>)
(<class 'object'>,) #最上層了
..... #not import so I do not pasted it.
ps. 可以利用 isinstance 看是不是誰的實作, 還有issubclass 看是不是誰的子類別
li=[1,2]
t=(3,4)
print ("---check instance---")
print(isinstance(li,list), isinstance(t,tuple))
print(isinstance(li,Sequence), isinstance(t,Sequence))
print(isinstance(li,MutableSequence), isinstance(t,MutableSequence))
print ("---check list and class level---")
print(type(li),type(t))
print(issubclass(list,MutableSequence),issubclass(MutableSequence,list))
print(issubclass(MutableSequence,Sequence),issubclass(Sequence,MutableSequence))
print(issubclass(Sequence,Sized))
print ("---check tuple and class level---")
print(type(li),type(t))
print(issubclass(tuple,MutableSequence),issubclass(MutableSequence,tuple))
print(issubclass(tuple,Sequence),issubclass(Sequence,tuple))
print(issubclass(Sequence,Sized))
output:
---check instance---
True True
True True
True False
---check list and class level---
<class 'list'> <class 'tuple'>
True False
True False
True
---check tuple and class level---
<class 'list'> <class 'tuple'>
False False
True False
True
[Finished in 0.0s]
Part2 :
假設你要實作一個Set 的實體instance, 就只要實作 __contains__, __iter__,__len__
(如表格所示), 而其他Mixin Method 都是python 已經幫我們作好的, 直接可以用了.
所以下面的code, 要實作這三個 (init 本來自己就要), 而也看到, and 直接可以用了.
from collections.abc import *
int 是一個type (型別), list 也是一個型別(type), 而各自不同的type 有自己能使用的method, 方法就如同前幾篇印出來看的結果.
現在, Sequence 是一個型別(type), 當然自己也有自己能用的方法.
但是, list, int 或 str... 等等這種型別, 可以自己產生物件,
ex: a=[1,2,3] => 產生了一個list 物件
ex: t=(1,2,3) =>產生了tuple 物件
而 Sequence 無法產生一個實體物件 => 因此只能算是一個抽象的型別, 概念性的, 不能真的拿來用的型別.
那你會問說, 不能用的Sequence 是要作甚呢?他就像一張賽車的設計藍圖
在Sequence的藍圖中, 畫出了賽車車輪的位置和大小, 畫出了座位的樣子等等等
但是並沒有實際的寫上細節, 沒有真正要用哪些廠牌的資訊, 因為這些細節和實際
製作的工法, 就留給那到藍圖的下游廠商去作就好, 所以換言之, 下游廠商如果接了這個
案子, 就要照著Sequence 的設計藍圖製造, 但是細節由自己決定, 可是不能有少, 否則就
沒有照這個設計圖走了.
所以, 那最源頭的抽象型別是誰呢?我們可以在 Collections Abstract Base Classes,
(https://docs.python.org/3/library/collections.abc.html)
抽象型別的集合中, 看到所有python 定義的抽象型別列表, 如下 (放在collections.abc)
ABC | Inherits from | Abstract Methods | Mixin Methods |
---|---|---|---|
Container |
__contains__ |
||
Hashable |
__hash__ |
||
Iterable |
__iter__ |
||
Iterator |
Iterable |
__next__ |
__iter__ |
Generator |
Iterator |
send , throw |
close , __iter__ , __next__ |
Sized |
__len__ |
||
Callable |
__call__ |
||
Sequence |
Sized ,
Iterable ,
Container |
__getitem__ ,
__len__ |
__contains__ , __iter__ , __reversed__ ,
index , and count |
MutableSequence |
Sequence |
__getitem__ ,
__setitem__ ,
__delitem__ ,
__len__ ,
insert |
Inherited Sequence methods and
append , reverse , extend , pop ,
remove , and __iadd__ |
Set |
Sized ,
Iterable ,
Container |
__contains__ ,
__iter__ ,
__len__ |
__le__ , __lt__ , __eq__ , __ne__ ,
__gt__ , __ge__ , __and__ , __or__ ,
__sub__ , __xor__ , and isdisjoint |
MutableSet |
Set |
__contains__ ,
__iter__ ,
__len__ ,
add ,
discard |
Inherited Set methods and
clear , pop , remove , __ior__ ,
__iand__ , __ixor__ , and __isub__ |
Mapping |
Sized ,
Iterable ,
Container |
__getitem__ ,
__iter__ ,
__len__ |
__contains__ , keys , items , values ,
get , __eq__ , and __ne__ |
MutableMapping |
Mapping |
__getitem__ ,
__setitem__ ,
__delitem__ ,
__iter__ ,
__len__ |
Inherited Mapping methods and
pop , popitem , clear , update ,
and setdefault |
MappingView |
Sized |
__len__ |
|
ItemsView |
MappingView ,
Set |
__contains__ ,
__iter__ |
|
KeysView |
MappingView ,
Set |
__contains__ ,
__iter__ |
|
ValuesView |
MappingView |
__contains__ , __iter__ |
|
Awaitable |
__await__ |
||
Coroutine |
Awaitable |
send , throw |
close |
AsyncIterable |
__aiter__ |
||
AsyncIterator |
AsyncIterable |
__anext__ |
__aiter__ |
舉例來看, 在ABC這欄, 有個Sized, 也就是說, python 想營造出一個抽象的東西,
希望能夠處裡有關大小的事情, 所以我的藍圖裡想要有這個概念,
而他右邊那攔 inherits from 是沒有填, 代表Sized 這個概念是原創, 他是第一個頭,
在右邊那攔有個abstracts methods, 他填的是 __len__, 就是說, 希望後人在處裡
有關Sized 的概念時, 請將實作的function 做在__len__裡面, 所以之後, 只要想要找有關
大小的訊息時, 就去你的__len__找, 才不會大家function 名稱不一樣, 搞的亂七八糟的.
另外一個 ABC攔中的 Container 也是類似的, 就是他有個概念是, 我想要找出甚東西
包含在其中, 希望後人們能提供這個方法, 因為還蠻常用的,而你們後人要實作的話
請作在__contains__ 裡面.
那現在看Sequencs , 他繼承了 Sized, Container, Iterable, 這三個人, 所以一定會有
這三個人當初要求要作的方法,但他自己又加入了__getitem__ __len__,這兩個抽象方法
意思是說, 我序列這種類別, 將會提供sized, container, iterable, 和 getitem, len 的方法
如果你要繼承我, 之後你得做出這些東西, 而你看到 __len__不是Sized 裡面就有嗎?
怎又出現在Sequences 的 抽象方法中呢?那是因為 他仍然沒有實作, 繼續擺著, 希望後面的人能作, 而最右邊 Mixin Method, 告訴你, 我還加進了這些方法(已經做好你可以用).
而MutableSequence , 又繼承了Sequence 但列出了一些抽象型別, 等著給別人實作
__getitem__, __setitem__, __delitem__, ...等, 而可用的方法除了繼承了 Sequence
已經有的, 又加入了 append, reversed ,....等等等
這個MutableSequence 抽象型別, 也就是常聽到的[可變序列], 而list , str 都在他的下面,
所以 也就是說, list 得實作這一連串的方法, 加上list 自己想提供的方法, 而 tuple ,
因為是設計來用為不可改變的物件, 當然就不會去繼承 MutableSequence了, 但他仍然
是個序列相關的物件, 所以可見得, tuple 一定是在sequence 之下, 但實際上,
中間還有一層tuple 物件, 而 真正我們在用的實體tuple 是tuple 物件的實作.
you can use it to print the abstract class tree.
def classtree(cls):
print(cls.__bases__)
c = list(cls.__bases__)
for base in c:
c.extend(classtree(base))
return c
classtree(MutableSequence)
output:
(<class 'collections.abc.Sequence'>,)
(<class 'collections.abc.Sized'>, <class 'collections.abc.Iterable'>, <class 'collections.abc.Container'>)
(<class 'object'>,) #最上層了
..... #not import so I do not pasted it.
ps. 可以利用 isinstance 看是不是誰的實作, 還有issubclass 看是不是誰的子類別
li=[1,2]
t=(3,4)
print ("---check instance---")
print(isinstance(li,list), isinstance(t,tuple))
print(isinstance(li,Sequence), isinstance(t,Sequence))
print(isinstance(li,MutableSequence), isinstance(t,MutableSequence))
print ("---check list and class level---")
print(type(li),type(t))
print(issubclass(list,MutableSequence),issubclass(MutableSequence,list))
print(issubclass(MutableSequence,Sequence),issubclass(Sequence,MutableSequence))
print(issubclass(Sequence,Sized))
print ("---check tuple and class level---")
print(type(li),type(t))
print(issubclass(tuple,MutableSequence),issubclass(MutableSequence,tuple))
print(issubclass(tuple,Sequence),issubclass(Sequence,tuple))
print(issubclass(Sequence,Sized))
output:
---check instance---
True True
True True
True False
---check list and class level---
<class 'list'> <class 'tuple'>
True False
True False
True
---check tuple and class level---
<class 'list'> <class 'tuple'>
False False
True False
True
[Finished in 0.0s]
Part2 :
假設你要實作一個Set 的實體instance, 就只要實作 __contains__, __iter__,__len__
(如表格所示), 而其他Mixin Method 都是python 已經幫我們作好的, 直接可以用了.
所以下面的code, 要實作這三個 (init 本來自己就要), 而也看到, and 直接可以用了.
from collections.abc import *
li=[9,1,2]
class ListBasedSet(Set):
''' Alternate set implementation favoring space over speed
and not requiring the set elements to be hashable. '''
def __init__(self, iterable):
self.elements = lst = []
for value in iterable:
if value not in lst:
lst.append(value)
def __iter__(self):
return iter(self.elements)
def __contains__(self, value):
return value in self.elements
def __len__(self):
return len(self.elements) #你在後面+ 100 , s1 印出來值也會變, 可見得真的是跑你作的這邊
s1 = len(ListBasedSet(li)) #拿你實作的來用用看
print(s1)
for x in ListBasedSet(li):
print(x)
#你發現 & 不用實作, 直接可以用,因為 __and__在Mixin Method 裡面已經註明他做好了
for x in (ListBasedSet('abcdef') & ListBasedSet('defwxyz')):
print(x)
output:
3
9
1
2
d e f [Finished in 0.1s]
2016年3月23日 星期三
[python] python 3.x 新手的一些小觀念 (tuple, 三元運算子,型別物件 type object )
(0) #是一個整數 0 的 int 物件
(0,)#是一個有一個元素是0的tuple物件
--------------------------------
三元運算子(x if y > 0 else z)=>如果 y 對, 走x, y錯 走z
x,y,z=3,-1,6
print(x if y>0 else z)
x,y,z=3,6,6
print(x if y>0 else z)
6
3
[Finished in 0.1s]
--------------------------------------------------
type is an object also
型別也是一個物件(所以可以assign給別人), 叫做物件型別
ex:
a=3 #a is assigned to int object, value=3
print (type(a)) #the type is int
=><class 'int'>
# type(a) return a type, and type also is an object , so it can assign to atype.
# so we still can check the type of atype.
#which means we will see the return type of type(a)
atype=type(a)
print(type(atype))
=><class 'type'>
# and it shows <class 'type'>, which means we got a object named type.
[python] python 3.4 print out all method inside object
list
ex:
a=[1,2]
print (dir(a))
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
[Finished in 0.1s]
------------------------
int
a=3
print (dir(a))
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
[Finished in 0.1s]
---------------------
dict
a={3,}
print (dir(a))
['__and__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__iand__', '__init__', '__ior__', '__isub__', '__iter__', '__ixor__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__', '__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__xor__', 'add', 'clear', 'copy', 'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint', 'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference', 'symmetric_difference_update', 'union', 'update']
[Finished in 0.1s]
print(dir(str))
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
[Finished in 0.1s]
****
you can find all type of object has __str__ method, that why print() can
print out all kind of object. (print() can only print string type.)
a=3
print(a) # in fact is => print(a.__str__())
all __class__ which be used equal to type()
=> type(a) = a.__class__
ex:
a=[1,2]
print (dir(a))
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
[Finished in 0.1s]
------------------------
int
a=3
print (dir(a))
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
[Finished in 0.1s]
---------------------
dict
a={3,}
print (dir(a))
['__and__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__iand__', '__init__', '__ior__', '__isub__', '__iter__', '__ixor__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__', '__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__xor__', 'add', 'clear', 'copy', 'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint', 'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference', 'symmetric_difference_update', 'union', 'update']
[Finished in 0.1s]
print(dir(str))
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
[Finished in 0.1s]
****
you can find all type of object has __str__ method, that why print() can
print out all kind of object. (print() can only print string type.)
a=3
print(a) # in fact is => print(a.__str__())
all __class__ which be used equal to type()
=> type(a) = a.__class__
[python] python 3.4 method 方法解釋 (print out all methods inside an object)
之前說過在python 中
a=5 這行
其中
a 是名稱
5 是一個整數type 的物件
而 這裡要講的方法 (method) 就是
=>這個物件裡可以使用的function.
引用的方式是 「物件.方法名稱(帶入參數 if needed)」
ex: a.len() 就是引用int 物件中的 len() 方法
a=[1,2]
a.append(3) 表示用a.append() 這個fun, 帶入3, 就是把3加入原本a list 物件的尾巴
所以
1.不同型別的物件, 有已經存在的方法(利用dir(物件) 可以印出來看有哪些可用)
ex:
a=[1,2] #list
print (dir(a))
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
[Finished in 0.1s]
2.build in function 也是一種方法
ex:
a=[1,2,3]
原本用內建fun求長度
len(a)
直譯器看到會轉成
a.__len()__
來作, 所以其實build in function, 是去找當下的物件的method來實作
3.運算子 也是一種方法 ex: + - * /
ex: x+y => x.__add__(y)
a=5 這行
其中
a 是名稱
5 是一個整數type 的物件
而 這裡要講的方法 (method) 就是
=>這個物件裡可以使用的function.
引用的方式是 「物件.方法名稱(帶入參數 if needed)」
ex: a.len() 就是引用int 物件中的 len() 方法
a=[1,2]
a.append(3) 表示用a.append() 這個fun, 帶入3, 就是把3加入原本a list 物件的尾巴
所以
1.不同型別的物件, 有已經存在的方法(利用dir(物件) 可以印出來看有哪些可用)
ex:
a=[1,2] #list
print (dir(a))
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
[Finished in 0.1s]
2.build in function 也是一種方法
ex:
a=[1,2,3]
原本用內建fun求長度
len(a)
直譯器看到會轉成
a.__len()__
來作, 所以其實build in function, 是去找當下的物件的method來實作
3.運算子 也是一種方法 ex: + - * /
ex: x+y => x.__add__(y)
[python] python 3.x 名稱,與動態型別解釋, 多型(Polymorphism)機制
[結論]: python 中任何東西都是物件(object)
[觀念一]
型別(type)是放在物件(object)身上, 而不是加諸在變數名稱(name)身上 =>造成動態型別
在python 中
當你 a=5 時
他會先建立一個a
1.此時 , a 只是個名稱(name), 沒有任何型別的意義在裡面
接著
2.建立一個5的int 物件(object) , 再把a 指向 5這個type是int的物件 (這一步就叫做:綁定 binding)
由上面例子可以知道, 所以 變數名稱 a 跟 物件的型別(type) 完全沒有關係
a 先建立起來, 當時是沒有任何型別資訊的, 也就是說,
當你有一個 名稱(無論是a or b or xxx )在手上時, 他右邊是誰無所謂, 因為他之後隨時
可以被一直assign 給不同的右邊物件, 可能一下是int , 一下是list (稱為動態型別)
a=3
a=[1,2,3]
所以, 在python 中, 型別是放在 物件身上, 而不是加諸在名稱身上, 跟我們傳統的C 不同.
傳統的c 是 宣告變數名稱時, 就要指定型別.
ex:
int C ;
所以,在python
一個名稱中,可以有不同的型別物件
a=['abc',5,4.33,[6,6],'string']
[觀念二] 由於動態型別的現象, 造成多型(Polymorphism)機制
當 a=a+b 時, 因為只有在"執行"時, 才知道真正a, b 是怎樣的型別,
他要去對應作不同的 + , 而有不同的機制, 我們稱為多型.
ex: 如果 a ,b 是 int, 那 + 就只是單純數學相加, 但如果 a b 是字串,
那加就會變成 字串相接.
[結論] 所以不管你命名了怎樣的名稱, 其實都是想要運作右邊的物件,因此得到
在python 中, 其實所有東西都是物件在互動, 名稱只算是個代言人而已.
[觀念一]
型別(type)是放在物件(object)身上, 而不是加諸在變數名稱(name)身上 =>造成動態型別
在python 中
當你 a=5 時
他會先建立一個a
1.此時 , a 只是個名稱(name), 沒有任何型別的意義在裡面
接著
2.建立一個5的int 物件(object) , 再把a 指向 5這個type是int的物件 (這一步就叫做:綁定 binding)
由上面例子可以知道, 所以 變數名稱 a 跟 物件的型別(type) 完全沒有關係
a 先建立起來, 當時是沒有任何型別資訊的, 也就是說,
當你有一個 名稱(無論是a or b or xxx )在手上時, 他右邊是誰無所謂, 因為他之後隨時
可以被一直assign 給不同的右邊物件, 可能一下是int , 一下是list (稱為動態型別)
a=3
a=[1,2,3]
所以, 在python 中, 型別是放在 物件身上, 而不是加諸在名稱身上, 跟我們傳統的C 不同.
傳統的c 是 宣告變數名稱時, 就要指定型別.
ex:
int C ;
所以,在python
一個名稱中,可以有不同的型別物件
a=['abc',5,4.33,[6,6],'string']
[觀念二] 由於動態型別的現象, 造成多型(Polymorphism)機制
當 a=a+b 時, 因為只有在"執行"時, 才知道真正a, b 是怎樣的型別,
他要去對應作不同的 + , 而有不同的機制, 我們稱為多型.
ex: 如果 a ,b 是 int, 那 + 就只是單純數學相加, 但如果 a b 是字串,
那加就會變成 字串相接.
[結論] 所以不管你命名了怎樣的名稱, 其實都是想要運作右邊的物件,因此得到
在python 中, 其實所有東西都是物件在互動, 名稱只算是個代言人而已.
[python] python 3.4 in place change and is (原地修改 和 判斷是否為同一個物件)
#example code
a=b=c=[0,1,2] # a,b,c assign the same address of list
b=b+[3,4,5] # b will create new list to store the new list
c+=[97,98,99] # c is in place change
print(a,b,c)
print (a is b, a is c ) # use 'is' to check is the same object or not
output
[0, 1, 2, 97, 98, 99] [0, 1, 2, 3, 4, 5] [0, 1, 2, 97, 98, 99]
False True
[Finished in 0.0s]
a=b=c=[0,1,2] # a,b,c assign the same address of list
b=b+[3,4,5] # b will create new list to store the new list
c+=[97,98,99] # c is in place change
print(a,b,c)
print (a is b, a is c ) # use 'is' to check is the same object or not
output
[0, 1, 2, 97, 98, 99] [0, 1, 2, 3, 4, 5] [0, 1, 2, 97, 98, 99]
False True
[Finished in 0.0s]
[python] python 3.4 ubuntu 程式碼本身的編碼問題 SyntaxError: encoding problem
python 2.x default 編碼是 ASCII
python 3.x default 是 UTF-8
在撰寫程式碼本身時,如果根據你的python版本,打了不符合的編碼進去,會error.
ex:
# ¶Ù¡A§A¦n¶Ü¡H
print('there will be an error because above line.')
SyntaxError: Non-UTF-8 code starting with '\xb6' in file test.py on line 2, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
這是後在一開頭加入
# -*- coding:utf-8 -*-
重新build, 就ok了.
****
但不要誤會了, 加了這一行, 只是提醒編輯器在存檔的時候, 用這種編碼存檔, 但如果
你自己存檔時, 又在編輯器裡面選擇其他編碼, 當然還是會被蓋過去, 存成你在編輯器設定
裡的編碼.
python 3.x default 是 UTF-8
在撰寫程式碼本身時,如果根據你的python版本,打了不符合的編碼進去,會error.
ex:
# ¶Ù¡A§A¦n¶Ü¡H
print('there will be an error because above line.')
SyntaxError: Non-UTF-8 code starting with '\xb6' in file test.py on line 2, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
這是後在一開頭加入
# -*- coding:utf-8 -*-
重新build, 就ok了.
****
但不要誤會了, 加了這一行, 只是提醒編輯器在存檔的時候, 用這種編碼存檔, 但如果
你自己存檔時, 又在編輯器裡面選擇其他編碼, 當然還是會被蓋過去, 存成你在編輯器設定
裡的編碼.
[python] python 3.4 import 其他檔案的function, 和辨別是模組還是main. (模組名稱 __name__)
import 其他 python 檔案內的function 來用
在同一個資料夾下 建立下列兩個檔案
main.py, module.py
其中
main.py 內容是
-------------------------------------------------------------------------
import module as m
#module 就是檔案名稱 import近來後重新命名當m, 之後用m.xxx提取方法
print('Hello Python')
print('pi is ' + str(m.pi))
print('gcd of 24 and 16 is ' + str(m.add(24, 16)))
if __name__ == '__main__':
print('main as main program')
else:
print('main as module')
--------------------------------------------------------------------------
module.py 內容是
------------------------------------------------------------------------
pi = 3.14
def add(a, b):
a=a+b
return a
if __name__ == '__main__':
print('module as main program')
else:
print('module as module')
--------------------------------------------------------------------------------
去main 中 執行:
module as module
Hello Python
pi is 3.14
gcd of 24 and 16 is 40
main as main program
[Finished in 0.1s]
[python] build python3.4 under sublime text3; Ubuntu and windows
Go to sublime-text3
=>Tools =>build system =>New build system
past below content! and accroding your python ver
to change the command /usr/bin/env python3.x
#Mac
{
"cmd": ["/Library/Frameworks/Python.framework/Versions/3.4/bin/python3", "-u", "$file"],
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
"selector": "source.python"
}
#Ubuntu
{
"shell_cmd": "/usr/bin/env python3.4 ${file}",
"selector": "source.python",
"file_regex": "^(...*?):([0-9]*):?([0-9]*)",
"working_dir": "${file_path}",
}
or
#Windows
{
"cmd": ["C:\\Users\\user\\AppData\\Local\\Programs\\Python\\Python35-32\\python.exe", "-u", "$file"],
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
"selector": "source.python"
}
=========================
reopen sublime
go to build system, select ptyhon3.4 which the name you saved above
ctrl+B (Build)
=====================================
you can test it by
import sys
print("python ver.:" ,sys.version)
print sys.path #2.x is OK, because print is command at that time.
print (sys.path) #3.x is ok, print change to function.
=>Tools =>build system =>New build system
past below content! and accroding your python ver
to change the command /usr/bin/env python3.x
#Mac
{
"cmd": ["/Library/Frameworks/Python.framework/Versions/3.4/bin/python3", "-u", "$file"],
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
"selector": "source.python"
}
#Ubuntu
{
"shell_cmd": "/usr/bin/env python3.4 ${file}",
"selector": "source.python",
"file_regex": "^(...*?):([0-9]*):?([0-9]*)",
"working_dir": "${file_path}",
}
or
#Windows
{
"cmd": ["C:\\Users\\user\\AppData\\Local\\Programs\\Python\\Python35-32\\python.exe", "-u", "$file"],
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
"selector": "source.python"
}
=========================
reopen sublime
go to build system, select ptyhon3.4 which the name you saved above
ctrl+B (Build)
=====================================
you can test it by
import sys
print("python ver.:" ,sys.version)
print sys.path #2.x is OK, because print is command at that time.
print (sys.path) #3.x is ok, print change to function.
[python] python3.4.0 常用工具筆記
檢查python 你用的到底是在哪裡,還有版本
import sys
print (sys.path) #印出python 使用的路徑 來確定版本
print("python ver.:" ,sys.version) #印出使用版本
印出所有build in function, 看看哪些可用
print (dir(__builtins__))
利用type() 查詢物件型別
ex: type(3)
<class 'int'>
印出object 內含的method
a=[1,2,3]
print (dir(a))
2016年3月20日 星期日
[MySQL] MySQL UPDATE
將現有欄位中的資料內容,拆兩個字元,填入新的欄位
基本
UPDATE table_name SET column_name = newvalue;
ex:
UPDATE table_name SET new_column_name=RIGHT(original_column_name,2);
從目前的 original_column_name欄中的值,從右邊挑兩個位元出來,放數
new_column_name 中
基本
UPDATE table_name SET column_name = newvalue;
ex:
UPDATE table_name SET new_column_name=RIGHT(original_column_name,2);
從目前的 original_column_name欄中的值,從右邊挑兩個位元出來,放數
new_column_name 中
[MySQL] MySQL 常用 String function for CHAR ,VARCHAR
從某欄的值當中右邊數來2個字元所得到的資料
SELECT RIGHT(欄位名稱 , 2) FROM my_table;
SELECT LEFT(欄位名稱 , 2) FROM my_table;
選取第一個逗號前的所有內容
SELECT SUBSTRIJG_INDEX(欄位名稱, ',' , 1) From my_table;
選取一段字串,起始位置5,往後找3
SELECT SUBSTRING (your_string, 5 ,3) FROM table;
整組字串大小寫轉換
SELECT UPPER('string')
SELECT LOWER('string')
從左邊移除空白
SELECT LTRIM(' dog');
SELECT RTRIM('xxxx ');
回報字串長度
SELECT LENGTH('xxxxxx');
******
String Function 修改的是字串的copy, 原始資料不變。
SELECT RIGHT(欄位名稱 , 2) FROM my_table;
SELECT LEFT(欄位名稱 , 2) FROM my_table;
選取第一個逗號前的所有內容
SELECT SUBSTRIJG_INDEX(欄位名稱, ',' , 1) From my_table;
選取一段字串,起始位置5,往後找3
SELECT SUBSTRING (your_string, 5 ,3) FROM table;
整組字串大小寫轉換
SELECT UPPER('string')
SELECT LOWER('string')
從左邊移除空白
SELECT LTRIM(' dog');
SELECT RTRIM('xxxx ');
回報字串長度
SELECT LENGTH('xxxxxx');
******
String Function 修改的是字串的copy, 原始資料不變。
2016年3月19日 星期六
[MySQL] 1NF 資料正規化守則。
Rule1:
具單元性ATOMIC, 同一個欄位中,不會儲存好幾個類型相同的資料。
Ex: 有個欄位叫做興趣: 裡面有 游泳,看電影,打球。
除非這就是你想使用資料的最小單位,否則
全部放在一個欄位裡面,將無法準確搜尋。
Rule2:
需要具有單元性,且不會用好幾個欄位,儲存相同類型的資料。
ex: 你不該設計兩個不同名子的欄位而放類似的內容,像是
一個欄位叫做學生1,另一個叫做學生2,即便兩個學生的姓名是不同的,
但這違反了Rule2.
[MySQL] MySQL 常用方法(2) ALTER + MODIFY / CHANGE
新增primary key
ALTER TABLE my_table
ADD COLUMN contact_id INT NOT NULL AUTO_INCREMENT FIRST,
ADD PRIMARY KEY (contact_id);
將舊有的某欄位 改成primary key 來用,且將原本欄位名稱 name 改成 contact_id
ALTER TABLE my_table
CHANGE COLUMN name contact_id INT NOT NULL AUTO_INCREMENT FIRST,
ADD PRIMARY KEY (contact_id);
改table name
ALTER TABLE oldname RENAME TO new_table_name;
改變某一欄位的名稱 和資料型別
ALTER TABLE my_table
CHANGE COLUMU oldname new_name VARCHAR(100);
如果要連續改很多欄位 只要用, 接著就可以。
ALTER TABLE my_table
CHANGE COLUMU oldname new_name VARCHAR(100),
CHANGE COLUMU oldnameb new_nameb VARCHAR(30),
CHANGE COLUMU oldnamec new_namec VARCHAR(100);
NOTE: 如果資料型別改小,原本資料會被截斷。 varchar 100 -> 10 , 則裡面的string 可能會被截斷。造成資料遺失。
只想改動資料型別。不想換名稱時。
ALTER TABLE my_table
MODIFY COLUMN old)name VARCHAR(100);
想刪除某欄位
ALTER TABLE my_table
DROP COLUMN xxxx;
移除主鍵 primary key
ALTER TABLE your_table DROP PRIMARY KEY;
設定某欄為AUTO_INCREMENT
ALTER TABLE your_table CHANGE your_id your_id INT(11) NOT NULL AUTO_INCREMENT;
反之,刪除某欄的AUTO_INCREMENT
ALTER TABLE your_table CHANGE your_od your_id INT(11) NOT NULL;
*一個table 只能有一欄可以加上AUTO_INCREMENT,且為整數型別,不含NULL.
#######ALTER 小結
ALTER TABLE
以保持現有資料表內容為前提,修改資料表名稱或整體結構
ALTER ADD
把資料欄安插到表中指定的順序
ALTER DROP
從資料表中刪除資料欄
ALTER CHANGE
同時修改現有資料欄位名稱與型別
ALTER MODIFY
只修改型別
ALTER TABLE my_table
ADD COLUMN contact_id INT NOT NULL AUTO_INCREMENT FIRST,
ADD PRIMARY KEY (contact_id);
將舊有的某欄位 改成primary key 來用,且將原本欄位名稱 name 改成 contact_id
ALTER TABLE my_table
CHANGE COLUMN name contact_id INT NOT NULL AUTO_INCREMENT FIRST,
ADD PRIMARY KEY (contact_id);
改table name
ALTER TABLE oldname RENAME TO new_table_name;
改變某一欄位的名稱 和資料型別
ALTER TABLE my_table
CHANGE COLUMU oldname new_name VARCHAR(100);
如果要連續改很多欄位 只要用, 接著就可以。
ALTER TABLE my_table
CHANGE COLUMU oldname new_name VARCHAR(100),
CHANGE COLUMU oldnameb new_nameb VARCHAR(30),
CHANGE COLUMU oldnamec new_namec VARCHAR(100);
NOTE: 如果資料型別改小,原本資料會被截斷。 varchar 100 -> 10 , 則裡面的string 可能會被截斷。造成資料遺失。
只想改動資料型別。不想換名稱時。
ALTER TABLE my_table
MODIFY COLUMN old)name VARCHAR(100);
想刪除某欄位
ALTER TABLE my_table
DROP COLUMN xxxx;
移除主鍵 primary key
ALTER TABLE your_table DROP PRIMARY KEY;
設定某欄為AUTO_INCREMENT
ALTER TABLE your_table CHANGE your_id your_id INT(11) NOT NULL AUTO_INCREMENT;
反之,刪除某欄的AUTO_INCREMENT
ALTER TABLE your_table CHANGE your_od your_id INT(11) NOT NULL;
*一個table 只能有一欄可以加上AUTO_INCREMENT,且為整數型別,不含NULL.
#######ALTER 小結
ALTER TABLE
以保持現有資料表內容為前提,修改資料表名稱或整體結構
ALTER ADD
把資料欄安插到表中指定的順序
ALTER DROP
從資料表中刪除資料欄
ALTER CHANGE
同時修改現有資料欄位名稱與型別
ALTER MODIFY
只修改型別
[MySQL] 如何登入Ubuntu MySQL client.
MySQL server will be started automatically after the installation. You CANNOT start another instance! To check the mysqld process:
$ ps aux | grep mysqld
mysql 1113 0.0 0.3 484432 50024 ? Ssl 18:33 0:08 /usr/sbin/mysqld
To start a MySQL client:
$ mysql -u root -p
// Enter the password for the root user you have set when you install the server.
Once you loging your client, you can start CREATE DATABASE xxxx , and use others SQL commadn.
[MySQL] Ubuntu 14.04 刪除所有舊的MySQL, 並重新安裝。
[Delete old mysql, and reinstall the new one.]
delete old mysql
sudo apt-get autoremove --purge mysql-server-5.0
sudo apt-get remove mysql-server
sudo apt-get autoremove mysql-server
sudo apt-get remove mysql-common
clear the package.
dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P
Reinstall new server.
sudo apt-get install mysql-server
sudo apt-get install mysql-client
在剛才重新安裝的途中,他就會叫你設定root 密碼了。之後登入時會用到。
delete old mysql
sudo apt-get autoremove --purge mysql-server-5.0
sudo apt-get remove mysql-server
sudo apt-get autoremove mysql-server
sudo apt-get remove mysql-common
clear the package.
dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P
Reinstall new server.
sudo apt-get install mysql-server
sudo apt-get install mysql-client
在剛才重新安裝的途中,他就會叫你設定root 密碼了。之後登入時會用到。
[MySQL] MySQL 常用方法(1) CREATE, SHOW, INSERT INTO, WHERE, NOT, AND OR,SELECT,UPDATE
MySQL 常用方法。 Some quick tips.
CREATE, SHOW, INSERT INTO, WHERE, NOT, AND OR,SELECT,UPDATE
[Database 建立刪除相關]====
建立database
mysql>CREATE DATABASE database_name;
看看目前有哪些database了
mysql>show databases;
進去準備使用這個database
mysql>USE database_name;
[Table 建立刪除相關]====
建立table,
mysql>CREATE TABLE `table_info` (
`name` varchar(50) default NULL,
`last_seen` varchar(50) default NULL,
`appearance` varchar(50) default NULL,
`activities` varchar(50) DEFAULT 1.00 NOTNULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
ps.可以指定接受不接受NULL, 還有設定default值
show出目前所有database_name 下有的table 有哪些?
mysql>show tables;
show 出目前table_info的樣子
mysql>SELECT * FROM table_info;
刪除整個table
mysql> DROP TABLE table_info;
看看某個table 當初怎麼建立的
SHOW CREATE TABLE xxx_table;
[Table 操作]====
新增值(照著原本順序,直接用VALUES即可,不用再打欄位名稱。)
mysql>INSERT INTO table_info VALUES ('Pickles', 'Jack Green\'s party', 'M, orange hair, blue suit, huge feet','mime');
如果只要新增部分資料欄,那就要打出要新增的是哪一欄位。
INSERT INTO table_info
( name,last_seen)
VALUES
('Pickles', 'Jack Green\'s party');
選出你要的特定資料
挑出table內名子叫Paul的人,列出他在table中所以的欄位資訊。
SELECT * FROM my_table
WHERE name='Paul';
挑出table內名子叫Paul的人且體重要大於80,列出他在table中address, years 的欄位資訊。
SELECT address, years FROM my_table
WHERE name='Paul' AND weight>80;
LIKE 配合 % 和 _
找first_name 中,前面不管有多少字,結尾是ul 的。
SELECT first_name FROM my_table
WHERE first_name LIKE '%ul';
找first_name 中,前面只能有一個字,結尾是ul 的。
SELECT first_name FROM my_table
WHERE first_name LIKE '_ul';
挑出有含a , b, c ,d 的
挑出在my_table中,jobs 欄位是a, b, c, d 的人,並列出他的first_name.
SELECT first_name FROM my_table
WHERE jobs IN (a,b,c,d);
挑出在my_table中,jobs 欄位不是a, b, c, d 的人,並列出他的first_name.
SELECT first_name FROM my_table
WHERE jobs NOT IN (a,b,c,d);
IS NULL 可以用來檢查是否為NULL
SELECT * FROM my_tables
WHERE NOT main IS NULL.
或者,兩個用法都可。
SELECT * FROM my_tables
WHERE main NOT IS NULL.
AND / OR + NOT
WHERE +NOT
區間用 WHERE xxxx BETWEEN 小 AND 大
UPDATE + SET
把my_table 中,type欄位裡面的舊值改成新值
UPDATE my_table SET type='newvalue' WHERE type='oldvalue';
把my_table 中 name 叫做a, 或 b的商品 cost 都累加一。
UPDATE my_table SET cost=cost+1 WHERE name='a' OR drink_name='b';
CREATE, SHOW, INSERT INTO, WHERE, NOT, AND OR,SELECT,UPDATE
[Database 建立刪除相關]====
建立database
mysql>CREATE DATABASE database_name;
看看目前有哪些database了
mysql>show databases;
進去準備使用這個database
mysql>USE database_name;
[Table 建立刪除相關]====
建立table,
mysql>CREATE TABLE `table_info` (
`name` varchar(50) default NULL,
`last_seen` varchar(50) default NULL,
`appearance` varchar(50) default NULL,
`activities` varchar(50) DEFAULT 1.00 NOTNULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
ps.可以指定接受不接受NULL, 還有設定default值
show出目前所有database_name 下有的table 有哪些?
mysql>show tables;
show 出目前table_info的樣子
mysql>SELECT * FROM table_info;
刪除整個table
mysql> DROP TABLE table_info;
SHOW CREATE TABLE xxx_table;
[Table 操作]====
新增值(照著原本順序,直接用VALUES即可,不用再打欄位名稱。)
mysql>INSERT INTO table_info VALUES ('Pickles', 'Jack Green\'s party', 'M, orange hair, blue suit, huge feet','mime');
如果只要新增部分資料欄,那就要打出要新增的是哪一欄位。
INSERT INTO table_info
( name,last_seen)
VALUES
('Pickles', 'Jack Green\'s party');
選出你要的特定資料
挑出table內名子叫Paul的人,列出他在table中所以的欄位資訊。
SELECT * FROM my_table
WHERE name='Paul';
挑出table內名子叫Paul的人且體重要大於80,列出他在table中address, years 的欄位資訊。
SELECT address, years FROM my_table
WHERE name='Paul' AND weight>80;
LIKE 配合 % 和 _
找first_name 中,前面不管有多少字,結尾是ul 的。
SELECT first_name FROM my_table
WHERE first_name LIKE '%ul';
找first_name 中,前面只能有一個字,結尾是ul 的。
SELECT first_name FROM my_table
WHERE first_name LIKE '_ul';
挑出有含a , b, c ,d 的
挑出在my_table中,jobs 欄位是a, b, c, d 的人,並列出他的first_name.
SELECT first_name FROM my_table
WHERE jobs IN (a,b,c,d);
挑出在my_table中,jobs 欄位不是a, b, c, d 的人,並列出他的first_name.
SELECT first_name FROM my_table
WHERE jobs NOT IN (a,b,c,d);
IS NULL 可以用來檢查是否為NULL
SELECT * FROM my_tables
WHERE NOT main IS NULL.
或者,兩個用法都可。
SELECT * FROM my_tables
WHERE main NOT IS NULL.
AND / OR + NOT
WHERE +NOT
區間用 WHERE xxxx BETWEEN 小 AND 大
UPDATE + SET
把my_table 中,type欄位裡面的舊值改成新值
UPDATE my_table SET type='newvalue' WHERE type='oldvalue';
把my_table 中 name 叫做a, 或 b的商品 cost 都累加一。
UPDATE my_table SET cost=cost+1 WHERE name='a' OR drink_name='b';
2016年3月15日 星期二
[python] python 3.5 install lxml with binary under windows 8
1.
go to http://www.lfd.uci.edu/~gohlke/pythonlibs/
download
to desketop
2. go to the version of python file directory. (The IDE you're using....)
cmd
cd C:\Users\xxxxx\AppData\Local\Programs\Python\Python35-32\Scripts>
3. pip install wheel
or any kind of way you install the wheel, it should be appear in this folder with pip.exe.
3. pip install c:\Users\xxxxx\Desktop\lxml-3.5.0-cp35-none-win32.whl
it sholud be ok.
訂閱:
文章 (Atom)