Python 6日目

数値を文字列に変換
文字列と文字列を連結
u"あいうえお"+u"かきくけこ"することはできるが、
文字列と数字を連結することはできない。
そこで、数字を文字列に変換する操作が必要になる。
自動で変換してくれる言語もあるがPythonは自動で行わない。
何かエラーを防ぐ目的とかがあるのだと思う。

str(2008)で文字列"2008"になる。
str()関数は数値以外も代入できる。
str()関数に数値以外の値を入れたときにどうなるかはここでは詳しく説明無し。?

文字列もリストと同じようなシーケンス。
よって、リストと同じようにインデックスが使える。
string="abcde"
string[2]でcになる。
ユニコード文字列も可能。
その際はちゃんと1文字目、2文字目になる。
jstring=u"あいうえお"
jstring[2]で3文字目の「う」になる。
スライスも可能。
jstring[0:2]
jstring[:]で文字列の全てになる。

数値リテラル
相変わらずリテラルが何なのか不明。
Pythonで使える数値は
整数、長整数、浮動小数、複素数。
複素数が使えるということが、Pythonを選んだ一番の理由。
他の言語も使えるのかもしれんが。
数値は文字列と違って計算が可能。

長整数は数値の末尾にLをつける。
ただし、自動で切り替わるためわざわざつける必要もない。
八進数は頭に0、
16進数は頭に0xをつける。
061、0xFFとか。

printは文字列でないものが指定された場合、文字列に変換する。
print 0xFF
8進数、16進数はprintするときの文字列への変換で10進数に変換されているっぽい。

print([expression ("," expression)* [","]])
こういう表現がまだ理解できていない。
expressionとstatementか。

異なる型?(整数...複素数)間の四則演算はより複雑な方の型が出力される。
整数と整数の割り算では整数が出力される。
5/3は1になる。
演算子では浮動小数でも整数が出力される。
切り捨てられる。
%は割り算の余り。
浮動小数点でも計算できる?

べき乗

ビット演算ができる
ビット演算は整数に対してしかできない。
ビット反転演算には注意。Pythonでは長整数にビットの最大値がないため特殊な関数になる。

シフト演算
a << b
a >> b
で指定する。
これも整数のみ。
左シフト<<は値を2倍することに対応し、
右シフト>>は値を1/2することに対応する。

文字列を整数に変換する関数int()
integerから。
int("23")で文字列"23"が整数23に変換される。
int()関数は基数を指定できる。
例えば基数に16を指定した場合、文字列を16進数だと思って10進数の整数に変換する。
てことは16進数の文字列を16進数の整数に変換するには、2回変換が必要?
ちゃんと"FFFF"とかも変換できる。
浮動小数を整数に変換もできる。
その場合基数は指定できない。

変数
文字列、数値はオブジェクト
変数はオブジェクトに関係する。
Pythonでは変数にオブジェクトを代入すると、コピーを作らずに参照だけが作られる。
つまり、コピーを作ると必要なメモリが多くなるが、実行速度が速いのかな?
参照だけだとメモリは小さくてすむが、いちいち見に行く時間がかかる?
変数=オブジェクトを代入ステートメントという。
これはステートメント。expressionではない。
差が分からないが重要らしい。
Pythonでは代入ステートメントで変数の宣言がされるため、
代入せずにいきなり変数を使うことはできない。
print string
はだめ。
string="abc"
print stringはOK
変数名のつけ方
頭文字は英文字か_
2文字目以降は数字も使用可能。英数文字と_が使用可能。
頭文字が数字の変数は不可。
予約語は使用不可能。
大文字と小文字は区別される。
って事は予約語を全て大文字とかにすれば使用可能?
慣習的に、頭文字に_、__、大文字は使わない。
__はたぶん__init__みたいな関数?と区別するため。
大文字を使わないのはクラスの名前を大文字にする慣習があるため。
変数に別のオブジェクトを代入
変数はオブジェクトを参照するだけなので、型がない。
型の宣言が必要ないとかでなくて、型がない。
オブジェクトの方に型があればいいということか。

変数に別の変数を代入。
大本のオブジェクトが変わると、全ての変数が影響を受けるので注意。
文字列、数値は不変性のオブジェクト。
リストは変更可能。
不変性ってのが、理解ができていない。
変数に代入せずに、オブジェクトを作れる?

なるほど。
よくわかった。
var2=var1の命令は、常にvar2⇒var1⇒30で参照するようにする命令かと思ってたけど、
そうじゃなくて、var2⇒30で参照させる命令なのか。
リストとタプル2つの型の使い分けが分からなかったが、これほどに動作が違うなら必要だろう。
オブジェクトが可変なのか不変なのかは重要だな。

式の中での変数の扱い
オブジェクトを代入された変数は参照しているオブジェクトと同じ扱いになる。
文字列+数値のような、演算不可能な式を書かないように注意。
変数だと、参照しているオブジェクトの型が分かりにくくなってしまうので、ミスしがち。

累算代入文
sum=sum+1のように左辺と右辺に同じ変数が表れる形。
=は右辺を左辺に代入する操作なので、おかしくはない。
新しい数値オブジェクトを作って(右辺)、変数に代入する。
sum+= 1とかける。
累算代入、拡張代入と呼ぶ。
他にも似たような代入がたくさん。<<とか

とか

and,orなんかも拡張代入できる。
基本的に二項演算子は拡張代入できる。(例外は?)
str(num)にする必要はあるのか?printは数値であれば自動的に文字列に変換してくれるのでは?

ifは複合文。
内部に文を持つ。
この文というのはstatementなのかexpressionなのか。
どちらでもいいのかな?
インデントはスペースでもタブでもOK.
スペース、タブ、スペースと、
タブスペーススペースは別のインデントになるのかな?

全てのオブジェクトは真か偽に分類可能。
リストやタプルでもどちらかに分類可能。
確か、何らかの値が含まれるリストは真になる。
真になるオブジェクトとして「True」がある。

ifの条件式に条件式ではなく、オブジェクトだけを書くことができる。
例えば
if True
print "always true"

if list
if 0
if 1
if ""
True + 3 =4になる。
True=1としてよい。

比較演算子
==はオブジェクトの持つ値を比較する。
文字列の大小も比較可能。
a