Python、はじめました

非プログラマーかつ私文卒リーマンの Pythonデビュー全記録

【SoloLearn】例外&ファイル-Files②

f:id:pokita:20180527162737p:plain

 

SoloLearn-Exception & Files-Reading Files

 

fileで読み込んだテキストデータをどう処理するか、これこそがPythonの言語分析機能の見せ所!といっても、世間で言うところのPythonの評判はライブラリの拡張機能の方。今回はその基礎の基礎、データの基本的な読み込みについて。

 

まずは第1項。

 

The contents of a file that has been opened in text mode can be read using the read method.

readメソッドを使うことで、textで開かれたfileの中身を読み込むことができます。

file.readメソッドで戻される値はすべて文字列となる。

 

file = open("filename.txt","r")

cont=file.read() #←contにはfilename.txtに含まれている全文字列が格納される

print(cont)

file.close

 

次に第2項。

 

To read only a certain amount of file, you can provide a number as an argument to the read function. This determines the number of bytes that should be read.

read関数に数字の引数を与えることで、一定度の量のfileを読み込ませることができる。これによって、読み込ませるバイト(2進法、2の8乗分の情報)を決めることができる。

You can make more calls to read on the same file object to read more of the file byte by byte.With no argument,read returns the rest of the file.

同じfileオブジェクトを読み込むために、もっと多くの呼び出しを行うことができます。引数を指定しないと、readはファイルの残りの部分を返します。

 

file=open("newfile.txt","w")

file.write("This is a new shit.")

file = open("newfile.txt","r")

print(file.read(1))

>>>T

print(file.read(2))

>>>hi

print(file.read())

>>>s is a new shit.

 

ご覧の通り、fileオブジェクトは文字列itemを格納したiteratorであることがわかる。

 

【SoloLearn】例外&ファイル-Files

f:id:pokita:20180527162737p:plain

SoloLearn-Exception & Files-Opening Files

 

fileオブジェクト、はじめは苦手意識があったから避けてたけど、理解したらこれが一番たのしい。「そのためにも、まずは実際回す必要があるんだけど、テキストファイルを作るのはちょっと……」な人は安心してほしい。PyCharmなら、作成したfileオブジェクトはPycharmフォルダ内のプロジェクトフォルダ直下(の現行フォルダ)に保存されるため、見失うこともなければ、数を意識せず自由に作成可能!

f:id:pokita:20180604232940j:plain

f:id:pokita:20180604233107j:plain

ぜひ伸び伸びとファイル作って遊びながらやってみてください。

 

まずは第1項。

 

Text file are the easiest to manipulate .Before a file can be edited, it must be opened, using the open function.

テキストファイルを操作するのはとても簡単です。fileオブジェクトは、open関数を使って開かなければ編集することができません。

The argument of the open function is the path to the file. If the file is in the current working directory of the program,you can specify only its name.

open関数の引数はファイルへのパスです。もし、ファイルが現行のプログラムの直下にあるならば、その名前を特定するだけで大丈夫です。

 

myfile = open("filename.txt")

 

次に第2項。

 

You can specify the mode used to open a file by applying a second argument to open function.

open関数の2番めの引数で、オープンするfileのモードを決定することができます。

Adding "b" to a mode opens it in binary mode, which is used for non-text files(such as image and sound file).

モードに"b"を追加することで、fileをバイナリモードで開くことができます。これは、テキスト以外(例えば絵や音楽file)に使われます。

 

コード例は飛ばします。簡単すぎるので。

 

最後に第3項。

 

Once a file has been opened and used,you should close it.

This is done with the close method of the file object.

一度fileオブジェクトを開き使ったら、それを閉じるべきです。これはfileオブジェクトのcloseメソッドで行うことができます。

 

file = open("filename.txt","w")

file.close

 

Pythonの場合は、対応するリファレンスがなくなれば、即座にオブジェクトは破棄されるため、closeを行う必要は基本的にない。

けど、意図しない上書きを防ぐためや、「もうこのfileは使わない」という意思を明示するためにも、使わないよりは使ったほうが得。

 

 

【SoloLearn】関数プログラミング-Decorators

