SSLでファイルをダウンロードする時の注意点 for IE6〜7

メモ
http://support.microsoft.com/kb/323308/ja

アドレス バーのInternet Explorer 6Service Pack 1(SP1)にドキュメントの HTTPS URL を入力すると、 Microsoft Office ドキュメントまたは PDF ファイルを開こうとすると、次のエラーメッセージを表示することがあります。

これを回避するにはサーバからのレスポンスにPragmaを含めないようにする。もしくはPragmaにno-cache以外を設定する。

コンストラクタ?

メモ

// ①コンストラクタ
var foo = new (function(){this.foo = 1;})();

// ②コンストラクタ?
var foo2 = (function(){this.foo = 1;return this;)();

①②の違いを調べた。
前者の関数リテラルの中のthisは自身を指していて、後者のthisはブラウザで実行させた場合windowオブジェクトなんだね。
なので②はコンストラクタとは呼びがたいな。

RubyプログラマがPythonを学び始めて知ったこと10選 ④

1 クラスのメソッド定義の第一引数には必ずselfが必要。

class MyClass:
  def my_method(self):
    # 処理

尚、第一引数の名前は別にselfでなくてもよい。ただ慣習的にselfが使われる。

2 クラスをインスタンス化するには関数表記を使う。

class MyClass:
  def my_method(self):
    return 1


m = MyClass() # インスタンス化
m.my_method()
=> 1

ちなみにメソッドコールの時はselfは不要。暗黙的に現在のオブジェクトが渡される。

3 クラス名の一文字目は小文字でもよい。

よいけど、慣習的に大文字にしてるのだとか

class my_class:
  def my_method(self):
    return 1


m = my_class()
m.my_method()
=> 1

ちなみにモジュール名も小文字でよい。よいどころか小文字が一般的のようだ。

4 関数の中から関数外の変数へのアクセスはリードオンリー。

a = 10
def r():
  return a # 読み込みの時は関数外の変数が参照される。

def w():
  a = 1 # 書き込みの時は関数外とは別のローカル変数が生成される。
  return a

r()
=> 10

w()
=> 1

a
=> 10

5 メソッドの中からクラスのデータメンバ(変数)を参照する場合、レシーバを省略できない。

class MyClass:
  i = 0 # データメンバ
  def my_method(self):
    return i # レシーバ(self)がないのでエラーになる

先の「4 関数の中から関数外の変数へのアクセスはリードオンリー」の例は関数の例であるためレシーバ無しでも上手くいくがメソッドの場合はレシーバが必要。

6 データメンバ(変数)はJavaScriptのようにクラス外部から手軽に定義できる。

class MyClass:
  pass

m = MyClass()
m.my_variable = 1
m.my_variable
=> 1

7 __str__()メソッドという特殊メソッドがある。

これはRubyのinspectメソッドのようにオブジェクトの内部を人間にわかりやすく表示するためのもの。

class MyClass:
  def __str__(self):
    return 'foo'


m = MyClass()
print(m)
=> foo

Rubyのpメソッドがオブジェクトのinspectメソッドを利用するようにPythonではprint()関数がオブジェクトの__str__()メソッドを利用する。

8 JavaScriptのようにメンバ変数・メソッドの名前でアクセス制御する。

つまり、それが慣習であって、厳格に非公開にすることはできない。

class MyClass:
  # public変数
 public_variable = "public variable"
  
  # publicメソッド
  def public_method(self):
    return "public method"

  # private変数(頭にアンダースコアを付ける)
  _private_variable = "private variable" 

  # privateメソッド(頭にアンダースコアを付ける)
  def _private_method(self):
    return "private method"


m = MyClass()
m.public_variable
=> 'public variable'

m.public_method()
=> 'public method'

m._private_variable   # 慣習なので、その気になればアクセスできる
=> 'private variable'

m._private_method()   # 慣習なので、その気になればアクセスできる
=> 'private method'

尚、頭にアンダースコアを2つ続けると、慣習ではなく本当にその変数やメソッドにアクセスできなくなるが、これも完全に非公開になったわけではなく、ある法則によって別名に変換され、元々の名前ではアクセスできなくなっただけ。

class MyClass:
  def __private_method(self):
    pass


m = MyClass()
m.__private_method()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'MyClass' object has no attribute '__my_func'

Rubyでいうprotectedは言及されていないのでPythonには無いのかも知れない。

9 Rubyと同じく定数は変数名を大文字で表す。

ただし、Pythonでは変数名の全ての文字を大文字にする。それが慣習。つまりプログラマが定数として扱うだけであって本質的には通常の変数となんら変わりない。

CONSTANT = 'constant variable'
CONSTANT
=> 'constant variable'

CONSTANT = 'foo' # 変更しても何も怒られない
CONSTANT
=> 'foo'

10 Rubyと同じく++, --がない。

a = 0
a++
  File "<stdin>", line 1
    a++
      ^
SyntaxError: invalid syntax

RubyプログラマがPythonを学び始めて知ったこと10選 ③

1 比較を連鎖できる。

a = 2

# これを
1 < a and a < 3
=> True

# このように書ける
1 < a < 3
=> True

2 モジュール名はファイル名。

RubyではModuleを定義する構文があり、その中でモジュール名も定義されるが
Pythonではファイル名、例えばhoge.pyであればhogeがモジュール名となる。
これを取り込むには次のように書く。

import hoge

3 モジュールはクラス・関数・変数単位でimportできる。

hogeモジュールからfoo()関数のみ取り込む場合次のように書く

# hoge.py
def foo():
  return 1
# hogeモジュールを使用するスクリプト
from hoge import foo
foo()
=> 1

複数importも可能。

# カンマで区切って複数をimport
from hoge import foo, foo2

# *で全てをimport
from hoge import *

最後のfrom hoge import *とimport hogeでは何が違うのかと言うとfromを使用した場合、hogeは省略して使える。

# import hogeの場合はモジュール名を指定する必要がある。
import hoge
hoge.foo()
=> 1

# from hoge import *の場合はモジュール内の関数等を直接呼び出せる。
from hoge import *
foo()
=> 1

4 モジュールをimportするとRubyのように自クラスのメソッドや変数になるのか?

個人的に一番気になるところなんだが未だわからない。
ただ、動作確認をしている感じだとimportはRubyでいうrequireでありincludeやextendとは違う感じがする。

5 戻り値はreturnを明示する必要がある。

# returnがない場合
def a():
  1


print(a())
=> None

# returnがある場合
def a():
  return 1


print(a())
=> 1

6 with文というものがある。

ある特定のオブジェクトにはwith文を使用することができる。
with文を使用するとオブジェクトが不要になった際にクリーンアップ処理が実行される。
例えばオブジェクトがファイルの場合、RubyのFile.open() {}のように処理終了後ファイルが自動クローズする。

with open('/path/to/file', 'r') as f:
  f.read()

# 処理終了後はファイルが自動クローズされる。

7 range()関数というものがある。

RubyのRangeオブジェクトに近いと言えば近いがPythonでは数値の範囲しか扱えないようだ。

r = range(10)
r
=> range(0, 10)
# 0から9までのループ。
for i in r:
  # 処理

8 例外処理にfinally節とelse節がある。

finally節とはRubyのensure節と同じもの

def a():
  try:
    # 通常処理
  except (IOError, RuntimeError):
    # 例外処理
  else:
    # try節で例外が発生しなかった場合に実行する処理
  finally:
    # 全ての状況で実行される

ちなみに上記例のexcept節の(IOError, RuntimeError)はタプル。関数の()ではない。

9 pass文というものがある。

pass自体何もしない。構文的に文の記述が必要だが何もしたくない場合に使用する。

def a():
  pass

上記関数は何もしない。同じことを表すために下記のように書くとエラーとなる。

def a():

文が必要なところに何も文がないのでエラー

10 クラスの多重継承ができる。

class MyClass(BaseClass1, BaseClass2):
  pass

BaseClass1,BaseClass2が継承元のクラス

RubyプログラマがPythonを学び始めて知ったこと10選 ②

1 case文がない。

ifとelifがその代わりを果たす。Rubyの場合正確にはcase式なんだけどね。

if x == 0:
  # 処理
elif x == 1:
  # 処理

当たり前と言えば当たり前

2 キーワード引数というものがある。

キーワード引数とは関数定義時の仮引数名を使って引数を渡せる仕組みのこと。

# こういう関数があったとして
def my_func(arg1 = 1, arg2 = "yes"):
  # 処理

# このように引数を渡せる。 
my_func(arg2 = "no")

3 仮引数の最後が**引数名の場合、その引数はディクショナリを受け取る。

ディクショナリとはRubyでいうハッシュ。このディクショナリには仮引数に対応するキーワードを除いた全てのキーワード引数が入る。つまりこの形にすれば仮引数にないキーワードが使える。

def my_func(arg, **dic):
  return dic

my_func(arg=0, hoge=1, foo=2)
=> {'hoge' : 1, 'foo' : 2}

4 関数のコメントを手軽に確認できる。

def my_func()
  """コメント"""

# このようにして確認ができる
my_func.__doc__
=> 'コメント'

5 リスト内包というものがある。

Rubyで以下のように書くものが

[1, 2, 3].map {|member| member * 2}

Pythonではこのように書ける

[member * 2 for member in [1, 2, 3]]

6 リストの足し算はできるが引き算はできない。

リストとはRubyでいう配列のようなもの。

# これは可
[1] + [2]
=> [1, 2]

# これは不可
[1, 2] - [1]
=> エラー

7 タプルというデータ型がある。

タプルとはRubyの配列のようなものだが、タプルは個々のアイテムを変更することができない。

a = 1, 2, 3
=> (1, 2, 3) # これがタプル
# 配列のようにfor文にかけたり各アイテムを参照することが可能。
for i in a:
  print(i)

=>
1
2
3

a[0]
=> 1

# 変更はできない
a[0] = 5
=> エラー

ちなみに空のタプルとアイテムが一つだけのタプルは次のように書く

# 空のタプル
a = ()

# アイテムが一つだけのタプル
b = 1,

最後のカンマが気になるけど、カンマなかったら単なる1の代入だもんな。
あ、それとRubyにもTuple型あった。

8 JavaScriptのようにアイテムがコレクションに含まれるか手軽に調べられる。

a = [1, 2, 3]
1 in a
=> True
4 in a
=> False

9 sort()は破壊的。

a = [2, 4, 1, 3]
a.sort()
a
=> [1, 2, 3, 4]

破壊を回避するにはsorted()を使う

a = [1, 3, 2]
b = sorted(a)
a
=> [1, 3, 2]
b
=> [1, 2, 3]

10 集合型であればコレクションの引き算ができる。

先にリストの引き算ができないと書いたがこれでカバーできなくはない。

a = set([1, 2, 3]) # set()で集合型に変換
b = set([1, 3]) # set()で集合型に変換
a - b
=> {2} 

ちょっと面倒と言えば面倒。

RubyプログラマがPythonを学び始めて知ったこと10選 ①

1 irbのように対話モードがある。

Rubyではirbで対話モードを開始するがPythonでは以下のコマンドで開始する

python

2 Rubyと同じく多重代入ができる。

a, b = 1, 2
a # => 1
b # => 2

多重代入という名前があることを初めて知った。

3 Rubyと同じく文字列の掛け算ができる。

ただしこの*が文字列のメソッドなのかどうかは知らない。

"a" * 3
=> 'aaa'

4 対話モードでは最後に表示した式が_(アンダースコア)に代入される。

a = 1
a + 1
=> 2
_ + a
=> 3

これはirbにもあるようです。ezookojoさん感謝です。

5 トリプルクォート("""または''')というヒアドキュメントのようなものがある

"""a
   b
   c
"""
=> 'a\n   b\n   c\n'

あっ、これはRubyにもあるようだ。知らなかった。←訂正します。私の思い違いだと思います。Rubyにはトリプルクォートは多分ありません。理由はコメント欄で言及されています。

6 スライス表記というものがある

a = ["a", "b", "c", "d"]
a[1:3]
=> ["b", "c"]

:の左は範囲の開始、右は終了を表す。ただしこの数字がよくある配列の添え字のカウントと異なり、以下のようにカウントする。(文字は上記サンプルの配列の値、数字はカウントを表す)
0|a|1|b|2|c|3|d|4

7 対話モードで複合文を入力するときは最後に空白行を加えて文の完了を知らせる必要がある

(インデントで制御構造を表すPythonならではなところだな)

def my_func(arg):
  return arg

returnの後の空白行によって関数定義の終了を知らせている。

8 ループにelse節を書ける。

else節はループが終了した時に実行される。

for i in [1, 2, 3]:
  # 処理
else:
  # 終了処理

どういう時に使うのだろう?

9 関数の最初の文として文字列が使える。

この文字列はrdocのように使える。

def fib(n):
  """nまでのフィボナッチ級数を表示する"""
  # 処理

10 JavaScriptのように関数の代入が手軽にできる。

def my_func():
  return 1

my_func()
=> 1
mf = my_func # 関数の代入
mf()
=> 1

今日はここまで。