Pythonでもutf-8でコーディングを行うのが標準。
codingTest.py で動作を確認されたし(中身はutf-8です)。
type codingTest.py
python codingTest.py
Pythonでは文字列(str)とバイト列(bytes)が区別されているので注意が必要。
このモジュールの主役であるsocketオブジェクトは、様々なレベルの使い方に対応している。
ここではRubyのTCPSocketと概ね同等の機能の使い方を例示する。
import socket
host='www.nagano.ac.jp'
port=80 # must be integer
resource='/'
with socket.create_connection((host,port)) as sock:
sock.send("GET {} HTTP/1.0\r\n\r\n".format(resource).encode())
res=sock.makefile(encoding='utf-8').read()
print(res)
上記の create_connection
呼び出しは、socketを(その種類を指定しつつ)生成し、それからconnectする下記の呼び出しと同等。
from socket import socket,AF_INET,SOCK_STREAM
host='www.nagano.ac.jp'
port=80 # must be integer
resource='/'
sock=socket(AF_INET,SOCK_STREAM) # TCP用ソケットの生成
sock.connect((host,port)) # タプルで与える
sock.send("GET {} HTTP/1.0\r\n\r\n".format(resource).encode())
res=b''
while True:
r=sock.recv(1024)
if(r==b'') : break
res+=r
print(res.decode())
sock.close()
b'...'
は、bytes(バイト列)を生成する記法。
最後にdecodeを読んでstrに変換する。このときencodingは省略しても大丈夫(動作環境に応じたデフォルト値が採用される)。
with~as:
の構文を使ったが、この例はそれを使わないので最後にsocketを明示的にcloseする必要がある。sys.argv
(データ型としては
list)を使う。ただし、python
はCと同じ流儀で、その先頭要素(sys.argv[0])にはプログラム名が入っている。
import sys
print(sys.argv)
# or
from sys import argv
print(argv)
ruby の Array#shift と同等のことをするメソッドはある argv.pop(0)
(引数なしでpopを呼ぶと末尾要素を取り出して削除する)が、
pythonではあまり好んで使われていない。C言語と同様の考え方で、argv[1]
のように添え字指定で取り出すケースが多いようだ。
ただし pythonでは(Rubyとは違って)その添え字で指定された要素が存在しない時に、nil のような特殊な値を返すのではなく、エラーを発生させる。ので予め対処が必要。
3項演算子(if式と呼んでもいいだろう)を使うことになる。
pythonの3項演算子は他の言語とやや語順が違う(内包式に近い)ので注意。
filename=argv[1] if len(argv)>1 else 'xxx.txt'
なお、pythonでも a=False or "x"
のような式は有効.
||
、&&
演算子はなく、代わりに or
、and
の優先度が
=
よりも高い(と考えてもいい。正確に言えば=
などの代入演算子が値を求める式の中で使えないので優先度比較の対象になっていないという事のようだが)。Rubyと比較してまとめてあるページを参考にして下さい。
繰り返し:
for i in a:
print(i)
# foreach あるいは each というようなメソッドはないようだ
各要素に同じ処理:
# リスト内包表記による書き方
list(e**2 for i in a)
# map メソッドによる書き方
list(map(lambda e: e**2, a)
連結した文字列:
','.join(a)
Rubyとはjoinの呼び方が逆。
pythonの場合、引数は文字列(str)の並び(seq)に限定される。数値列などを対象にするときには、変換してからjoinに与える必要がある。
','.join(str(e) for e in a)