f:id:pokita:20180527162737p:plain

SoloLearn-Functional Programming-Decorator

 

こんなの【初めてのPython】でも見たことない!!!ってPython3からの登場らしいし当たり前か。本文の英語がネイティブでも意味わからないらしくて、批難のコメントで溢れかえっている本項。2巡目のぼくでもけっっこう分からなかったゾ…。

まずは第1項。

 

Decorators provide a way to modify functions using other functions.

This is ideal when you need to extend the functionality of functions that you don't want to modify.

デコレータは関数が他の関数を使えるように修正する方法を提供します。これは、修正したくない関数、の機能を拡張する必要があるとき理想的です。

 

うーんよくわからない。

実際に回してみる。

 

def decor(func):

  def wrap():

    print("==========")

    func()

    print("==========")

  return wrap #←関数の実行ではなく関数オブジェクト自身なことに注目

 

def print_text():

  print("Hello world!")

 

decorated = decor(print_text)

decorated()

>>>

==========

Hello world!

==========

>>>

 

decorated→decor関数をprint_text関数を引数に呼び出したときの戻り値→

wrap():

  print("==========")

  print_text()

  print("==========")

で定義されるwrap関数自身!!!!

つまり、変数decoratedには上記の関数自身が代入されているため、その関数を実行させるためには、decoratedではなくdecorated()とする必要がある。

のはわかったけど、その後に続く英文が意味不明。

 

We could say  that  the variable decorated is a decorated version of print_text-it's print text plus something.

この修飾された変数を、『修飾版print_text(関数)』と呼ぶことができる。これは、print_text(関数)に他(の機能)を追加したものだ。

In fact, if we wrote a useful decorator we might want to replace print_tex with the decorated version altogether so we always got our "plus something" version of print_text.

This is done by re-assigning the variable that contains our function.

実際、便利な修飾関数を書いたら、print_text関数をその修飾版にそっくり置き換えたくなるこもしれない。そうすれば、常に"何かしら拡張された"版のprint_text関数を得ることができる。

 

print_text = decor(print_text)

print_text()

Now print_text corresponds to our decorated version.

printで出力するものについてはすべてAの修飾をつける!というのであれば、一旦Aという修飾関数を作ったあと、出力関数prinntXを作り、printX=A(printX)とすることで、printX(変数)を上書きすることで、見かけ上printX関数の機能を拡張することができる。

 

 ってことか??

 

次に第2項。

 

In our previous example,we decorated our function by replacing the variable containing the function with wrapped version.

前項の例では、関数(print_text)を、ラッピングされたその関数(print_text)を含んだ変数に置き換えた。

 

Python proviedes support to wrap a function in a decorator by pre-pending the function definition with a decorator name and the @ symbol.

Pythonは、関数の定義の前に、修飾関数の名前と@をつけることで、修飾関数の中にその関数を包むことができるような機能をサポートしています。

 

???

実際に回してみる。

 

def decor(func):

  def wrap():

    print("==========")

    func()

    print("==========")

  return wrap 

 

@decor

def print_text():

  print("Hello world!")

 

 

print_text()

>>>

==========

Hello world!

==========

>>>

 

@decorをdef print_text()の先頭につけたことで、print_text関数は呼び出されると、decor(print_text)()が呼び出されることになる、ということ。

【SoloLearn】関数プログラミング-Decorators

f:id:pokita:20180527162737p:plain

SoloLearn-Functional Programming-Decorator

 

こんなの【初めてのPython】でも見たことない!!!ってPython3からの登場らしいし当たり前か。本文の英語がネイティブでも意味わからないらしくて、批難のコメントで溢れかえっている本項。2巡目のぼくでもけっっこう分からなかったゾ…。

まずは第1項。

 

Decorators provide a way to modify functions using other functions.

This is ideal when you need to extend the functionality of functions that you don't want to modify.

デコレータは関数が他の関数を使えるように修正する方法を提供します。これは、修正したくない関数、の機能を拡張する必要があるとき理想的です。

 

うーんよくわからない。

実際に回してみる。

 

def decor(func):

  def wrap():

    print("==========")

    func()

    print("==========")

  return wrap #←関数の実行ではなく関数オブジェクト自身なことに注目

 

