Python3関連のことを調べてみた2020年01月18日

Python3関連のことを調べてみた2020年01月18日
目次

pythonでAtcoderするためのVS Codeデバッグ環境作ってみた

最近Atcoderデビューしたのですが、コードテストするときにあっちこっちタブ切り替えるのがちょっと面倒だったので…
VS CodeでF5デバッグできる環境を作ってみました。

# 環境

**VS Code**
バージョン: 1.41.1 (user setup)
コミット: 26076a4de974ead31f97692a0d32f90d735645c0
日付: 2019-12-18T14:58:56.166Z
Electron: 6.1.5
Chrome: 76.0.3809.146
Node.js: 12.4.0
V8: 7.6.303.31-electron.0
OS: Windows_NT x64 10.0.17763

**python**
Python 3.7.3

作業用ディレクトリを作成し、その中に以下のファイルを作成します。

“`python:make_directory.py
import os

for i in range(10):
folder_name1 = “ABC{:x<3}".format(i) os.mak

元記事を表示

万年歴の種:Zellerの合同式から或る日の曜日を得る

Zellerの合同式から、ある日の曜日が何曜日であるかを算出します。

“`calcal.py
#!/usr/bin/python3
import sys
import math
y = int(sys.argv[1])
m = int(sys.argv[2])
d = int(sys.argv[3])
youbia = [“日”, “月”, “火”, “水”, “木”, “金”, “土”]

if (m == 1 or m == 2):
md = m+10
yd = y-1
else:
md = m-2
yd = y

a = yd // 100
b = yd % 100
youbi = (math.floor(2.6*md-0.2)+d+b+math.floor(b/4)+math.floor(a/4)-2*a) % 7

print(“西暦”, y, “年”, m, “月”, d, “日は”, youbia[youbi], “曜日です。”,sep=””)

“`

出力例

“`
$ calcal.py 1967 5 12
西暦1967年5月

元記事を表示

[Python3 入門 11日目]6章 オブジェクトとクラス(6.1〜6.2)

#6.1 オブジェクトとは何か
– Pythonに含まれるオブジェクトは全てオブジェクト
– オブジェクトはデータ(変数、属性と呼ばれる)とコード(関数、メソッドと呼ばれる)の両方が含まれている。
– オブジェクトは何らかの具体的なものの一意なインスタンス(実体、実例)を表している。
– オブジェクトは名詞、オブジェクトのメソッドは動詞と考えることができる。オブジェクトは個別のものを、メソッドは他のものとどのようなやりとりをするかを定義する。

#6.2 classによるクラスの定義
– オブジェクトはプラスチックのボックスに喩えたが、**クラス**はそのような**ボックスを作るための鋳型**のようなもの。

“`py

#Personクラスの定義
>>> class Person():
… pass

#オブジェクトはクラス名を関数のように呼び出して作る。
>>> someone=Person()
>>> class Person():
… def __init(self):
… pass

#__init__()は

元記事を表示

[Python3]datetimeにタイムゾーンを指定するawareな方法

PCでコーディングしたプログラムをAWSのLambda関数で実行したら、`datetime.now()`で取得される時刻が異なることに気づきました。PCはJST時間、AWSはUTC時間のため9時間の差があることが原因です。
プログラムを変えずにPCでもAWSのLambda関数でも同じ結果を得るために、datetimeにタイムゾーンを指定する方法を調べました。

#環境
– Python 3.7.4

#問題の事象
例えば次のプログラムを実行すると、PCで取得される現在時刻と、AWSのLambda関数で取得される現在時刻に9時間の差異が発生します。9時間の差異なので、Lambda関数で実行するときには` + timedelta(hours=+9)`として9時間足せばいいのだけれど、それではPCからLambda関数に持っていくときにプログラムの修正が発生するので望ましくないため、プログラムを変更せずに同じ結果が得られるようにしたいと考えました。

“`python:lambda_function.py
from datetime import datetime, timezone, ti

元記事を表示

groupbyしてダミー変数化する方法

以下のようなデータを

“`
user_id,item_id
A,1
A,1
A,2
A,12
B,1
B,4
“`

以下のようなデータの形状に変換したい。

| | item_id_1 | item_id_2 | item_id_3 | item_id_4 | item_id_5 | item_id_6 | item_id_7 | item_id_8 | item_id_9 | item_id_10 | item_id_11 | item_id_12 |
|:–|:–|:–|:–|:–|:–|:–|:–|:–|:–|:–|:–|:–|
| A | 2 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| B | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |

データとしては、`item_id`の列に出てきた最大最小の値を両端として、その間の数値をカラム名として補完しながら、出現回数をカウントしたものである。

## csvの読み込み

“`py
import

元記事を表示

【対決! 人力 vs Python】結局、センター試験の数学はPythonで解くのと、自力で解くのと、どっちが速いのか?

# どこかで見たことあるネタだなと思ったら

やっぱり、先人がいました(ほかにもあるかも)。
**素晴らしい!**

* [2015年センター試験数学IAを全てプログラム(Python)で解く](https://qiita.com/akai_banana/items/b328fe0116d248127a36)
* [2015年センター試験数学ⅡBをPythonで解く](https://qiita.com/massa142/items/b224a07c1b33e9a39cd8)

# 1. センター試験に持ち込めるもの

以下が持ち込めるようですが、現時点で、**Pythonのインタプリタは持ち込めない**ようなので、注意が必要です。
開発者にとって、開発環境は鉛筆のようなものという主張も**通じない**と思います。
**※許可されているもの以外を持ち込むのは絶対に絶対にやめましょう!**

“`
* 黒鉛筆(H,F,HBに限る。和歌・格言等が印刷されているものは不可。)

元記事を表示

Django 開発者への道① ~ Modelsを理解する ~

### こんにちは。
### 普段は某ITスタートアップで、Djangoを使って、サービス開発をしています!!

## これからステップごとに、Django でプロダクトを開発していくために必要な技術を1からおさらいしていきます!

## 第一弾 ~ Modelsを理解する ~ 構成

1. Modelsの立ち位置
2. テーブルの作成
3. フィールドの追加

#### 尚、Djangoのプロジェクトは既に立ち上げてるという前提でお話をしていきます。

**以下のスキルセットは、既に習得している前提です。**

– virtualenvで仮想環境の構築ができる
– pip install でdjangoなどのライブラリのインストールができる
– django-admin startproject で プロジェクトを立ち上げることができる
– python manage.py startapp でアプリケーションをプロジェクトに追加することができる

## 1. Modelsの立ち位置

#### 今回は、モデルを理解していくために、 models.py に記述するDBのテーブルのフ

元記事を表示

GAE/Python の 2.7(gen1) から 3.7(gen2) への移行作業メモ

趣味で作った GAE/Python Python 2.7 のサービスを Python 3.7 に移行したときにやったことのまとめです。

## サービスの概要

– cronで定期的にクローリングしてDatastoreに格納
– cronから呼び出されるエンドポイントは `/_ah/` の`login: admin`の場所に設置
– DatastoreからRSSを動的生成

## cron.yaml → Cloud Scheduler

– App Engine HTTPで`/_ah/`のエンドポイントを指定することですぐに移行できた。
– gcloud コマンドでは、べき等にできないため、デプロイコマンドが作りづらい。

## Cloud ndb 移行

