おッPythonやるのか?
ファイル拡張子oppython.py デフォUTF-8、全部オブジェクト(list,dict,set等のミュータブルなら参照になる点に注意、必要ならcopy())
#コメント、ドキュメントストリング(三連引用符):"""そのまま表示""" print mymod.__doc__で見れる
変数型不要:p = 500 * num、でもキャストは必要、定数はない
文字繰り返し、キャスト:"文字列" * 4 + str(p) + "Hi\nお元気ですか?\nSee u"
raw文字列でescしない:print(r"インストール先は c:\\code\python\bin です")
正規表現のrも同意 re_result = re.match('hel', r'hellow python, 123, end.' )
if re_result: #None以外という意味で、Noneはいわゆるnull、Pythonにnullはない
文字数:len("東京都")→3
文字列[開始:終了]→→ str = "Flower" print(str[1:4]) → low
文字列 % (値1, 値2, ...)→→ num= "10進数では %d 、16進数では %x " % (num, num)
"xxxx{index:書式指定子}xxxx".format(値)→→ "名は{:<8s}で年は{:>3d}で".format(name, age)
f"xxxx{値:書式指定子}xxxx"→→ f"名は{name:<8s}で年は{age:>3d}で"
0/空の文字列''/値なしはfalse、Noneは? x = None x is None→→true?
//→除算切り捨てし整数、**→べき乗
関数宣言はdef kansu(): で中で宣言する変数はローカル変数
関数外で宣言された変数はグローバル変数でどの関数の中でも扱えるようになる
なお関数内でもglobal henでグローバル変数を宣言できる
Pythonでのグローバル(global)変数の宣言方法 | UX MILK返り値複数はcsvでタプルになる、リストが楽か? return a,b → (a, b) あるいは return [a, b] → [a, b]
def func(a, b):
return a, b
result = func()
result[0]がa、result[1]がb
try/exceptを関数内で設定することも、逆に関数呼び出し時にも使用ができる、else, finally, raiseも使う、エラーが出ても止めたくない場合は try-except Exceptions as e、逆にexceptを入れなければ止まるので安全
try:
get_all_transfer(project_id)
excerpt Exception as e:
print(e)
置換は左辺が要る?要る a = a.replace('x','')
とほほのPython入門 - リスト・タプル・辞書 - とほほのWWW入門 (tohoho-web.com)Pythonの辞書とリストとクラス 複数情報の受け渡し|みはみ|noteリストa=[1,2,3]はmap(), filter(), reduce()等が使える
a=a.append()とかa=a.extend()は値がないんで駄目、単純にappend(b)やextend(b)で左辺不要
取得:a[0]、for v in a:
リストの合体:list_a += list_b
セット型set={1,2,3}は重複や順序や添字の無いリスト、set(list)でキャストし重複を無くせる、ミュータブルは格納できない
取得 for v in a:
tuple→タプルは定数リスト、更新無しならリストより速い a = 1,2,3 a = (1, 2, 3)
取得:a[0]、for num in a:
dict→辞書は連想配列みたいな{a:1,b:2}はitems(), keys(), valus(), iteritems(), get()を使える
Python | 辞書に含まれるすべてのキーと値を取得する (javadrive.jp) 取得:dict_a['key1']、for k in dict_a.keys(): for v in dict_a.values(): for k, v in dict_a.items():
dictの合体:dict_a.update(dict_b)
クラス→例えば●●クラスを宣言しsampleインスタンスを生成し、getter/setterで変数に入れて置く
取得:sample.key
BigQuery→別名を付ければ名前で取得できるが、インデックスでも取得できる(これ何?)
取得:for row in query_job: →row[0], row["t"]
lambdaは無名関数?
str_w = input('何か入力してください-->') #入力させた値を取れるが数字もstr
__iter__()はnext()を持つオブジェクトを返し、next()は次の要素を返し、最後に達するとStopIteration例外を返す?
yield はイテレータを返すジェネレータを定義?
@デコレータは関数を実行する前後に特殊な処理を実行したい場合?
withで終了処理を指定できる、ファイル読込とその後の処理とか
assertや__debug__はテストで機体通りかを確認する?
passは中身の無い関数やクラスを作成しkara.p=1で粋なり属性追加等ができる
execは引数の文字列をPythonとして実行 exec "print 'Hello'"
delはオブジェクトを削除 del x, y, z
継承やオーバーライド class MyClass2(MyClass):
多重継承class MyClassC(MyClassA, MyClassB): で纏めて使えるようになる
class MyClass:
"""A simple example class""" # 三重クォートによるコメント
def __init__(self): # コンストラクタ
self.name = ""
def __del__(self): #インスタンスが消滅する際に呼出でコンストラクタ
print "DEL!"
def __str__(self): #文字列化
return "My name is " + self.name
def getName(self): # getName()メソッド
return self.name
def setName(self, name): # setName()メソッド
self.name = name
class MyClass2(MyClass):
def world(self):
print "World"
class MyClass3(MyClass):
def hello(self): # 親クラスのhello()メソッドをオーバーライド
print "HELLO"
a = MyClass() # クラスのインスタンスを生成
a.setName("Tanaka") # setName()メソッドをコール
print a.getName() # getName()メソッドをコール
print a #=> My name is Tanaka 文字列化
b = MyClass2() #継承
b.hello() #=> Hello
b.world() #=> World
c = MyClass3() #オーバーライド
c.hello() #=> HELLO
super()を使ってオーバーライドする
super()は基底クラスのメソッドを継承した上で処理を拡張
super().__init__(x、y)が使える
if __name__ == "__main__":
モジュール時の勝手実行を抑える
import helloの時hello.py 内部での __name__ は "hello"
python hello.pyのような実行時hello.py の内部の __name__ は "__main__"
from math import pi, radians→mathモジュールから特定のオブジェクト(関数/変数/クラス)をimpo(math.piみたいに書かず省略できる)
import urllib.error→urllibパッケージからerrorモジュールをimpo、パッケージはフォルダ
import numpy as np→別名でしか使えなくなるnp.array()とかで
モジュール=ファイル名.pyでファイルをimpoしている
from {another_file} import {ClassName}
another_file.pyがファイル名
class ClassNameがクラス名
from {パッケージ:ディレクトリ} import {モジュール:ファイル}
ちゅー書き方もできるらしいが、どっち?
impo順:標準ライブラリ>サードパーティライブラリ>ローカルライブラリ(自作のライブラリ)
関数や変数:小文字スネークケース(sample_func)
クラス名、例外、型変数:キャピタルパスカルケース(SampleClass)
定数名:大文字アンダースコア区切り(SAMPLE_CONST)
モジュール名:小文字(samplemodule, sample_module)
パッケージ(フォルダ)名:小文字。アンダースコア非推奨(samplepackage)
インデントは半角スペース4つ
1行半角で79文字以内
トップレベルの関数やクラスは2行開ける
デバッグの方法案
print(type(v)) でどんなメソッドを持っているか等を探る
print(v) をコマンド前後や流れで沢山仕込みでどこでエラーが出ているか探す
print("creds:")
print(creds)
print("type(creds:")
print(type(creds))
print("vars(creds:")
print(vars(creds))
print("creds.keys():")
print(creds.keys())
print("dir(creds):")
print(dir(creds))
print("creds._dict_:")
print(creds.__dict__)
is not subscriptableのエラー 添字不可エラーでリストでないのにリストとして入れようとしている
※参照になりコピーされない、必要ならコピー(値を入れた時点で参照が外れるので実際問題少ない?)
a = []
b = a
b.append(1)
print(a) #[1]
https://qiita.com/ponnhide/items/cda0f3f7ac88262eb31e
https://nishiohirokazu.hatenadiary.org/entry/20120125/1327461670
環境変数を扱う
import os
print(os.environ["HOME"]) ホームディレクトリ、LANGでja_JP.UTF-8とか
os.environ["PHASE"] = "staging" 環境変数に代入できるのは文字列だけ
del os.environ["PHASE"] 削除
コマンドラインの引数を扱う
python3 sys_arg_test.py a 100
dst_prj = sys.argv[1] (aが入っている)
sys.argv (['sys_arg_test.py','a','100']
i = 0
v = "["
for s in list_v:
i += 1
if i > 1:
v += ","
v += "'" + s + "'"
v += "]"
SQL = "insert into aaa (aaa) value ({v})"
※テキスト選択
Shift↑or↓ で行全体
home(+fn)で行頭、end(+fn)で行末移動
【基礎一覧】Pythonの基本文法を全て解説してみた!【初心者】 (suwaru.tokyo)Python基本文法まとめ - QiitaとほほのPython入門 - とほほのWWW入門 (tohoho-web.com) Python入門 ~Pythonのインストール方法やPythonを使ったプログラミングの方法について解説します~ | Let'sプログラミング (javadrive.jp)Welcome to Python.orgHTMLの中に少し埋め込めず、基本的にプログラムの中にHTMLを埋め込む:CGI(Perl然)
さくらインターネットでPython CGI (mwsoft.jp)WSGI
Python で WSGI (Web Server Gateway Interface) に従ったシンプルな Web サーバで Hello World - QiitaPython用Webサイト用途フレームワーク:Flask(軽量)、Django
WSGI について — Webアプリケーションフレームワークの作り方 in Python (c-bata.link) GCPでどう使うかは不明だがホスティングは↓
ウェブ ホスティング | Google Cloud 静的ウェブサイトのホスティング | Cloud Storage | Google Cloudstr.split() 区切り文字で分割しリスト等に入れる
Pythonで文字列を分割(区切り文字、改行、正規表現、文字数) | note.nkmk.meprint('Sam' in 'I am Sam') # True 任意の文字列を含むか判定: in演算子
Pythonで文字列を検索(〜を含むか判定、位置取得、カウント) | note.nkmk.me==============
ここで動かせるgoogle colaboratory→
Colaboratory へようこそ - Colaboratory (google.com)半角スペース2個で改行
#の数で見出し
*で箇条書き
数字と.で番号を振る、- でリスト
* or - or _ を3つ以上で水平線
[ ]でチェックボックス、[x]でチェック
| td | td | td |でテーブル
**aaa**で太字、*aaa*で斜体
~~aaa~~で打消し線
[タイトル](URL)でリンク
```でコードの挿入、`でインライン挿入
> or >> で引用
[^1]で注釈
\バックスラッシュでマークダウンのエスケープ
==============
宗教論争(事実は同じでも他人の認知は違うので意味なし
if self.flag_ok == 1 and self.mode == '1'
↓一見で分からんなら変数名を工夫してこうやんな
if self.file_verify_completed and self.mode == GRANT_PERMISSION:
マジックナンバーを使わない(数字の方が曖昧性が無い場合も)
STATUS_ERROR = -1
STATUS_SUCCESS = 0
self.status_error = STATUS_SUCCESS
with構文で処理の前後でコンテキストマネジャ__enter__、__exit__が使われる
__enter__メソッドで事前処理
__exit__メソッドで事後処理
with ファイル操作や通信などの開始時の前処理と終了時の後処理など必須となる処理を自動で実行
try/finallyみたいなもの、最初と最後に何かしてくれる
class a(object):
def_enter_(self):
print 'sss'
return 'sss111'
def_exit__(self, type, value, traceback):
print 'ok'
return False
with a() as s:
print s
sss
sss111
ok
初期値をエラー値にし、業務判定エラーでステータスを設定したらreturnで抜ける
def exFunction(self):
self.status_error = STATUS_ERROR
try:
if XX = AAA:
self.status_error = STATUS_XX_ERROR
retrun
self.status_error = STATUS_SUCCESS
retrun
except:
~エラー処理、ステータスは変更しない
エラーメッセのハードコーディングを避ける方法(ハードが場所と内容が分かり易いかも)
MSG_ERROR_OLD_EMAIL = "Error: 旧メール%sです\n"
e_message_list.append(MSG_ERROR_OLD_EMAIL % (old_email))
self.error_message = '\n'.join(e_message_list)
ケチって分厚い本1冊にしたが全然進まぬ、薄い奴星e、?チッPython、誰がJSONじゃ~い、チェーンソー魔わすっぞ
続編、、モジュールとかmportとか、
/// BANGBOO BLOG /// - Python Python