SEワンタンの独学備忘録

IT関連の独学した内容や資格試験に対する取り組みの備忘録

【Python】入門④ Pythonの基本構文 その3(スライシング、関数など)

基本はその3までの予定です。

その1

www.wantanblog.com

その2

www.wantanblog.com

スライシング表現

ここでいうスライシングとは、「要素をまとめと表す」機能のこと。
紹介されている記号が「:」なこともあり、一番最初に思い付いたのはIPv6の省略表現の「:」これみたいな感じかと。

listやndarryに対して使います。

・例

import numpy as npy

list = npy.arange(15)
# 数列の場合
a = npy.array([[1,2],[3,4],[5,6]])

print(list[:5])
print(list[5:])
print(list[5:10])
print(a[:2])

・出力結果

[0 1 2 3 4]
[[1 2]
 [3 4]]

配列でも行列でもn番目の要素までを出力するようだ。
「:」の部分の数字を省略できる感じですか。なので
list[:n]は0からn番目まで
list[n:]はn番目から最後まで
list[n:m]はn番目からm番目までをそれぞれ出力することができる。

配列の中の条件を満たすデータの操作

Python配列では配列の中で条件に該当する要素を1処理で記述することができる。
書き方は簡単。

[配列] >2(条件)

・例

import numpy as npy

list = npy.array([1,2,3,4,10,11,12])

print(list > 2)

・出力結果

[False False  True  True  True  True  True]

条件に該当する要素のみを抜き出すこともできます。

・例

import numpy as npy

list = npy.array([1,2,3,4,10,11,12])

turelist = list[list > 2]

print(turelist)

・出力結果

[ 3  4 10 11 12]


試してみる

これまでの結果をみるに、形式が決まりきっているわけではないじゃないかって感じがしたので
boolのlistを手動生成し、それを条件に代替えしてみました。

import numpy as npy

alist = npy.array([1,2,3,4,10,11,12])
boollist = npy.array([False,False,True,True,True,True,True])

reultlist = alist[boollist]
falselist = alist[False]
truelist = alist[True]

print(boollist)
print("resultlist= " + str(reultlist))
print(falselist)
print(truelist)

・出力結果

[False False  True  True  True  True  True]
resultlist= [ 3  4 10 11 12]
[]
[[ 1  2  3  4 10 11 12]]


やっぱり条件の合致する要素を抜き出した結果と一致するようですね。
ちなみに単に「Flase」を条件に適用すると、該当なしのリストが、「True」を適用するとそのままのリストが得られるようです。


条件に合致する要素に操作を加える。

・例

import numpy as npy

alist = npy.array([1,2,3,4,10,11,12])
blist = npy.array([1,2,3,4,10,11,12])
clist = npy.array([1,2,3,4,10,11,12])

alist[alist > 2] = 10
blist[blist > 2] + 10
clist[clist > 2] = clist[clist > 2] + 10

print(alist)
print(blist)
print(clist)

・出力結果

[ 1  2 10 10 10 10 10]
[ 1  2  3  4 10 11 12]
[ 1  2 13 14 20 21 22]

条件に一致する要素を置き換えるには

alist[alist > 2] = 10

条件に一致する要素に処理を加えるには

clist[clist > 2] = clist[clist > 2] + 10

なんか書き方が汚い気がしますね。他にも書き方があったりするんでしょうか。

関数

他の言語でもありますが、処理を繰り返し行う場合などに関数を定義します。
とりあえず書いてみます。

関数の宣言

・例

message = "デフォルト"
def func():
    global message
    message = message + "関数の処理"
    print(message)

print(message)
func()

・出力結果

デフォルト
デフォルト関数の処理

java出身者から見たときの違和感がそのまま特徴と言える感じもします。後は「if」文とかと基本は一緒ですね。

・defと「:」により宣言する。

関数の区切りはインデントで表すこと

・普通のファイル内に定義した関数はそのままでは処理されず、関数外から呼び出すことで実行される。

・関数外に定義するグローバル変数は、宣言は通常通りでよいが、関数内で使用する場合は「global」で宣言する。

関数の引数と戻り値

・例

import numpy as npy
message = "デフォルト"

def func(num):
    global message
    message = message + "関数の処理"
    numlist = npy.arange(num)
    print("message = " + message)
    print("関数内のリスト = " + str(numlist))
    return numlist
    

print(message)
resultlist = func(10)
print(resultlist[:5])

・出力結果

デフォルト
message = デフォルト関数の処理
関数内のリスト = [0 1 2 3 4 5 6 7 8 9]
[0 1 2 3 4]

他の言語とかと同じような感覚で違和感はありませんね。


また、関数の戻り値は複数定義できるというのは一つ特徴かもしれません。

・例

import numpy as npy
message = "デフォルト"

def func(num):
    global message
    message = message + "関数の処理"
    numlist = npy.arange(num)
    print("message = " + message)
    print("関数内のリスト = " + str(numlist))
    return message, numlist
    

resultlist = func(10)
print(resultlist)

resultmessage, resultlist2 = func(5)
print(resultmessage)
print(resultlist2)

・出力結果

message = デフォルト関数の処理
関数内のリスト = [0 1 2 3 4 5 6 7 8 9]
('デフォルト関数の処理', array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]))
message = デフォルト関数の処理関数の処理
関数内のリスト = [0 1 2 3 4]
デフォルト関数の処理関数の処理
[0 1 2 3 4]

Pythonによるファイル操作

Pythonのファイル保存や読み取りはNumpyを用いることにより容易に実現できます。
但し、私が確認した範囲での注意点としては、ファイルはバイナリファイルで生成され、識別子は基本的には「.npy」のみという点です。

つまりは普通に手動で作成したtxtファイルなどは読み込みエラーが発生するし、txtファイルで保存しようとした場合には識別子「.npy」が自動でファイル名の後ろに付与されるので、作成したファイルを確認してみるということは困難です。

これらを実現したい場合には、別途調査が必要そうです。(※今回の方法でもやる方法はあるのかもしれませんが・・・)

・例

import numpy as npy

message = "ファイル保存用メッセージ"
# メッセージをファイルに保存する
npy.save('testfile.npy', message)
# ファイルの内容を読み取る
result = npy.load('testfile.npy')

print(result)

・出力結果

ファイル保存用メッセージ


ちなみにファイルの生成は確認できます。

f:id:wantanBlog:20191113002600p:plain

そのファイルを普通に開こうとするとやはりバイナリファイルになっています。

f:id:wantanBlog:20191113002656p:plain



基本編以上です。

一応他の言語(ほぼjavaのみですが)は触ったことはあるので、こうゆう場合はどのような処理を書くんだろうとか、こゆうこともできるんじゃないか?とか放置した部分は数えきれないのですが、それを全て試すといくら時間があっても足りないので一旦ここで締めます

後は、基本ばかりやっててもなかなか覚えきれないので、必要になり次第で調べたりまとめたりしようと思います。
まぁJSONの扱いについてだけはすごく気にはなっていたんですが参考書に載っていなかった・・・