2014年7月1日 星期二

Python2 Input and Output

轉錄自:http://en.wikibooks.org/wiki/Python_Programming/Input_and_output

Input[edit]

Note on Python version: The following uses the syntax of Python 2.x. Some of the following is not going to work with Python 3.x.
Python has two functions designed for accepting data directly from the user:
  • input()
  • raw_input()
There are also very simple ways of reading a file and, for stricter control over input, reading from stdin if necessary.

raw_input()[edit]

raw_input() asks the user for a string of data (ended with a newline), and simply returns the string. It can also take an argument, which is displayed as a prompt before the user enters the data. E.g.
print raw_input('What is your name? ')
prints out
What is your name? <user input data here>
Example: in order to assign the user's name, i.e. string data, to a variable "x" you would type
x = raw_input('What is your name?')
Once the user inputs his name, e.g. Simon, you can call it as x
print 'Your name is ' + x
prints out
Your name is Simon
Note:
in 3.x "...raw_input() was renamed to input(). That is, the new input() function reads a line from sys.stdin and returns it with the trailing newline stripped. It raises EOFError if the input is terminated prematurely. To get the old behavior of input(), use eval(input())."

input()[edit]

input() uses raw_input to read a string of data, and then attempts to evaluate it as if it were a Python program, and then returns the value that results. So entering
[1,2,3]
would return a list containing those numbers, just as if it were assigned directly in the Python script.
More complicated expressions are possible. For example, if a script says:
x = input('What are the first 10 perfect squares? ')
it is possible for a user to input:
map(lambda x: x*x, range(10))
which yields the correct answer in list form. Note that no inputted statement can span more than one line.
input() should not be used for anything but the most trivial program. Turning the strings returned from raw_input() into python types using an idiom such as:
x = None
while not x:
    try:
        x = int(raw_input())
    except ValueError:
        print 'Invalid Number'
is preferable, as input() uses eval() to turn a literal into a python type. This will allow a malicious person to run arbitrary code from inside your program trivially.

File Input[edit]

File Objects[edit]

Python includes a built-in file type. Files can be opened by using the file type's constructor:
f = file('test.txt', 'r')
This means f is open for reading. The first argument is the filename and the second parameter is the mode, which can be 'r', 'w', or 'rw', among some others.
The most common way to read from a file is simply to iterate over the lines of the file:
f = open('test.txt', 'r')
for line in f:
    print line[0]
f.close()
This will print the first character of each line. Note that a newline is attached to the end of each line read this way.
The newer and better way to read from a file:
with open("text.txt", "r") as txt:
    for line in txt:
        print line
The advantage is, that the opened file will close itself after reading each line.
Because files are automatically closed when the file object goes out of scope, there is no real need to close them explicitly. So, the loop in the previous code can also be written as:
for line in open('test.txt', 'r'):
    print line[0]
You can read limited numbers of characters at a time like this:
c = f.read(1)
while len(c) > 0:
    if len(c.strip()) > 0: print c,
    c = f.read(1)
This will read the characters from f one at a time, and then print them if they're not whitespace.
A file object implicitly contains a marker to represent the current position. If the file marker should be moved back to the beginning, one can either close the file object and reopen it or just move the marker back to the beginning with:
f.seek(0)

Standard File Objects[edit]

Like many other languages, there are built-in file objects representing standard input, output, and error. These are in the sys module and are called stdin, stdout, and stderr. There are also immutable copies of these in __stdin__, __stdout__, and __stderr__. This is for IDLE and other tools in which the standard files have been changed.
You must import the sys module to use the special stdin, stdout, stderr I/O handles.
import sys
For finer control over input, use sys.stdin.read(). In order to implement the UNIX 'cat' program in Python, you could do something like this:
import sys
for line in sys.stdin:
    print line,
Note that sys.stdin.read() will read from standard input till EOF. (which is usually Ctrl+D.)
Also important is the sys.argv array. sys.argv is an array that contains the command-line arguments passed to the program.
python program.py hello there programmer!
This array can be indexed,and the arguments evaluated. In the above example, sys.argv[2] would contain the string "there", because the name of the program ("program.py") is stored in argv[0]. For more complicated command-line argument processing, see the "argparse" module.

Output[edit]

