LoginSignup
1
3

More than 3 years have passed since last update.

pythonメモ

Last updated at Posted at 2016-09-22

python書くときの自分用メモ。
主に以下のページで勉強した際のもの。
http://www.tohoho-web.com/python/index.html

python.py
#!/usr/bin/python3
# -*- coding: utf-8 -*-

#以下参照
#  http://docs.python.jp/3/library/functions.html
#  http://www.tohoho-web.com/python/index.html
#  http://docs.python.jp/3.5/


print("pythonでは先頭に文字コードを書かないとエラーになるらしい")


"""
複数行コメント
本来は文字列リテラルだが、コメントとしても使われるらしい
"""


print("\n\n----------")
print("○importとprint")
import random
num = random.randint(1,10)
print("numは"+str(num))


print("\n\n----------")
print("○if文")
if num == 1:
    print("numは1だよ")
elif num < 5:
    print("numは5以下だよ")
else:
    print("その他だよ")


print("\n\n----------")
print("○while文")
n = 0
while n < 3:
    print("while "+str(n))
    n += 1
else:
    print('while END')
print("while文にelseを書くと、whileの条件に合致しなくなって抜けた場合にelseが実行されます。")
print("最初から条件に合わない場合も実行されます。")
print("break等で抜けた場合は実行されません。")


print("\n\n----------")
print("○for文")
for n in [1, 2, 3]:
    print(n)                 # => 1, 2, 3
else:
    print("END")
for n in (1, 2, 3):
    print(n)                 # => 1, 2, 3
for k,v in {'one': 1, 'two': 2, 'three': 3}.items():
    print(str(k)+":"+str(v)) # => one:1, two:2, three:3
for c in "123":
    print(c)                 # => 1, 2, 3
for line in open("data.txt"):
    print(line)              # => 1行ずつ表示
for n in range(3,6):
    print(n)                 # => 3, 4, 5
for c in 'あいうえお':
    print(c)                 # => あ, い, う, え, お

print("for文にもelseを書くことが出来ます。")
print("意味はwhileと同じです。")
for x in range(2, n):
    if n % x == 0:
        print(n, 'equals', x, '*', n//x)
        break
else:
    # loop fell through without finding a factor
    print(n, 'is a prime number')


print("\n\n----------")
print("○printfっぽい方法")
errmsg = "文字列"
errcode = 12
msg = "文字列を作る段階でprintfっぽいことができます [%s] (%d)" % (errmsg, errcode)
print(msg)
print("%(name)s is %(age)d years old." % {'age': 28, 'name': "Tanaka"})


print("\n\n----------")
print("○リストとfor文")
a = [1, 2, "AAA", 4, (1+3j)*(2+2j)]
print('0から数えて3番目は'+str(a[3])) # => 4
print("1から2番目(3番は含まず)はスライスを使って"+str(a[1:3])) # => [2, 'AAA']
print("開始や終了を省略できます。2番目までは"+str(a[:3])) # => [1, 2, 'AAA']
print("負の値も使えます。後ろから2番目まで(ただし2番目自体は含まない)は"+str(a[:-2])) # => [1, 2, 'AAA']
print("刻み幅(ステップ)も変えられます"+str(a[0:1:2])) # => [1, 'AAA']
print("刻み幅も負の値が使えます"+str(a[::-1])) # => [(-4+8j), 4, 'AAA', 2, 1]

print("値も変えられます")
print("  変更前:"+str(a)) # => [1, 2, 'AAA', 4, (-4+8j)]
a[1]=999
print("  変更後:"+str(a)) # => [1, 999, 'AAA', 4, (-4+8j)]
print("追加もできます。")
a.append(777)
print("  変更後:"+str(a)) # => [1, 999, 'AAA', 4, (-4+8j), 777]

for n in a:
    print("[for文]"+str(n)+"だよ")

print("list結合" + str([1, 2, 3] + [4, 5, 6])) # => [1, 2, 3, 4, 5, 6]
print("len()で長さを求めます"+str(len([1, 2, 3]))) # => 3

a = [[1, 2], [3, 4], [5, 6]]
a.append([7,8])
print("多重リストもOK"+str(a)) # => [[1, 2], [3, 4], [5, 6], [7, 8]]
for line in a:
    for n in line:
        print(str(n)+" ", end="")
    print("") # => 1 2
              #    3 4
              #    5 6
              #    7 8
print("a[2][1]は"+str(a[2][1])) # => 6


print("\n\n----------")
print("○タプル")
a = (11,22,33,)
print("リストの固定値版のタプルというものがあります"+str(a))
print("0から数えて1番め"+str(a[1])) # => 22
#a[1]=12 # => エラー


print("\n\n----------")
print("○辞書")
d = {'Yamada': 30, 'Suzuki': 40, 'Tanaka': 80}
print("辞書(連想配列)もあります"+str(d))
print("Yamadaは"+str(d["Yamada"]))
for key,val in d.items():
    print("[for文]"+key+"は"+str(val))


print("\n\n----------")
print("○関数")
def doublefunc(x):
    return x * 2
print("7をdoublefuncにかけると"+str(doublefunc(7))) # => 14
a = [1, 2, 3]
print(str(a)+"をdoublefuncにかけると"+str(doublefunc(a))) # => [1, 2, 3, 1, 2, 3]


print("\n\n----------")
print("○map")
print("mapは各要素をそれぞれ処理した結果を返します")

print("・関数方式")
print(map(doublefunc, a))       # => map object
print(list(map(doublefunc, a))) # => [2, 4, 6]

print("・lambda方式")
print(map(lambda x: x * 2, a))       # => map object
print(list(map(lambda x: x * 2, a))) # => [2, 4, 6]

print("・内包表記")
print([x * 2 for x in a]) # => [2, 4, 6]

print("○filter")
print("filterは各要素をそれぞれ処理して、真なものだけ返します")
a = [1, 2, 3]
def kisuucheck(x): return x % 2
print("・関数方式")
print(filter(kisuucheck, a)) # => filter object
print("奇数のものは"+str(list(filter(kisuucheck, a)))) # => [1, 3]
print("・lambda方式と内包表記は省略")


print("○reduce")
print("reduceは1つ目と2つ目の要素を処理し、その結果と3つ目を処理し…と繰り返す")
print("でもあまり使われないからかpython3ではimportしてからでないと使えません")
from functools import reduce
a = [1, 2, 3, 4, 5]
def add(x, y): return x + y
print(reduce(add, a))                # => 15 : 関数方式
print(reduce(lambda x, y: x + y, a)) # => 15 : lambda方式

print("○内包表記")
a = [1, 2, 3]
print([x * 2 for x in a])           # => [2, 4, 6]
print([x * 2 for x in a if x%2==1]) # => [2,6]
print([[x, x * 2] for x in a])      # => [[1, 2], [2, 4], [3, 6]]
print([(x, x * 2) for x in a])      # => [(1, 2), (2, 4), (3, 6)]
a = [[1, 2], [3, 4], [5, 6]]
print([[x[0]*2,x[1]*3] for x in a]) # => [[2, 6], [6, 12], [10, 18]]

print("○セット")
print("セット(set)は重複の無いリストです")
a = set(['red', 'blue', 'green'])
b = set(['green', 'yellow', 'white'])
print("set aは"+str(a))                    # => set(['red', 'blue', 'green'])
print("set bは"+str(b))                    # => set(['green', 'yellow', 'white'])
print("a-bは"+str(a-b))                    # => set(['red', 'blue'])
print("a|bは"+str(a|b))                    # => set(['red', 'blue', 'green', 'yellow', 'white'])
print("a&bは"+str(a&b))                    # => set(['green'])
print("a^bは"+str(a^b))                    # => set(['red', 'blue', 'yellow', 'white'])
print("'green' in aは"+str('green' in a))  # => True
a.add('black')
print("aにblackを追加したら"+str(a))       # => set(['red', 'blue', 'green', 'black'])
a.add('black')
print("さらにaにblackを追加したら"+str(a)) # => set(['red', 'blue', 'green', 'black'])


print("\n\n----------")
print("○予約後とか組み込み関数名は上書きできてしまうので注意")
print("list([1,2])は"+str(list([1,2]))) # => [1,2]
list_temp = list
list = doublefunc
print("list([1,2])は"+str(list([1,2]))) # => [1,2,1,2]
list = list_temp
print("list([1,2])は"+str(list([1,2]))) # => [1,2]


print("\n\n----------")
print("○例外処理")

mystring = 'ABC'
try:
    c = mystring[5]                    # 5番目の文字が無いので、IndexError例外が発生します
except IOError:
    print('IOError')              # IOError例外の場合、このブロックが実行されます
except IndexError:
    print('IndexError')           # IndexError例外の場合、このブロックが実行されます
except:
    print('Unknown')              # 上記以外の例外の場合、このブロックが実行されます
else:
    print('Error not occur')      # 例外が発生しなかった場合、このブロックが実行されます
finally:
    print('Finally')              # 常に、このブロックが実行されます

try:
    f = open('sample.txt', 'r')
except:
    print('cannot open sample.txt')
else:
    lines = f.readlines()

try:
    raise SystemError("Sorry, my fault!")
except SystemError as e:
    print("SystemError")
    print(e)


print("\n\n----------")
print("○with")
print("with内で処理をするとオブジェクトの終了処理を自動で行ってくれる")
# withを用いない書き方
f = open("data.txt")
print(f.read())
f.close()

# withを用いた書き方1
with open("data.txt") as f:
    print(f.read())

# withを用いた書き方2
f = open("data.txt")
with f:
    print(f.read())


print("\n\n----------")
print("○pass")
print("passは何もしません 空の関数を作る時などに使います")
def myfunc():
    pass
class MyClass:
    pass


print("\n\n----------")
print("○del")
print("delはオブジェクトを削除します")
x = 5
y = [1, 2, 3]
z = MyClass()
del x, y, z


print("\n\n----------")
print("○printでファイルに出力")
f = open("gomi.txt", "a")
print("Hello world!", file=f)
f.close()


print("\n\n----------")
print("○exec")
print("execで文字列を実行できます")
exec("print('hello')")


print("\n\n----------")
print("○関数")
print("関数の引数は名前指定で渡すことも出来ます")
print("また、引数のデフォルトの値も決められます")
def repeat_msg(msg, repeat=2, a=1):
    for i in range(repeat):
        print(msg+" a="+str(a))
repeat_msg('Hello')      # => Hello a=1, Hello a=1
repeat_msg('Yahho', a=5) # => Yahho a=5, Yahho a=5

print("c言語のargvみたいなことも出来ます")
def func(a1, a2, *args, **params):
    print(a1)        # => A
    print(a2)        # => B
    print(args)      # => ('C', 'D')
    print(params)    # => {'k1': 'K1', 'k2': 'K2'}
func('A', 'B', 'C', 'D', k1='K1', k2='K2')

args = ('C', 'D')
params = {'k1': 'K1', 'k2': 'K2'}
func('A', 'B', args, params)     # => A, B, (('C', 'D'), {'k2': 'K2', 'k1': 'K1'}), {}
func('A', 'B', *args, **params)  # => A, B, ('C', 'D'), {'k1': 'K1', 'k2': 'K2'}

print("複数の値を返すことも出来ます")
def func():
    return 3, "ABC"

n, s = func()
print(n, s) # => 3 ABC


print("\n\n----------")
print("○グローバル変数")
print("グローバル変数を関数内で普通には参照も変更もできません")
print("global宣言すると変更できるようになります")
count = 0                   # グローバル変数
def func():
    global count            # これをしないと変更は出来ない
    print(count)            # 参照することはできる
    count += 1
    print(count)
func()

print("すべてのグローバル変数とローカル変数はglobals()とlocals()で取得できます")
def func():
    for k in globals().keys():
        print("GLOBAL: %s = %s" % (k, globals()[k]))
    for k in locals().keys():
        print("LOCAL: %s = %s" % (k, locals()[k]))
func()

print("\n\n----------")
print("○ラムダ式")
print("ラムダ式とは名前のない小さな関数です。")
print("コロンより手前が引数、後ろが戻り値です。")
myfunc = lambda x, y: x + y
print(myfunc(3, 5)) # => 8


print("\n\n----------")
print("○イテレータ")
print("イテレータはfor文で使える繰り返し機能を持つオブジェクトです")
print("__init__()には最初に1回だけやる処理を書きます")
print("__iter__()ではオブジェクトを返します")
print("__next__()で次の要素を返却します 最後に達するとStopIteration例外を返すようにします")
class Fib:
    def __init__(self, max):
        self.max = max
        self.a = 0
        self.b = 1
    def __iter__(self):
        return self
    def __next__(self):
        fib = self.a
        if fib > self.max:
            raise StopIteration
        self.a, self.b = self.b, self.a + self.b
        return fib
for n in Fib(3):
    print(n)                     # => 0, 1, 1, 2, 3

print("上記は以下を自動的にやってくれています")
it = Fib(3).__iter__()
while 1:
    try:
        n = it.__next__()
        print(n)                 # => 0, 1, 1, 2, 3
    except StopIteration:
        break

print("\n\n----------")
print("○ジェネレータ")
print("次の要素が使われるときに計算するので、配列を作って渡すよりもメモリや処理効率が改善されるみたい")
def funcB(list):
    for n in list:
        yield n * 2
for n in funcB([1, 2, 3, 4, 5]):
    print(n)                     #=> 2, 4, 6, 8, 10

def readfileB(f):
    for line in f:
        yield line.rstrip()
f = open("data.txt")
for line in readfileB(f):
    if (line == "__END__"):
        break
    print(line)
f.close()



print("\n\n----------")
print("○デコレータ")
print("関数実行前後に処理を追加出来ます")

def mydecolater(func):
    import functools
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print("Funcname:", func.__name__)
        print("Arguments:", args)
        print("Keywords:", kwargs)
        ret = func(*args, **kwargs)
        print("Return:", ret)
        return ret
    return wrapper

@mydecolater
def func(msg1, msg2, flag=1, mode=2):
    """A sample function"""
    print("----", msg1, msg2, "----")
    return 1234

n = func("Hello", "Hello2", flag=1)
print(n)

print(repr(func))
print(func.__doc__)


print("\n\n----------")
print("○クラス")

class MyClass(object):
    """A simple example class"""         # 三重クォートによるコメント

    PI=3.14                              # クラス変数

    def __init__(self):                  # コンストラクタ
        self.name = ""                   # nameはインスタンス変数

    def getName(self):                   # getName()メソッド
        return self.name

    def setName(self, name):             # setName()メソッド
        self.name = name

a = MyClass()                            # クラスのインスタンスを生成
a.setName("Tanaka")                      # setName()メソッドをコール
print(a.getName())                       # getName()メソッドをコール

print("Python では private や protected などのスコープを制御する機構は実装されておらず、クラス変数、インスタンス変数はすべてどこからでも参照可能(public)となります。")
print("クラス変数やインスタンス変数は直接書き換えられます")
MyClass.PI=3.141592
a.name="Tanaka2"

print("動的に追加も可能")
MyClass.myPI=3
a.age=18

print("インスタンス変数が存在しない場合、「インスタンス.変数名」はクラス変数を参照することに注意してください。")
print(a.PI) # PIというインスタンス変数は無いので、クラス変数が参照される。

print("「インスタンス.変数名」に値を代入した時点でインスタンス変数が生成され、以降はインスタンス変数が参照されます。")
a.PI=333 # クラス変数のPIとは別にインスタンス変数のPIができる。
print(a.PI) # => 333 インスタンス変数
print(MyClass.PI) # => 3.141592 クラス変数

print("dir()を使うといろいろ表示されます")
print("MyClass : "+str(dir(MyClass)))
print("MyClass : "+str(dir(a)))


print("\n\n----------")
print("○privateっぽい変数")
class MyClass2(object):
    _hidden_param=12
    __hidden_param2=34
print("クラス内の変数で、頭にアンダーバーが付いているものは外からはアクセスしないという慣習的なルールがあります。でもアクセスできます。")
print("2つついているとクラス内では普通にアクセス出来ますが、外からは普通にはアクセスしにくくなります。微妙に名前が変わって、「_クラス名__変数名」になります。")
print("MyClass2._hidden_param="+str(MyClass2._hidden_param))
#print("MyClass2._hidden_param="+str(MyClass2.__hidden_param2)) #←これはエラーになる
print("MyClass2._hidden_param="+str(MyClass2._MyClass2__hidden_param2)) #←これはOK


print("\n\n----------")
print("○コンストラクタとデストラクタと文字列化")
class MyClass3(object):
    def __init__(self, name):
        self.name = name
        print("welcome "+str(self.name))

    def __str__(self):
        return "name is "+self.name

    def __del__(self):
        print("byebye "+str(self.name))

a = MyClass3("Tanaka")
print(a) # __str__として定義されたメソッドが自動的に呼ばれる。
del(a)


print("\n\n----------")
print("○継承")
class MyClass:
    def hello(self):
        print("Hello")

class MyClass2(MyClass):
    def world(self):
        print("World")

a = MyClass2()
a.hello()                   #=> Hello
a.world()                   #=> World

print("メソッドのオーバーライト")
class MyClass:
    def hello(self):
        print("Hello")
class MyClass2(MyClass):
    def hello(self):        # 親クラスのhello()メソッドをオーバーライド
        print("HELLO")

a = MyClass2()
a.hello()                   #=> HELLO

print("super")
class MyClass1(object):
    def __init__(self):
        self.val1 = 123
    def pripri(self):
        print("print1")
class MyClass2(MyClass1):
    def __init__(self):
        super(MyClass2, self).__init__()
        self.val2 = 456
    def pripri(self):
        super(MyClass2, self).pripri()
        print("print2")

a = MyClass2()
print(a.val1)                #=> 123
print(a.val2)                #=> 456
a.pripri()

print("多重継承")
class MyClassA:
    def funcA(self):
        print("MyClassA:funcA")
class MyClassB:
    def funcB(self):
        print("MyClassB:funcB")

class MyClassC(MyClassA, MyClassB):
    def funcC(self):
        print("MyClassC:funcC")

a = MyClassC()
a.funcA()                    # MyClassA のメソッドも
a.funcB()                    # MyClassB のメソッドも使用できる
a.funcC()


print("\n\n----------")
print("○モジュール")
import mymodule
mymodule.myfunc()

print("パッケージについては省略。")

print("ファイル名"+str(__file__))
print("__name__でモジュール名の表示が出来ます。スクリプトで起動された場合は__main__になります。str(__name__)="+str(__name__))


print("\n\n----------")
print("○pprint")
print("配列等の情報を見やすく表示するにはpprintを使います")
from pprint import pprint
aaa = [0, 1, 2]
ppp = {'taro':{'age': '21', 'name': 'tanaka'}, 'jiro':{'age': '18', 'name': 'tanaka2'},}
pprint(aaa) #=> [0, 1, 2]
pprint(ppp) #=> {'jiro': {'age': '18', 'name': 'tanaka2'},
            #    'taro': {'age': '21', 'name': 'tanaka'}}

import os
print("現在のパスは"+os.getcwd())


print("\n\n----------")
print("○デバッグ用print")
print("デバッグ時のみ表示したいようなものは以下のようにすればよい(良いやり方か不明)。")

def null_function(x):
    return

myprint=null_function
#myprint=print

myprint("hoge")


print("\n\n----------")
print("○文字列の一部変更")
print("C言語のようにtext[2]='x'等とすることは出来ません。")
print("strがimmutableのためです")
print("一度リストに変換してから変更したり、スライスで操作します。")
print("参考 : http://minus9d.hatenablog.com/entry/20130528/1369745960")

text="test string"
#text[2]='S'#これはNG

temp=list(text)
temp[2]='S'
text="".join(temp)
print(text) #=> "teSt string"


print("\n\n----------")
print("○引数の値渡しと参照渡し")
print("関数の引数は値渡しの場合と参照渡しの場合があります。")
print("C言語に似ていて、int,float等は値渡し、list,dict等は参照渡しになります。")
print("でもstrは値渡しです。")
print("参考 : http://amacbee.hatenablog.com/entry/2016/12/07/004510")
def func1(x):
    x[1]=999
y=[0,1,2]
print(y) #=> [0, 1, 2]
func1(y)
print(y) #=> [0, 999, 2]

print("\n\n----------")
print("○スクリプトファイルを途中で止め入力可能にする")
import code; code.InteractiveConsole(locals=dict(globals(),**locals())).interact()
mymodule.py
#!/usr/bin/python3
# -*- coding: utf-8 -*-

#モジュール

def myfunc():
    print("Hello!")
1
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3