def print_text():

  print("Hello world!")

 

decorated = decor(print_text)

decorated()

>>>

==========

Hello world!

==========

>>>

 

decorated→decor関数をprint_text関数を引数に呼び出したときの戻り値→

wrap():

  print("==========")

  print_text()

  print("==========")

で定義されるwrap関数自身!!!!

つまり、変数decoratedには上記の関数自身が代入されているため、その関数を実行させるためには、decoratedではなくdecorated()とする必要がある。

のはわかったけど、その後に続く英文が意味不明。

 

We could say  that  the variable decorated is a decorated version of print_text-it's print text plus something.

この修飾された変数を、『修飾版print_text(関数)』と呼ぶことができる。これは、print_text(関数)に他(の機能)を追加したものだ。

In fact, if we wrote a useful decorator we might want to replace print_tex with the decorated version altogether so we always got our "plus something" version of print_text.

This is done by re-assigning the variable that contains our function.

実際、便利な修飾関数を書いたら、print_text関数をその修飾版にそっくり置き換えたくなるこもしれない。そうすれば、常に"何かしら拡張された"版のprint_text関数を得ることができる。

 

printで出力するものについてはすべてAの修飾をつける!というのであれば、一旦Aという修飾関数を作ったあと、出力関数prinntXを作り、printX=A(printX)とすることで、printX(変数)を上書きすることで、見かけ上printX関数の機能を拡張することができる。

 

 

【SoloLearn】制御構造-for Loops

f:id:pokita:20180527162737p:plain

SoloLearn-Control Structures-for Loops

generator関数についての記事を書いていたら、迷走に迷走を重ねてしまいました。まったくfor構造のこと理解していなかったのが原因。ジェネレーターをやるよりも、まずはイテレータをマスターします。

 

まずは第1項。

 

Sometimes, you need to perform code on each item in a list. This is called iteration, and it can be accomplished with a while loop and counter variable.

各リストのなかの要素に作用するコードはイテレーションと呼ばれていて、数え上げ変数を使うことで、whileコードを使って実現することができる。

処理が一周回るたびに+1されていき、処理回数を記憶しておく変数。それがcounter variable。実際に回してみる。

 

words = ["hello", "world", "spam", "eggs"]

counter = 0

max_index = len(words) - 1

 

while counter < = max_index:

  word = words[counter]

  print(word + "!")

  counter = counter +1

>>>

hello!

world!

spam!

eggs!

>>>

 

できたはできたけど、記述が長い。それにカウンター変数、値が頻繁に変わるグローバル変数はあんまりよくない。

 

そこで第2項。

 

The same code from the previous example can be written with for loop, as follows:

同じようなコードがforを使って以下のように書けるよ。

実際に回してみる。

 

words = ["hello", "world", "spam", "eggs"]

for word in words:

  print(word + "!")

>>>

hello!

world!

spam!

eggs!

>>>

 

前よりも短いし、何より環境(グローバル変数)への影響がない。いいじゃん。

 

最後に第3項。

 

The for loop is commonly used to repeat some code a certain number of times. This is done by combining for loop with range object.

forループは主にあるコードを一定の回数処理させるために使います。これはrangeオブジェクトと組み合わせて行われます。

実際に回してみる。

 

for i in range(5):

  print("hello!")

>>>

hello!

hello!

hello!

hello!

hello!

>>>

 

どういう仕組になっているかわかりやすく書く。

for __代入ターゲット__ in 指定オブジェクト:

という構造になっており、

 

①forによる繰返し処理は指定オブジェクト内の要素(シーケンス)の数だけ行われる。

そのため、第3項の処理はrange(5)の要素[0,1,2,3,4]の個数=5回行われた。

②for以下の代入ターゲット変数には、指定オブジェクトの処理回数個目のindexによるシーケンスが代入される。

そのため、第2項の代入ターゲットには、指定オブジェクトのそれぞれの要素が次々と入った。

 

わかりやすく書くとこんなところ。(本当は少し異なるんだけど。)

詳しくは【初めてのPython】のfor編を見てみてね~~!