#author("2019-05-05T02:48:57+00:00","","")
* Pythonの基礎 [#y618fbfd]
* Python [#rd7d27b1]
#setlinebreak(on);

#contents
-- 関連
--- [[Python覚え書き]]
--- [[Pythonのインストール]]
--- [[Python のパッケージング]]
--- [[Pythonのデコレータ]]
--- [[IPythonの使い方メモ]]
--- [[PythonでAWS DynamoDBのCRUDを書いてみる]]
--- [[Pythonのstrptimeが遅い]]
--- [[Pythonのチューニング]]
--- [[Pythonのパフォーマンス確認]]
--- [[FizzBuzzで頭の体操]]
--- [[pytest入門]]
--- [[OpenSSLで電子署名の生成と署名検証]]
--- [[pythonでWebサーバを書いてみる]]
--- [[Flaskの基礎]]
--- [[Djangoの基礎]]
--- [[pandas入門]]
--- [[numpy入門]]
--- [[PyTorch入門]]
--- [[TensorFlow入門]]
#html(<div style="padding-left: 20px;">)
[[Python覚え書き]] に統合
#html(</div>)

** 文字の利用 [#g5d33724]
#mycode2(){{
# 文字変数の宣言
strval="string"
strval='string'

# 文字列の連結
strval = 'str' + 'ring'   # string
strval = 'str' 'ring'     # string

# 文字列の反復
strval  = "string"
strval2 = strval*2     # stringstring

# 文字列の添字表記
strval1[0]      #'T'
strval1[0:2]    #'TE'
}}

** 数値の利用 [#i1f8efe6]
#mycode2(){{

# 数値変数の宣言
intval=100

# 整数の除算は floor (実数の解を越えない最大の整数) を返す:
intval = 7/3    ※2
}}

** リストの利用 [#x4c8a947]
#mycode2(){{
# リスト変数の定義
a = ['str1', "str2", 100, 1234]
a[0]   #str1
a[1]   #str2

# リスト内容の置換
a = ['str1', "str2", 100, 1234]
a[0:2] = [111, 222]  # a = [111,222,100,123]

# リスト数の取得
a = ['str1', "str2", 100, 1234]
len(a)   #4
}}

** タプルの利用 [#fb7d225b]
複数の値を ()で括るとtuple として纏める事ができる。
※これを利用して関数から複数の戻り値を返す事も可能。
※tupleの各要素へはリストと同じようにアクセス可能。
#mycode2(){{
vars = ("A", "B", "C", "D")
print(vars[0])  # A

# 複数の戻り値を返す関数
def func1():
  return (100, 200)


# 複数の戻り値を受け取る
nums = func1()              # 1つの変数でtupleとして受け取る
num1, num2 = func1()   # 個別の変数で受け取る
}}

タプルのサイズと同じ数の変数を用意すると、各要素を個別の変数で受け取る事ができる。
#mycode2(){{
var1, var2, var3, var4 = ("A", "B", "C", "D")
print(var1)  # A
}}

受取時にはリスト(*付き)変数で受け取る事も可能。
#mycode2(){{
first, *more, last = ("A", "B", "C", "D")
print(first)  # A
print(last)  #  D
}}

** if文 [#h42edcb6]
#mycode2(){{
if x < 0:
    x = 0
    print('Negative changed to zero')
elif x == 0:
    print('Zero')
elif x == 1:
    print('Single')
else:
    print('More')
}}


** for文 [#c69ffd4a]
#mycode2(){{
 list1 = ['cat', 'window', 'defenestrate']
 for x in list1:
     print(x, len(x))
}}

# zip を使って2つのリストを処理する
#mycode2(){{
names = ["Taro", "Hanako", "Ichiro"]
sexes = ["man", "woman", "man"]

for name, sex in zip(names, sexes):
    print(f'{name} is a {sex}')

}}

** pass 文 [#q172fff8]
#mycode2(){{
pass  # なにもしない
}}