Note on Python version: The following uses the syntax of Python 2.x. Much of the following is not going to work with Python 3.x. In particular, Python 3.x requires brackets around arguments to "print".
The basic way to do output is the print statement.
print 'Hello, world'
To print multiple things on the same line separated by spaces, use commas between them, like this:
print 'Hello,', 'World'
This will print out the following:
Hello, World
While neither string contained a space, a space was added by the print statement because of the comma between the two objects. Arbitrary data types can be printed this way:
print 1,2,0xff,0777,(10+5j),-0.999,map,sys
This will output the following:
1 2 255 511 (10+5j) -0.999 <built-in function map> <module 'sys' (built-in)>
Objects can be printed on the same line without needing to be on the same line if one puts a comma at the end of a print statement:
for i in range(10):
    print i,
This will output the following:
0 1 2 3 4 5 6 7 8 9
To end the printed line with a newline, add a print statement without any objects.
for i in range(10):
    print i,
print
for i in range(10,20):
    print i,
This will output the following:
0 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19
If the bare print statement were not present, the above output would look like:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
You can use similar syntax when writing to a file instead of to standard output, like this:
print >> f, 'Hello, world'
This will print to any object that implements write(), which includes file objects.

Omitting newlines[edit]

To avoid adding spaces and newlines between objects output with subsequent print statements, you can do one of the following:
Concatenation: Concatenate the string representations of each object, then later print the whole thing at once.
print str(1)+str(2)+str(0xff)+str(0777)+str(10+5j)+str(-0.999)+str(map)+str(sys)
This will output the following:
12255511(10+5j)-0.999<built-in function map><module 'sys' (built-in)>
Write function: You can make a shorthand for sys.stdout.write and use that for output.
import sys
write = sys.stdout.write
write('20')
write('05\n')
This will output the following:
2005
You may need sys.stdout.flush() to get that text on the screen quickly.

Examples[edit]

Examples of output with Python 2.x:
  • print "Hello"
  • print "Hello", "world"
    • Separates the two words with a space.
  • print "Hello", 34
    • Prints elements of various data types, separating them by a space.
  • print "Hello " + 34
    • Throws an error as a result of trying to concatenate a string and an integer.
  • print "Hello " + str(34)
    • Uses "+" to concatenate strings, after converting a number to a string.
  • print "Hello",
    • Prints "Hello " without a newline, with a space at the end.
  • sys.stdout.write("Hello")
    • Prints "Hello" without a newline. Doing "import sys" is a prerequisite. Needs a subsequent "sys.stdout.flush()" in order to display immediately on the user's screen.
  • sys.stdout.write("Hello\n")
    • Prints "Hello" with a newline.
  • print >> sys.stderr, "An error occurred."
    • Prints to standard error stream.
  • sys.stderr.write("Hello\n")
    • Prints to standard error stream.
  • sum=2+2; print "The sum: %i" % sum
    • Prints a string that has been formatted with the use of an integer passes as an argument.
  • formatted_string = "The sum: %i" % (2+2); print formatted_string
    • Like the previous, just that the formatting happens outside of the print statement.
  • print "Float: %6.3f" % 1.23456
    • Outputs "Float: 1.234". The number 3 after the period specifies the number of decimal digits after the period to be displayed, while 6 before the period specifies the total number of characters the displayed number should take, to be padded with spaces if needed.
  • print "%s is %i years old" % ("John", 23)
    • Passes two arguments to the formatter.
Examples of output with Python 3.x:
  • from __future__ import print_function
    • Ensures Python 2.6 and later Python 2.x can use Python 3.x print function.
  • print ("Hello", "world")
    • Prints the two words separated with a space. Notice the surrounding brackets, ununsed in Python 2.x.
  • print ("Hello world", end="")
    • Prints without the ending newline.
  • print ("Hello", "world", sep="-")
    • Prints the two words separated with a a dash.

File Output[edit]

Printing numbers from 1 to 10 to a file, one per line:
file1 = open("TestFile.txt","w")
for i in range(1,10+1):
  print >>file1, i
file1.close()
With "w", the file is opened for writing. With ">>file", print sends its output to a file rather than standard output.
Printing numbers from 1 to 10 to a file, separated with a dash:
file1 = open("TestFile.txt","w")
for i in range(1,10+1):
  if i>1:
    file1.write("-")
  file1.write(str(i))
file1.close()
Opening a file for appending rather than overwriting:
file1 = open("TestFile.txt","a")
See also Files chapter.

2014年5月9日 星期五

python3 高精度小數

python3 高精度小數

做數學運算需要用高精度的浮點數,可以使用decimal模組

