python3は後方互換性を捨てた事だけが一人歩きしてて,実際変更を知らない人が多い(自分も)ので,
よく使う処理の周りだけざっくりと1分くらいでわかるようにまとめました.
printの変更
printは"命令(文)"から"関数"に変更されました.
ちゃんとカッコをつけましょう的な話です.
関数にすることでそれなりにメリットもあるそうですが,細かい話なので次いきます.
print "hello world" print( "hello world" )
文字コード周りの変更
2系にあった"8ビット文字列"と"Unicode文字列"は 3系で"str型(Unicode)"と"バイナリ型"に変更されました.
設計的にはわかりやすくて,良くなったっぽいですがエンコード周りでのハマりポイントがなくなったってわけではないような気がします.
フォーマット文字列の変更
2系では
print "Hello! %d" % a
だったものが,format関数が導入されて
print( "Hello! {0}".format( a ) )
と書くことになりました.個人的にはformatを使うほうが可読性高い気がするので好きですね.
リスト処理周りの変更
filter,map,zipのような関数型っぽい処理が出来る関数は2系まではほとんどがリストをそのまま返していましたが,3系ではイテレータ(オブジェクト)が返ってくるようになりました.2系と3系で等価な処理を書いて比較するとこんな感じです. その他にもxrange()とかは廃止されてrange()自体の挙動がxrange()っぽくなりました.
# 2系 >> map((lambda x:x+1),[1,2,3,4,5,6,7]) [2, 3, 4, 5, 6, 7, 8] # 3系 >>> map((lambda x:x+1),[1,2,3,4,5,6,7]) <map object at 0xffffffffff> >> list( map((lambda x:x+1),[1,2,3,4,5,6,7]) ) [2, 3, 4, 5, 6, 7, 8]
数値系
webアプリケーションとか作ってる際にはそこまで関係ないですが,数値周りでは2系であったlong型が廃止され,3系ではint型が往来のlong型のような挙動になりました.
あと"/"の演算子の結果がfloat型への暗黙的な型変換が行われるようになりました.
どちらもユーザーが型を意識しないで良くなったというのは動的型付け言語として嬉しい変更ですね.
その他
この他にもモジュール名が整理されてたり,IO周りが変わったりたくさん変更があるようですが,
私が頻繁に出くわす変更点は上にあげた項目がほとんどだと思います.
pythonのイースターエッグ
主旨と関係ないけどこういうの面白いですね.
import __hello__
from __future__ import braces