** 関数の利用 [#v92b2fd1]
#mycode2(){{
# 戻り値のない関数
def hello(x,y):
    print("hello world!")
 
# 戻り値のある関数
def add(x,y):
    return x + y
}}

** classの利用 [#e99b8b3d]
#mycode2(){{

class Sample():

    class_var1 = "class var1"  # クラス変数

    def __init__(self):
        self.instance_var1 = "instance var1"  # インスタンス変数

    @staticmethod
    def static_method():
        print("static method")

    @classmethod
    def class_method(cls):
        print("class method")
        print(f'class_var1 is "{cls.class_var1}"')

    def instance_method(self):
        print("instance method")
        print(f'instance_var1 is "{self.instance_var1}"')


# クラス変数への値のセット
Sample.class_var1 = "this is class var1!"
print(Sample.class_var1)

# インスタンス変数への値セット
obj = Sample()
obj.instance_var1 = "ABC"  # public変数として扱う
obj.instance_var2 = "DEF"  # 未定義のインスタンス変数を外から設定する事も可能
print(obj.instance_var1)
print(obj.instance_var2)
print(obj.class_var1)      # クラス変数も参照可能

# staticメソッドの呼び出し
Sample.static_method()

# インスタンスメソッドの呼び出し
obj.instance_method()

# クラスメソッドの呼び出し
Sample.class_method()
}}

private変数はアンダーバー2つ(または1つ)で始まる変数名で定義する。
※privateメソッドも同様。
#mycode2(){{
class Sample():

    def __init__(self):
        self.public_var1 = "public var1"      # publicなインスタンス変数
        self.__private_var1 = "private var1"  # privateなインスタンス変数

    def get_private_var1(self):
        return self.__private_var1


obj = Sample()
print(obj.public_var1)
print(obj.get_private_var1())
print(obj.__private_var1)       # エラー
}}
 
#TODO(__class__ と __dict__ について)
#TODO(@property, @xxxx.setter, @xxxx.deleter)
#TODO(setattr)

** モジュールの利用 [#me2895d5]

echotest.py
#mycode2(){{
def echo1():
    print("test1!")

def echo2():
    print("test2!")
}}

&br;

#mycode2(){{
# モジュールのインポート (拡張子を覗いたファイル名を指定)
import echotest

# モジュールで定義されたメソッドの利用
echotest.echo1()

# ローカルな名前に代入して利用
method1 = echotest.echo1
method1()
}}

** パッケージについて [#u26fe08a]
#TODO( __init__.py など)


** モジュール検索について [#i0a22cb3]
・モジュールはカレントディレクトリ、環境変数 PYTHONPATH の順に探される。
・実際には、モジュールは変数 sys.path で指定されたディレクトリのリストから検索される。

** パッケージの利用 [#h133d1e1]
パッケージ (package) は、Python のモジュール名前空間を 
``ドット付きモジュール名 (dotted module names)'' を使って構造化する手段。

** モジュール検索PATHの追加 [#w1b02748]

#mycode2(){{
import sys,os
sys.path.append('ディレクトリ')
}}

** ファイル一覧 [#q322dc9e]
#mycode2(){{
# coding: utf-8

import sys,os
import glob
import re

path = os.path.abspath(os.path.dirname(__file__))

# globで検索
files = glob.glob(path + "/*.md")
for file in files:
    print(file)

# os.listdirで検索
pattern = r".*\.md$"
files = os.listdir(path)
for file in files:
    match = re.match(pattern , file)
    if match:
        print(file)
}}

** 呼び出し元ファイルのフルパスを取得する [#z9cf44ba]
#mycode2(){{
呼び出し元ファイルのフルパスを取得する

import inspect

print(inspect.stack()[1].filename)
}}

** 簡易Webサーバ [#h7ca0ee1]

サーバロジックを書きたい場合は [[pythonでWebサーバを書いてみる]] を参照。

#myterm2(){{
python -m http.server 8000 -b localhost
}}
※-b を指定しない場合は、localhost 以外にも公開される。( -b 0.0.0.0 と同じ)


トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS