wiki:Pythonの短いソースコード集

Version 41 (modified by nakiki, 13 years ago) (diff)

--

動かし方

  • テキストをコピーして、適当なファイル名を作ります。
  • python test.pyのように実行して動きを見てみるだけ。
  • 研究課題も記述しておきました。お試しあれ。

スレッドを作る

import threading
import time

def process():
  while True:
    print 'x1'
    time.sleep(3)

th = threading.Thread(None, process, None)
th.setDaemon(True)
th.start()

while True:
  print 'x0'
  time.sleep(3)

外部コマンドの実行

import os

result = os.system('ls -al')
print result

数値から文字へ

n = 1000
nstr = str(n)
msg = '%s' % nstr
print msg

数値から文字へ

for n in range(97, 123):
  print chr(n)

文字から数値へ

nstr = '1000'
n = int(nstr)
n += 1
print n

一文字の数値化

str = 'abcdefghijklmn'
for s in str:
  v = ord(s)
  print v

16進数表記

v = 100
print '%x' % v

大きな整数

a = 1245556734567L
print pow(a, 30)
  • Lを指定するとlongintegerになり大きなビット数の整数が扱える。
  • 課題: 正しいことはどうやって証明するのか?

タプル

a = (1, 2, 3)
a1, a2, a3 = a
print a1
print a2
print a3

リスト

list = [1, 2, 3, 4, 5, 6, 7]
for item in list:
  if item % 3 == 0:
    list.remove(item)
print list
  • 課題リスト: のサイズが大きくなった場合削除に時間がかかるか?

区切りで文字分割

import string

s = '192.168.1.1'
a = string.split(s, '.')
print a

時刻の表示

import time

print time.strftime("%Y%m%d%H%M%S ", time.localtime())

空白除去

import string

str = 'dkdkdkd dkdkdkdk aaaaa   '
str1 = string.rstrip(str, ' ')
print str1

商と余り

(a, r) = divmod(13, 5)
print a
print r

ランダム

import random

v = []
v +=  [random.randint(0, 100)]
v +=  [random.randint(0, 100)]
v +=  [random.randint(0, 100)]
v +=  [random.randint(0, 100)]
v +=  [random.randint(0, 100)]
print v

辞書の表示

a = {'k1':100, 'k2':101, 'k3':102}
for k in a:
  print k, a[k]

基底クラスの呼び出し

class ServerProxy(xmlrpclib.ServerProxy):
  def __init__(self, addr):
    t = MyTCPTransport()
    xmlrpclib.ServerProxy.__init__(self, addr, t)
  • 忘れないように。

ソケット.TCPクライアント

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(10)
try:
  r = sock.connect(('127.0.0.1', 12345))
  sock.send('test message')
except socket.error, e:
  print 'Error: %s' % e

ソケット.TCPサーバ

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('127.0.0.1', 12345))
sock.listen(1)
try:
  while True:
    (conn, sa) = sock.accept()
    msg = conn.recv(8192)
    print msg
    conn.close()
except socket.error, e:
  print 'Error: %s' % e

RPCサーバ

import SimpleXMLRPCServer

class Test:
  def inc1(self, value):
    return value + 1

  def inc2(self, value):
    return value + 2

  def inc3(self, value):
    return value + 3

if __name__ == '__main__':
  server = SimpleXMLRPCServer.SimpleXMLRPCServer(('127.0.0.1', 12346))
  server.register_instance(Test())
  server.serve_forever()
  • 関数呼び出しのイメージで処理が進められるので便利。
  • 特別なプロトコル自分で作る必要がない。
  • 研究課題: このサーバを起動して、一度だけRPCクライアントとの通信後サーバを^Cで終了させてその直後にサーバをまた起動するとソケットがまだバインドされているというエラーがでてすぐに起動できない。さてどう改造したらうまく行くのでしょうか?

RPCクライアント

import xmlrpclib

server = xmlrpclib.ServerProxy('http://127.0.0.1:12346')
print server.inc1(1)
print server.inc2(1)
print server.inc3(1)
  • そう関数を呼ぶだけです。

データの連結

s1 = 'sssssssss1'
s2 = 'sssssssss2'
s3 = 'sssssssss3'
s4 = 'sssssssss4'
l = [s1, s2, s3, s4]
print ''.join(l)
  • コピーを少なくしてデータを連結するため。

バッファ

s = '123456789abcdefgh'
x = buffer(s, 6, 2)
ss = str(x)
print ss
  • 長いデータの一部を取り出したり、見たりするときに便利。

バイナリデータを扱う

 packet = struct.pack("!HH", 500, 1)
 (l, x) = struct.unpack("!HH", packet[0:4])
 print l, x
  • ネットワークのパケット処理などに活躍します。

データの表示

print (data,)
  • printはタプルにして表示すると便利

CGI

import CGIHTTPServer
import BaseHTTPServer
import SimpleHTTPServer

def serveForever(addr, HandlerClass = CGIHTTPServer.CGIHTTPRequestHandler,
        ServerClass = BaseHTTPServer.HTTPServer):

    HandlerClass.protocol_version = 'HTTP/1.0'
    httpd = ServerClass(addr, HandlerClass)

    sa = httpd.socket.getsockname()
    print "Serving HTTP on %s:%d" % (sa[0], sa[1])
    httpd.serve_forever()

if __name__ == '__main__':
  serveForever(('127.0.0.1', 8000))

コマンド引数

import optparse

parser = optparse.OptionParser()
parser.add_option("-u",  "--user", dest="user", help= 'user name')
(options, args) = parser.parse_args()

if options.user:
  print options.user
else:
  print parser.print_help()
  • 自分で作らなくても便利なので最近利用しています。

gzipファイルの展開

import tarfile

tf = tarfile.TarFile.gzopen('test.dat.tar.gz', mode = 'r')
print tf.getmembers()
for l in tf.getmembers():
  tf.extract(l)

ftpクライアント

import ftplib

ftp = ftplib.FTP('yourhost')
ftp.login('user', 'xxxxx')
f = open('xxxx.exe', 'wb')
ftp.retrbinary('RETR xxxx.exe', f.write)
f.close()

httpクライアント

import httplib

h = httplib.HTTPConnection('www.yahoo.com')
h.request('GET', '/index.html')
r = h.getresponse()
if r.status == httplib.OK:
  data = r.read()
  print data
print 'Status=', r.status