pythonのpow

pow(self.nom, exponent, self.prime)で計算できる

prime = 7
for i in range(1, prime):
    a = pow(i, prime-1, 6)
    print(a)
for prime in (7, 11, 17 , 31):
    for i in range(1, prime):
        a = pow(i, prime-1, 6)
        print(a)
for prime in (7, 11, 17 , 31):
    print([pow(i, prime-1, prime) for i in range(1, prime)])

$ python3 test.py
[1, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

3/24 のF31は

prime = 31
a = 3 * pow(24, prime-2)
print(a % prime)

print(pow(17, -3, prime))

print(pow(4, -4, prime)*11 % prime)

Pythonのtype()と__class__

type() は、オブジェクトのタイプまたはクラスを見つけるために使用できる事前定義された関数
__name__ は、基本的にそれが使用されている現在のモジュールの名前を与える特別な組み込み変数

class Num:
    def __init__(self, num):
        self.num = num

x = Num(1)
print(type(x).__name__)

$ python3 test.py
Num

__class__ プロパティを使用して、オブジェクトのクラスまたはタイプを検索することもできる。これは基本的に、オブジェクトが作成されたクラスを指す。

class Num:
    def __init__(self, num):
        self.num = num

x = Num(1)
print(x.__class__)
print(x.__class__.__name__)

$ python3 test.py

Num

Pythonのraise ValueError

関数などで例外を発生させたい場合にraiseを使用する。

raise 例外クラス(message):

def process_list(numbers):
    for num in numbers:
        try:
            if num < 0:
                raise ValueError("Negative numbers are not allowed.")
            result = 100 / num
            print(f"Result of division: {result}")
        except ZeroDivisionError:
            print("Error: Division by zero is not allowed.")
        except ValueError as ve:
            print(f"Error: {ve}")
        except Exception as e:
            print(f"Error occurred: {e}")

Pythonの__rpr__メソッド

__str__, __repr__は特殊メソッドと呼ぶ

initのみの場合

class Person:

    def __init__(self, name: str, age: int) -> None:
        self.name = name
        self.age = age

mike = Person('Mike', 20)
print(mike)
class Person:

    def __init__(self, name: str, age: int) -> None:
        self.name = name
        self.age = age

mike = Person('Mike', 20)
print(f'name: {mike.name}, age: {mike.age}')

classの中に書く

class Person:

    def __init__(self, name: str, age: int) -> None:
        self.name = name
        self.age = age

    def __str__(self) -> str:
        return f'name: {mike.name}, age: {mike.age}'

mike = Person('Mike', 20)
print(mike)

__repr__ は同じ値のオブジェクトを再生成できる文字列を定義。

class Person:

    def __init__(self, name: str, age: int) -> None:
        self.name = name
        self.age = age

    def __repr__(self) -> str:
        return f'name: {mike.name}, age: {mike.age}'

mike = Person('Mike', 20)
print(repr(mike))
class Person:

    def __init__(self, name: str, age: int) -> None:
        self.name = name
        self.age = age

    def __repr__(self) -> str:
        return f'name: {mike.name}, age: {mike.age}'

mike = Person('Mike', 20)
print(repr(mike))

16進数と整数の変換

0xはその文字列が16進数であることを示す

print(format(0xabcd, 'x'))
print(hex(0xabcd))
print('%02x' % 0xabcd)

binasciiはバイト列に変換する

import binascii
print(binascii.unhexlify('abcd'))
print(str(binascii.hexlify(b'\xab\xcd'), 'utf-8'))

python基礎

bit演算子

print(bin(10))
print(bin(13))
print(bin(10|13))
print(bin(10))
print(bin(13))
print(bin(10&13))

シフト演算

print(bin(15))
print(bin(15<<0))
print(bin(15<<1))
print(bin(15<<2))
print(bin(15<<3))
print(bin(15<<4))

print(bin(15))
print(bin(15>>0))
print(bin(15>>1))
print(bin(15>>2))
print(bin(15>>3))
print(bin(15>>4))

list

list2=[10,20,30]
list2.append(40)
print(list2)

list3=[1,2,3,4,5]
list3.insert(3, 10)
print(list3)

list4=[1,2,3,4,5]
print(len(list4))

dictionary

dic1 = {"A": 1, "B": 2}
dic2 = {}
dic2["key"] = "value"

print(dic1)
print(dic2)

class, instance

class Greet():
    def __init__(self, greet):
        self.value = greet

morning = Greet("おはよう!")
evening = Greet("こんばんわ!")

print(morning.value)
print(evening.value)

__str__(self)は自動的に文字出力する

class Person():
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return "Name:" + self.name + ", Age:" + str(self.age)

satoshi = Person("satoshi", 30)
print(satoshi)

import

import numpy as np

def area_circle(r):
    ans = np.pi * r **2
    return ans 
print(area_circle(3))

これをfromを使って以下のように書くことができる。コードを省略できるメリットがある。

from numpy import pi

def area_circle(r):
    ans = pi * r **2
    return ans 
print(area_circle(3))

【Python】listのappend

appendとすると、リストの最後に追加される

names = ["Alice", "Bob", "Charlie"]

names.append("Dave")
print(names)

$ python3 test.py
[‘Alice’, ‘Bob’, ‘Charlie’, ‘Dave’]

カッコで囲んで二つ入れると

names = [(“Alice”,”20″), (“Bob”,”23″), (“Charlie”,”25″)]

names.append((“Dave”,”12″))
print(names)
print(names[0][1])
[/code]
基本的に一つしか入らないがタプルとして入れることもできる
$ python3 test.py
[(‘Alice’, ’20’), (‘Bob’, ’23’), (‘Charlie’, ’25’), (‘Dave’, ’12’)]
20

【Python】リストのコロン(:)の使い方: start, end, step

リストのコロンはstart, step, endという意味

for i in range(50)[::10]:
	print(i, end=' ')

$ python3 test.py
0 10 20 30 40

マイナスの場合は前に戻っていく

for i in range(50)[::-10]:
	print(i, end=' ')

$ python3 test.py
49 39 29 19 9

何も指定しない場合は全てのリストが処理される

for i in range(50)[::]:
	print(i, end=' ')

$ python3 test.py
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49

【python】psycopg2

psycopg2はpythonからPostgreSQLに接続するためのライブラリ
C言語で書かれたlibpgのラッパー

ライブラリのインストール
$ pip install psycopg2

データベース作成
postgres=# create database mydb;
CREATE DATABASE

テーブル作成
postgres=# \c mydb
You are now connected to database “mydb” as user “postgres”.
CREATE TABLE users(
id SERIAL,
email varchar(255) NOT NULL,
password varchar(255) NOT NULL,
PRIMARY KEY(id)
);

mydb=# \dt
List of relations
Schema | Name | Type | Owner
——–+——-+——-+———-
public | users | table | postgres
(1 row)

import psycopg2

connection = psycopg2.connect(host='localhost',
								user='postgres',
								password='password',
								database='mydb')

with connection:
	with connection.cursor() as cursor:
		sql = "INSERT INTO users(email, password) VALUES(%s, %s)"
		cursor.execute(sql, ('webmaster@python.org', 'very-secret'))

	connection.commit()

mydb=# select * from users;
id | email | password
—-+———————-+————-
1 | webmaster@python.org | very-secret
(1 row)

withを使わずに記述することも可能。その場合は、自動的に閉じないため明示的に閉じる必要がある

import psycopg2

connection = psycopg2.connect(host='localhost',
								user='postgres',
								password='password',
								database='mydb')

cursor = connection.cursor()
sql = "INSERT INTO users(email, password) VALUES (%s, %s)"
cursor.execute(sql, ('webmaster2@python.org', 'much-secret'))

connection.commit()

cursor.close()
connection.close()

なるほど、psqlに接続するためのライブラリってことね

[Python] pandasとは

Pandasはデータ解析を容易にする機能を提供するPythonのデータ解析ライブラリ
Pandasの特徴は、データフレーム(DataFrame)などの独自のデータ構造が提供されており様々な処理が可能
表形式のデータをSQLまたはRのように操作することが可能

Pandasの例
– CSV, Excel, RDBなどにデータを入出力できる
– データの前処理(NaN/Not a Number, 欠損値)
– データの集約及びグループ演算
– データに対しての統計処理及び回帰処理

import pandas as pd
# from pandas import Series

s1 = pd.Series([1,2,3,5])
print(s1)

$ python3 main.py
0 1
1 2
2 3
3 5

### データフレーム
データフレームは二次元のラベル付きデータ構造で、Pandasでは最も多く使われるデータ型

import pandas as pd
df = pd.DataFrame({
	'名前':['田中','山田','高橋'],
	'役割':['営業部長','広報部','技術責任者'],
	'身長':[178, 173, 169]
	})
print(df)
print(df.dtypes)

print(df.columns)

$ python3 main.py
名前 役割 身長
0 田中 営業部長 178
1 山田 広報部 173
2 高橋 技術責任者 169
名前 object
役割 object
身長 int64
dtype: object
Index([‘名前’, ‘役割’, ‘身長’], dtype=’object’)

import pandas as pd
data = {
	'名前':['田中','山田','高橋'],
	'役割':['営業部長','広報部','技術責任者'],
	'身長':[178, 173, 169]
	}
df = pd.DataFrame(data, columns=["名前","役割","身長"])
df.columns = ["Name", "Position", "height"]

print(df)

$ python3 main.py
Name Position height
0 田中 営業部長 178
1 山田 広報部 173
2 高橋 技術責任者 169

### head()とtail()

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(20, 2))
print(df.head())
print(df.tail())

print(df.head().append(df.tail()))
print(df.head(3).append(df.tail(3)))

$ python3 main.py
0 1
0 0.330724 -1.143377
1 -0.123135 1.368603
2 1.230545 0.606766
3 0.687297 -1.633271
4 0.365082 0.226383
0 1
15 0.822776 -2.105489
16 1.306649 0.672192
17 0.846219 0.454775
18 -0.376438 -0.903396
19 -1.165510 -0.558250
0 1
0 0.330724 -1.143377
1 -0.123135 1.368603
2 1.230545 0.606766
3 0.687297 -1.633271
4 0.365082 0.226383
15 0.822776 -2.105489
16 1.306649 0.672192
17 0.846219 0.454775
18 -0.376438 -0.903396
19 -1.165510 -0.558250
0 1
0 0.330724 -1.143377
1 -0.123135 1.368603
2 1.230545 0.606766
17 0.846219 0.454775
18 -0.376438 -0.903396
19 -1.165510 -0.558250

その他に多様な機能がある。