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

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

Django管理画面のカスタマイズ はじめの一歩

Djangoの管理画面のカスタマイズを実施します。
デフォルトのDjangoの管理画面はあまりイケてる感じではないですが、デザインを自分好みに変えられます。
そのための第一歩として、**どのファイルをいじればよいのか?**を整理します。

# Djangoのインストールおよびプロジェクトの作成
この記事読んでる人でDjangoをインストールしてない人は少ないと思いますが、
もしいらっしゃる場合は[こちらの記事](https://qiita.com/Shirokuma_0607/items/db30765b9aa9374cd676)を参照してください。

# adminアプリケーションのtemplateの場所を確認
環境をどうやって作成しているかで十人十色ですが、Pythonの実行環境からライブラリにインストール場所を探してください。
`django.contrib.admin.templates`というディレクトリがあるはずです。
この中に、adminアプリケーションのtemplateが格納されています。
**※このファイルを直接いじるようなこと

言語処理100本ノック 2020 第5章: 係り受け解析

先日,[言語処理100本ノック2020](https://nlp100.github.io/ja/)が公開されました.私自身,自然言語処理を初めてから1年しか経っておらず,細かいことはよくわかっていませんが,技術力向上のために全ての問題を解いて公開していこうと思います.

すべてjupyter notebook上で実行するものとし,問題文の制約は都合よく破っていいものとします.
ソースコードはgithubにもあります.[あります](https://github.com/nymwa/nlp100/blob/master/chapter05.ipynb).

4章は[こちら](https://qiita.com/nymwa/items/447211c40dc657132c91).

環境はPython3.8.2とUbuntu18.04です.

# 第5章: 係り受け解析
> 夏目漱石の小説『吾輩は猫である』の文章(neko.txt)をCaboChaを使って係り受け解析し,その結果をneko.txt.cabochaというファイルに保存せよ.このファイルを用いて,以下の問に対応するプログラムを

Kaggle COVID19 Global Forecasting (Week 4)

次のコンペに投稿する方法です。
>[COVID19 Global Forecasting (Week 4)](https://www.kaggle.com/c/covid19-global-forecasting-week-4/)
covid19-global-forecasting.py を covid19_apr13.ipynb に変換してアップロードしました。

結果は次の通りでした。
![covid19_apr13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/b6145f77-1013-3345-f130-0ab42b1c12d8.png)

“`py:covid19-global-forecasting.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
# covid19-global-forecasting.py
#
# Apr/13/2020 AM 09:22
# ————————-

evalとexec

[document-link]: https://docs.python.org/ja/3/index.html
[eval-link]: https://docs.python.org/ja/3/library/functions.html#eval
[exec-link]: https://docs.python.org/ja/3/library/functions.html#exec
[builtins-link]: https://docs.python.org/ja/3/library/builtins.html#module-builtins
[nested-scope-link]: https://docs.python.org/ja/3/glossary.html#term-nested-scope
[compile-link]: https://docs.python.org/ja/3/library/functions.html#compile
[globals-link]: https://docs.python.org/ja/3/library/function

EXCEL グラフ テスト用

# -*- coding: utf-8 -*-

import openpyxl
from openpyxl.utils import get_column_letter
from openpyxl.styles import Color, PatternFill, Font, Border

outputFilePath = ‘C:/Users/user/Desktop/test.xlsx’
wb = openpyxl.load_workbook(outputFilePath)
ws = wb.active
“””
for i in range(10):
ws.append([i])

from openpyxl.chart import BarChart, Reference, Series
values = Reference(ws, min_col=1, min_row=1, max_col=1, max_row=10)
chart = BarChart()
chart.add_data(values)
ws.add_chart(chart, “E15”)
wb.s

(自分用メモ) Python のパッケージとモジュール

なんとなくわかった気になって使っている人が多そうな、Python のパッケージとモジュールについてざっくりと勉強します。

# 動機

他人の書いた Python の機械学習のコードがあります。
カレントディレクトリからみて `./a/b/c.py` の場所に実行したいファイルがあります。
このファイルは `__name__` の値によって2通りに動作する、よくある形式で書かれています。
中では `./a/b/d.py` を `import d` によって **絶対 import** しています。

このとき、`PYTHONPATH` をデフォルトのままと仮定すると、`python ./a/b/c.py` とした場合と、他の python ファイルから `import a.b.c` とした場合で、どちらが正しく動作するかが変わります。
前者が動いている状態では後者が動かず、後者が動くように、`c.py` 内を相対 import に書き換えると前者が動かなくなります。
一体何が起こっているのだろうかというのが、今回勉強する動機です。

後者の状況をもう少し説明します。ユニットテストのため

PEP 560 (Core support for typing module and generic types) を読んだよメモ

昨日に引き続いて `__origin__` という属性について調べていたら、PEP 560 — Core support for typing module and generic types という PEP にたどり着きました。この PEP は 3.7 から採用されているので、すでに実装が存在して触ることができるやつです。

## 概要

* 型ヒントが登場したとき、Python 本体に手を入れないように設計していた
* しかし、当時(バージョン 3.6)は 3つの問題があった
* `typing` モジュールのパフォーマンス
* メタクラスの競合
* `typing` モジュールで使われている多数のハック

## アプローチ

* `__class_getitem__` 、 `__mro_entries__` というふたつのスペシャルメソッドを追加する
* `__class_getitem__`
* クラスオブジェクト向けの `__getitem__`
* `Iterable[int]` などの場面で利用される
* `__mro_entri

Python curses でマウスのホイールの判定を取得する方法

## 環境
– Mint 19.10
– Python 3.7.5

## はじめに
curses にマウスのホイール判定が用意されていなかったので自作した。

これを読む前に前提となっている[この記事](https://qiita.com/t4t5u0/items/bd5270d0a7b3def35a03)を読んでほしい。

## 症状
ホイール判定をとれない

## 原因
curses には、マウスのクリック判定などが用意されているが不十分で、ホイール判定。特に下にスクロールするときの判定が用意されていない。

## 解決策
判定部分のコメントは日本語入力の記事を参照。擬似コードです。windowオブジェクトをきちんと宣言していません

“`python
import curses

window = curses.stdscr()
key = window.getch()

text_pool = [key]
if 0x00 <= key <= 0x7f: pass elif 0x80 <= key <= 0xbf: print(key) exit

Pythonの名前につく謎のアンダーバー

# はじめに

pythonにおいて、名前をつける際にアンダースコアを使う場合がある。様々な使い方があるので解説する。全てに共通することだが、アンダースコアはただの記号ではなくアンダースコアも含めたものが名前として扱われる。**名前**全般に当てはまるので変数、関数その他に当てはまる。

# `_single_leading_underscore`

**先頭にひとつ**

だけアンダースコアをつけた場合、`import *`とした場合に、インポートから除外される。これによって、モジュールの内部でしか使わず、モジュールを利用する人に使ってほしくないものを隠すことができる。ただし、明示的にimportされるとimportされてしまう。

# `single_trailing_underscore_ `

**後ろにひとつ**

だけつけた場合、特に機能は持たない。しかし、Pythonの予約語と同じ名前を使いたい場合に使用される。

# `__double_leading_underscore`

主にクラス内において使用される。

**前に2つ**

つけると、クラスの外から呼び出すとき

Python curses で日本語を入力する方法

## 環境
– Mint 19.10
– Python 3.7.5

## はじめに
cursesのgetch() を使った場合にUTF-8でエンコードしたときに日本語(マルチバイト文字)がうまく受け取れなかったので、処理部分を作った。

## 症状
例えば ‘あ’ と打った場合には、0xe3 0x81 0x82 の3バイトに分けて、3回分入力されてしまう。しかし、これでは都合が悪い。(本当にほしいのは0x3042)

## 原因
getch() は1バイトずつ入力を見るので、UTF-8では3バイト分ある日本語などを正しく受け取れない。ということで、UTF-8のエンコーダを自作してやる。

## 解決策

先頭バイトを見ると、その文字列が何バイトか確定するから、以下のように条件分岐させる。
※擬似コードです。stdscrの部分などは省いています。windowオブジェクトを適宜宣言してください

“`python
import curses

window = curses.stdscr()
key = window.getch()

# マルチバイト文字の加工
# 日本語だと3バイ

PythonとDartの命名規則比較まとめ

PythonとDartで違うところは太文字にしました。

| 対象 | Python | Dart |
| ————– | —————————— | —————————— |
| クラス | UpperCamelCase | UpperCamelCase |
| **パッケージ** | **lowercase** | **lowercase_with_underscores** |
| モジュール | lowercase_with_underscores | lowercase_with_underscores |
| **変数** | **lowercase_with_underscores** | **lowerCame

日本人の名前の一部を対義語に変換する

# はじめに

大学生時代、ひょんなことから友達の名前の一部を対義語にして呼んでみたことがありました。

* 西郷隆盛→東郷隆盛
* 小野妹子→大野妹子

何回か繰り返していると、ある友達のツボにハマってしまい、笑い過ぎて身動きが取れなくなってしまいました。その友達に久しぶりに喜んでもらいたい、あとはそれを自動化できたら(?)という思いがありプログラムで実装しました。

# 日本人の名前の一部を対義語に変換する

## データベース

[LinkData](http://ja.linkdata.org/home)より、[KeitarouNakayama](http://user.linkdata.org/user/KeitarouNakayama/work)さんが公開している“[漢字一文字の対義語](http://ja.linkdata.org/work/rdf1s3497i)”を利用させていただきました。380種の漢字(190対)でパブリックドメインです。

## 実装

関数を実装するコードは以下のようになりました。

“`python
import random
import

【第2回】pythonで某Authenticator的なツールを作ってみた

## 表示するユーザー情報をDB化してみた。
– 前回はユーザー情報をソースにそのまま書き込まないといけなかった。
– 初回実行時にgauth.dbってファイルがなければ作成する。
– INSERT INTO文でuser1〜3までをDBに入れてる。
– 実行すると実行した瞬間の認証番号を表示する。

“`python
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import tkinter as tk
import pyotp
import sqlite3
import os

if(os.path.exists(‘gauth.db’)):
pass
else:
# データベースに接続する
conn = sqlite3.connect(‘gauth.db’)
c = conn.cursor()
# テーブルの作成
c.execute(”’CREATE TABLE gauth(id integer primary key AUTOINCREMENT, name text, private

Pytubeのimportでエラーが出る 『cannot import name ‘quote’ from ‘pytube.compat’』

# Pytubeをimportすることができない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431977/04e373ef-b5ae-938d-fce2-185c1da25654.png)

# 何をしたかったか
pythonでYoutube上の動画をダウンロードしたかった。

# Python文
“`Python
from pytube import *
“`

# エラー文原文
“`
cannot import name ‘quote’ from ‘pytube.compat’ (/usr/local/lib/python3.7/site-packages/pytube/compat.py)
“`

# エラー文訳(Deep L翻訳)
pytube.compat’ から名前 ‘quote’ をインポートできない (/usr/local/lib/python3.7/site-packages/ytube/compat.py)

# 原因
pytubeが原

AtCoder Beginner Contest 162 参戦記

# AtCoder Beginner Contest 162 参戦記

## [ABC162A – Lucky 7](https://atcoder.jp/contests/abc162/tasks/abc162_a)

2分で突破. 書くだけ.

“`python
N = int(input())

if str(N).count(‘7’) > 0:
print(‘Yes’)
else:
print(‘No’)
“`

## [ABC162C – Sum of gcd of Tuples (Easy)](https://atcoder.jp/contests/abc162/tasks/abc162_c)

4分で突破. なぜか間違って先にC問題やってた. ジャッジシステムが詰まってて、オンライン実行が使えなくて時間がかかった. まあ、問題文通りに書くだけなんだけど、TLE になりそうだったので定数倍に手を入れた.

“`python
def main():
from math import gcd

K = int(input())

r

【Pythonのreturn文】returnとreturn Noneどちらを使うべきか

# return文で関数処理を終了したい場合は`return None`と`return`どちらを使うべきか?

Pythonの関数を書いていたときにふと疑問に感じたことが。

それは関数の途中で処理を終了したい場合に、`return`と書くべきなのか`return None`と書くべきなのかという問題。

Pythonでは明示的に書くことが推奨されているため、return文で処理を終了するときも`None`を返すときも`return None`と書くべきなのかなぁと迷いました。(※Pythonでは、関数定義で`return`だけ書いた場合、あるいは`return`の記述が無い場合は`None`が返ってきます。参考:[【Python】returnを記述しなかった関数が返す値](https://www.takasay.com/entry/2015/06/14/010000))

結論からいうと**関数を終了したいだけのときは`return`だけの方が良い**ようです。
ただし、`return`だけ書くときはいくつか注意すべきことがあるようです。

## 例をあげてみる
[return,

Djangoを始めるのに必要なコマンド一覧

# はじめに

ここでは、Djangoを始めるにあたって最低限必要になるコマンドについて解説していきます。

# Djangoプロジェクトの作成

新しいDjangoプロジェクトを作成するには、以下のコマンドを実行します。

“`bash
django-admin startproject プロジェクト名 .
“`

最後のピリオド`.`がないと、フォルダが1階層分余計に作られてしまう形になるので、個人的にこちらの方がおすすめです。

# アプリの作成

アプリを作成するには、以下のコマンドを実行します。

“`bash
python manage.py startapp アプリ名
“`

# ローカルサーバーの起動

ローカルサーバーを起動するには、以下のコマンドを実行します。

“`bash
python manage.py runserver
“`

# まとめ

ここでは、Djangoを始めるにあたり最低限必要なコマンドについて解説しました。
これらを理解できれば、Django理解への第一歩を踏み出したことになります。

京都大学のPython講義資料から見る重要単元

# はじめに
2月13日
京都大学がPythonの講義資料を**無料公開**しました。
関連:
[講義資料リポジトリ](https://repository.kulib.kyoto-u.ac.jp/dspace/handle/2433/245698)
[紹介記事-Qiita](https://qiita.com/tmdoi/items/9b56984ef29fdf6bc6a6)
[紹介記事-CodeZine](https://codezine.jp/article/detail/11999)

かなり充実した内容となっています。(完璧ではありませんが。。。)
COVID-19のせいもあり自宅での学習が今後の鍵になると思われますので、有効活用させていただきましょう。
私自身、Pythonの基礎がうやむやなまま使っているので、これを機にしっかりと理解しておきたいと思います。

ちなみに**`講義資料`**と**`コラム編`**の二つに分かれていて、本記事では講義資料のみ取り扱います。
Pythonなんとなく使えるぜって人は`コラム編`を読んでみてください。面白いですよ。

# この記事で何

言語処理100本ノック 2020 第4章: 形態素解析

先日,[言語処理100本ノック2020](https://nlp100.github.io/ja/)が公開されました.私自身,自然言語処理を初めてから1年しか経っておらず,細かいことはよくわかっていませんが,技術力向上のために全ての問題を解いて公開していこうと思います.

すべてjupyter notebook上で実行するものとし,問題文の制約は都合よく破っていいものとします.
ソースコードはgithubにもあります.[あります](https://github.com/nymwa/nlp100/blob/master/chapter04.ipynb).

3章は[こちら](https://qiita.com/nymwa/items/de70c7a8bc6512c57d26).

環境はPython3.8.2とUbuntu18.04です.

# 第4章: 形態素解析
> 夏目漱石の小説『吾輩は猫である』の文章(neko.txt)をMeCabを使って形態素解析し,その結果をneko.txt.mecabというファイルに保存せよ.このファイルを用いて,以下の問に対応するプログラムを実装せよ.

[Python] 複数階層の自作モジュールの読み込み

# 前提
以下のような構造の時の `__init__.py` の書き方メモ。

—-
root/
 ├ `__init__.py`
 ├ dir_a/
 │  ├ `__init__.py`
 │  └ `test_a.py` (func_aが定義されている)
 └ dir_b/
    ├ `__init__.py`
    └ `test_b.py` (func_bが定義されている)

—-

`import root` をしたら、`root.func_a` で呼び出せるようにしたい。ということがあったので、これを実現します。

# root直下のinit
`root/__init__.py` については

“`python:root/__init__.py
import os
import sys
sys.path.append(os.path.dirname(os.path.abspath(__file__)))

from root.dir_a import *
from root.dir_b import *
“`

# dir_aのinit
`root/