[ドキュメント](https://cloud.google.com/appengine/docs/standard/python/migrate-to-python3/migrate-to-cloud-ndb#updating)
[Migrating to Cloud NDB](https://cloud.google.co

元記事を表示

「統計」と「機械学習」の違いの整理で多くの事業会社で「機械学習」が使えない理由が視えてきた!

#統計と機械学習って結局何が違うの?なんで今日から機械学習で予測して金儲けできないの?
機械学習を勉強し始めるとおそらく誰もが疑問に思う。そして、なんで事業会社の多くが日々の業務で今日から使えないの?っていう疑問も出てくる。いろいろな文献があるがいまいち理解に困ったので自分なりに整理しなおした資料。情報を組み合わせてかなり自論を入れています。
This article explains why many companies cannot use machine learning approaches to drive business starting today…

#まずは統計と機械学習の考え方や向き不向きの違いを表にまとめてみた

![統計か機械学習かVer2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/56d3b2c0-4a3d-7ced-05fa-c974102ed460.png)

多くの人が言及しているが互いに関連しているとはいえ、最終目的が異なる。**「機械学習」は予

元記事を表示

HDF5のpython実装で文字列データを圧縮して保存するだけ

# これは何

HDF5でPython実装から文字列を圧縮して保存したいとき、 `str` ではなく 固定長 `bytes` を使いましょう。 `str` や可変長配列は圧縮されずに保存されている可能性があります。

# 経緯

あるとき、文字列データ(というか計算結果の出力ファイル)をHDF5形式でまとめておこうと思い立ちました。
せっかくなので容量節約のため、圧縮もかけておきたいと思います。

文字列長は不定なので、固定長は使わない方向で。

http://docs.h5py.org/en/stable/strings.html

こちらを参考にしつつ、

“`python
test_string = “hoge”*5
with h5py.File(“test.hdf5”, “w”) as f:
g = f.require_group(“test_group”)
# dt = h5py.special_dtype(vlen=str)
dt = h5py.string_dtype()
ds = g.cr

元記事を表示

[Python3 入門 10日目] 5章 Pyの化粧箱:モジュール、パッケージ、プログラム(5.4〜5.7)

#5.5 Python標準ライブラリ

– Pythonには様々な」役に立つ仕事をしてくれるモジュールを集めた大規模な標準ライブラリがある。

##5.5.1 setdefault()とdefaultdict()による存在しないキーの処理

– 存在しないキーで辞書にアクセスしようとすると例外が生成される。辞書のget()関数を使って、キーが存在しない場合はデフォルト値を返すようにすれば例外を避けられる。
– setdefault()関数はget()と似ているがキーがなければ更に辞書に要素を追加するところが異なる。
– defaultdict()関数は存在しない全てのキーに対してデフォルトの値を設定するところがget()と異なる。**引数は関数である。**また、存在しないキーを用いた場合、そのキーが自動で生成される。デフォルト値引数を省略するとデフォルト値はNoneになる。

“`py

>>> periodic_table={“Hydrogen”:1,”Helium”:2}
>>> print(periodic_table)
{‘Hydrogen’: 1, ‘Helium’: 2

元記事を表示

ジェネレーター内包表記 タプル内包表記

“`py:1
def g():
for i in range(10):
yield i

g = g()
print(next(g))
print(next(g))
print(next(g))
“`

“`:1の実行結果
0
1
2
“`
これを内包表記で書くと

“`py:ジェネレーター内包表記
g = (i for i in range(10))

for j in range(3):
print(next(g))
“`

“`:ジェネレーター内包表記の実行結果
0
1
2
“`

()で囲っているので一見、
タプルの様にも見えなくはない。
タプルの内包表記は下記の様になる。

“`py:タプルの内包表記
t = tuple(i for i in range(10))
print(t)
“`

“`:タプルの内包表記実行結果
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
“`

“`py:ジェネレーター内包表記2
g = (i for i in range(10))

for j in g:
pri

元記事を表示

関数内で例外が発生した場合、呼び出し元へ伝わる2

“`py:1
def test_exception(num):
print(1)
try:
print(2)
answer = 100 / num
return answer
print(3)
except ZeroDivisionError as e:
print(4)
raise e
print(5)

print(‘start’)
try:
test_exception(1)
print(6)
except ZeroDivisionError as e:
print(7)
raise e
finally:
print(‘end’)
“`

“`:1の実行結果
start
1
2
6
end
“`

print(‘start’)を
最初に実行。

次に、
tryブロックを実行する。
tryブロック1行目のtest_exception関数に引数1で入る。
なので、
print(1)を実行し、
test_exce

元記事を表示

random.randint(a,b) と np.random.randint(a,b) を入れ替えると分析結果が正反対になってしまった!

#実は違っていた!random.randint(a,b) と np.random.randint(a,b)

Pythonでよく使われているライブラリでこんなことがあるのかとハマってしまった件。
次のGoogle Collaboratory で実行可能な単純なコードを見てもらいたい。
広く使われている一般的なライブラリを呼び出しているだけだし
式的には全く同じように見えるのですが、
出力結果が似ていて実は異なる結果になっていることを。

We need some caution when using randint whether this function is called from random library or numpy library. The result will be very different !!

“`
import random
import numpy as np

for i in range (500):
print (np.random.randint(0,37))

for j in range (500):
print (ran

元記事を表示

Pythonのpyqtgraphを使う

##経緯
グラフを描画するにはmatplotlibを使えばいいが、リアルタイムでグラフを更新する際はより高速なpyqtgraphを使った方が良さそう.
matplotlibも工夫次第では、高速処理ができるみたいだが、よく分からない.
##環境
python 3.7
##ソースコード
三つのデータをそれぞれ表示し、1秒後にデータの先頭要素が消えていき、その流れを描画する.

“`py
from pyqtgraph.Qt import QtGui, QtCore
import pyqtgraph as pg
import sys

R = [255, 0, 0]
G = [ 0, 255, 255]
B = [ 0, 0, 255]

win = None
plt = None
data = [[1,-1,2,-2,3,-3,4,-4],[10,-10,9,-9,8,-8,7,-7],[0,1,0,2,0,3,0,4]]
curve = list()
app = QtGui.QApplication([])

def init():
global curve

元記事を表示

関数内で例外が発生した場合、呼び出し元へ伝わる1

“`py:1
def test_exception(num):
print(1)
answer = 100 / num
return answer
print(2)

print(‘start’)
try:
test_exception(1)
print(4)
except ZeroDivisionError as e:
print(3)
print(e)
finally:
print(‘end’)
“`

“`:1の実行結果
start
1
4
end
“`
print(‘start’)を
最初に実行。

次に、
tryブロックを実行する。
tryブロック1行目のtest_exception関数に引数1で入る。
なので、
print(1)を実行し、
answer = 100
となり100を返す。
retrunしているので、
その下のprint(2)は実行されない点に注意。
tryブロックのtest_exception関数が終わったので、
その続きでprint(4)を実行。

ZeroDivisio

元記事を表示

【Python】MotoでモックしたAWSリソースをpytestフィクスチャ化する

motoとは AWSサービスをモック化できる非常に便利なツール。

[spulec/moto – GitHub](https://github.com/spulec/moto)

これをpytestのフィクスチャと組み合わせれば`conftest.py`のsetUpで自動的にAWSサービスをモックできる。

参考 – [Issue with Moto and creating pytest fixture #620](https://github.com/spulec/moto/issues/620)

SQSの例

– SQSのモックキューを作成
– モックキューにメッセージ送信
– モックキューのメッセージを検証

“`python
import boto3
import pytest
from moto import mock_sqs
import json

@pytest.fixture()
def mock_fixture():
“””キューを作成してメッセージを1件送信する”””
mock = mock_sqs()
mock.start()

元記事を表示

超音波距離センサ(HCSR-04)とRaspberry Piを使って凹凸の検出をしたい

#使用するもの
・Raspberry Pi Zero
・角が直角のもの(ティッシュの箱など)
・HCSR-04センサ×2
・プレッドボード
・ジャンパー

#Raspberry Piとセンサを接続する
HCSR-04とRaspberry Pi Zeroをジャンパ等で接続する
今回は接続方法については割愛する.詳細はこちらからhttps://algorithm.joho.info/programming/python/raspberry3-ultrasonic-distance-sensor-hcsr04/
また,センサと検出対象の物体の配置図は以下の図を参照する

#検出方法
検出は3つのステップで行います.また,すべてのステップではHCSR-04センサの位置は変更していません
・L:物体の中央線とセンサ間の距離(A,Bとも同じ距離である)
・ℓ:センサAと物体との距離
・ℓ’:センサBと物体との距離

###初期状態
![object1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558036/64

元記事を表示

[Python3 入門 9日目] 5章 Pyの化粧箱:モジュール、パッケージ、プログラム(5.1〜5.4)

#5.1 スタンドアローンプログラム

– テキストターミナル、またはターミナルウィンドウでPythonを実行している場合、Pythonプログラムの名前に続いてプログラムファイル名を入力する。

“`py:test1.py
print(“This stadalone program works!”)
“`

“`console:結果
$ python test1.py
This stadalone program works!
“`

#5.2 コマンドライン引数

“`py:test2.py
import sys
print(“Program arguments:”,sys.argv)
“`

“`console:結果
$ python test2.py
Program arguments: [‘test2.py’]

$ python test2.py tra la la
Program arguments: [‘test2.py’, ‘tra’, ‘la’, ‘la’]
“`

#5.3 モージュールとimport文

– **モジュール**はPythonコードを

元記事を表示

集合内包表記

“`py:1
s = set()
for i in range(10):
s.add(i)
print(s)
“`

“`:1の実行結果
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
“`

これを内包表記にすると

“`py:内包表記1
s = {i for i in range(10)}
print(s)
“`

“`:内包表記1の実行結果
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
“`

リスト内包表記の時と同様に、
3で割って余り0の数字のみ集合に入れるには

“`py:内包表記2
s = {i for i in range(10) if i % 3 == 0}
print(s)
“`

“`:内包表記2の実行結果
{0, 3, 6, 9}
“`

元記事を表示

OTHERカテゴリの最新記事