>>> from decimal import *
>>> Decimal(1/3)Decimal('0.333333333333333314829616256247390992939472198486328125')
>>> Decimal( 5e-115)
Decimal('5.000000000000000253224511584642904700031198975255267803449800938244847
07054082960234923746081859400858021097772021778402792777070155705765691787462823
35047908242924101834562519900509625714227417248975325003782562360654965752209815
93257539786334869563372595928867119233244230552121178945412793837022036314010620
1171875E-115')

2014年5月7日 星期三

java iterators

Iterators

Q. What is an Iterable ?
A. Has a method that returns an Iterator.

public interface Iterable<Item>
{
    Iterator<Item> iterator();
}


Q. What is an Iterator ?
A. Has methods hasNext() and next().

public interface Iterator<Item>
{
    boolean hasNext();
    Item next();
    void remove();
}


Q. Why make data structures Iterable ?
A. Java supports elegant client code.

for (String s : stack){
    StdOut.println(s);
}







2014年5月6日 星期二

python3 multiprocessing: Server process

Python3

Server process
A manager object returned by Manager() controls a server process which holds Python objects and allows other processes to manipulate them using proxies.
A manager returned by Manager() will support types listdictNamespaceLockRLockSemaphoreBoundedSemaphore,ConditionEventBarrierQueueValue and Array. For example,
from multiprocessing import Process, Manager

def f(d, l):
    d[1] = '1'
    d['2'] = 2
    d[0.25] = None
    l.reverse()

if __name__ == '__main__':
    with Manager() as manager:
        d = manager.dict()
        l = manager.list(range(10))

        p = Process(target=f, args=(d, l))
        p.start()
        p.join()

        print(d)
        print(l)
will print
{0.25: None, 1: '1', '2': 2}
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Server process managers are more flexible than using shared memory objects because they can be made to support arbitrary object types. Also, a single manager can be shared by processes on different computers over a network. They are, however, slower than using shared memory.

ref: https://docs.python.org/3.4/library/multiprocessing.html

2014年5月5日 星期一

python3 用profiling測執行時間

Python 有內建 profiling 的工具,叫做 profile,可以透過命令列直接下參數使用:
1
python -m cProfile -s time MODULE.py ARGUMENTS
這樣會執行 MODULE 再將測量結果輸出到螢幕,時間依單一函式執行時間來排序。引用官網的例子,cProfile 的輸出格式如下:
1
2
3
4
5
6
7
8
     2706 function calls (2004 primitive calls) in 4.504 CPU seconds
 
Ordered by: standard name
 
ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    2    0.006    0.003    0.953    0.477 pobject.py:75(save_objects)
 43/3    0.533    0.012    0.749    0.250 pobject.py:99(evaluate)
 ...

2014年4月20日 星期日

Comparable vs Comparator in Java

Comparable 和 Comparator 的差別

轉錄自:http://www.programcreek.com/2011/12/examples-to-demonstrate-comparable-vs-comparator-in-java/

1. Comparable
Comparable is implemented by a class in order to be able to comparing object of itself with some other objects. The class itself must implement the interface in order to be able to compare its instance(s). The method required for implementation is compareTo().
簡單來說,就是可以有比較的性質。但是你如果要有多種的比較方式可能就要使用comparator
class HDTV implements Comparable<HDTV> {
 private int size;
 private String brand;
 
 public HDTV(int size, String brand) {
  this.size = size;
  this.brand = brand;
 }
 
 public int getSize() {
  return size;
 }
 
 public void setSize(int size) {
  this.size = size;
 }
 
 public String getBrand() {
  return brand;
 }
 
 public void setBrand(String brand) {
  this.brand = brand;
 }
 
 @Override
 public int compareTo(HDTV tv) {
 
  if (this.getSize() > tv.getSize())
   return 1;
  else if (this.getSize() < tv.getSize())
   return -1;
  else
   return 0;
 }
}
 
public class Main {
 public static void main(String[] args) {
  HDTV tv1 = new HDTV(55, "Samsung");
  HDTV tv2 = new HDTV(60, "Sony");
 
  if (tv1.compareTo(tv2) > 0) {
   System.out.println(tv1.getBrand() + " is better.");
  } else {
   System.out.println(tv2.getBrand() + " is better.");
  }
 }
}
Sony is better.

2. Comparator
Comparator is capable if comparing objects based on different attributes. e.g. 2 men can be compared based on `name` or `age` etc. (this can not be done using comparable. )
你可以使用object中不同的特性做比較,像是人的`name` or `age` 
The method required to implement is compare(). Now let’s use another way to compare those TV by size. The common use of Comparator is sorting. Both Collections and Arrays classes provide a sort method which use a Comparator.
在實作中,你需要有一個compare()的function,讓你的comparator有比較的準則。一個class可以有多種的比較方式,要個別實作compare()的部份的部份。
通常Comparator會被用在做sort 。

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
 
class HDTV {
 private int size;
 private String brand;
 
 public HDTV(int size, String brand) {
  this.size = size;
  this.brand = brand;
 }
 
 public int getSize() {
  return size;
 }
 
 public void setSize(int size) {
  this.size = size;
 }
 
 public String getBrand() {
  return brand;
 }
 
 public void setBrand(String brand) {
  this.brand = brand;
 }
}
 
class SizeComparator implements Comparator<HDTV> {
 @Override
 public int compare(HDTV tv1, HDTV tv2) {
  int tv1Size = tv1.getSize();
  int tv2Size = tv2.getSize();
 
  if (tv1Size > tv2Size) {
   return 1;
  } else if (tv1Size < tv2Size) {
   return -1;
  } else {
   return 0;
  }
 }
}
 
public class Main {
 public static void main(String[] args) {
  HDTV tv1 = new HDTV(55, "Samsung");
  HDTV tv2 = new HDTV(60, "Sony");
  HDTV tv3 = new HDTV(42, "Panasonic");
 
  ArrayList<HDTV> al = new ArrayList<HDTV>();
  al.add(tv1);
  al.add(tv2);
  al.add(tv3);
 
  Collections.sort(al, new SizeComparator());
  for (HDTV a : al) {
   System.out.println(a.getBrand());
  }
 }
}
Output:
Panasonic
Samsung
Sony

2014年4月14日 星期一

轉錄: HOWTO - 常見語言的套件安裝 (Perl、Python、Ruby)

HOWTO - 常見語言的套件安裝 (Perl、Python、Ruby)

不同隻程式會使用到不同的版本和package
perl 可用 perlbrew
python 可用  virtualenv 管理

以下網址有詳細的說明:
常見語言的套件安裝_(Perl、Python、Ruby)



Python virtualenv:

easy_install 這個工具(由 setuptools 提供)來安裝 Virtualenv

01. Linux

如果不知道 easy_install 或還沒安裝 setuptools,在 Debian/Ubuntu 可以用下列指令安裝:
$ sudo apt-get install python-setuptools

在 Fedora/CentOS/Redhat/openSUSE,則可以使用:
$ su -
# yum install python-setuptools
安裝virtualenv
# easy_install virtualenv

02. 使用方法

I. 建立虛擬環境
請於命令列模式下輸入下列指令:
$ virtualenv [指定虛擬環境的名稱]
例如下列指令會建立名為 "ENV" 的虛擬環境:
$ virtualenv ENV
預設在建立虛擬環境時,會依賴系統環境中的 site packages,如果想完全不依賴系統的 packages,可以加上參數 --no-site-packages 來建立虛擬環境:
$ virtualenv --no-site-packages [指定虛擬環境的名稱]

II. 啟動虛擬環境

請先切換當前目錄至建立的虛擬環境中。前例中,建立名稱為 "ENV",則:
$ cd ENV
接著,啟動虛擬環境:
$ source bin/activate
然後就可以注意到,在 shell 提示字元的最前面多了虛擬環境的名稱提示:
(ENV) ...$
III. 退出虛擬環境
請於命令列模式下輸入下列指令:
$ deactivate
就可以回到系統原先的 Python 環境。
IV. 在虛擬環境安裝新的 Python 套件
Virtualenv 在安裝時會附帶 pip 這個 Python 的套件安裝工具,當虛擬環境被啟動時,由它安裝的 package 會出現在虛擬環境的資料夾中,用法是:
(ENV)...$ pip install [套件名稱]
如果系統也有安裝 pip,請特別注意是否已經啟動虛擬環境,否則套件會被安裝到系統中,而非虛擬環境裡。
V. 從程式中指定使用虛擬環境的函數庫
無法從 Shell 啟動虛擬環境的情況,像是使用 mod_python 或 mod_wsgi,這時可以在 Python 的程式中加上:
activate_this = '/path/to/env/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))

來使用安裝在虛擬環境中的 packages。