[Python]指定した長さの空白(0x20)文字列を作る
文字列リテラルと*演算子を使う。
>>> s = ' ' * 7
>>> len(s)
7
>>> print('>' + s + '<')
> <
« 2022年9月 | トップページ | 2022年11月 »
文字列リテラルと*演算子を使う。
>>> s = ' ' * 7
>>> len(s)
7
>>> print('>' + s + '<')
> <
*演算子を使う。
>>> 'A' * 3
'AAA'
>>> 'Abc' * 4
'AbcAbcAbcAbc'
例えば、C:\workに置いてあるscript.pyの中で、C:\pythonに置いてあるmodule.pyをインポートする方法。sys.path.appendメソッドを使う。
script.py
import sys
sys.path.append('../python')
import module
sys.path.appendの引数には、読み込み先のフォルダーを、そのインポートするファイルが置かれているフォルダーを起点にした相対パスを指定する。Windows環境でも、パスセパレーターは「/」を使うことができる。
スライス演算子を使う。インデックスの開始は0である。取り出す範囲の指定は、開始のインデックスは、取り出すその文字のインデックスを、終わりのインデックスは、取り出す文字の次のインデックスを指定することに注意。
>>> s = "ABC123あいう"
>>> s[0]
'A'
>>> s[1]
'B'
>>> s[0:3]
'ABC'
>>> s[5:8]
'3あい'
>>> s[5:]
'3あいう'
>>> s[:4]
'ABC1'
charToRaw関数は引数に与えた文字列をロウ型で返すため、これを利用すると、そのRを実行している環境での文字コードを簡単に調べることができる。以下は、文字列「あい亜井」のそれぞれの文字の文字コードを調べた例。なお、これら文字の文字コード(左から、文字、その文字のシフトJISコード、その文字のutf-8コード)は以下のとおり(0xは16進数であることを示す接頭語)。
あ 0x82A0 0xE38182
い 0x82A2 0xE38184
亜 0x889F 0xE4BA9C
井 0x88E4 0xE4BA95
WindowsのR(文字コードはシフトJIS)で実行すると、以下のようにシフトJISコードがバイト列で返される。
> charToRaw("あい亜井")
[1] 82 a0 82 a2 88 9f 88 e4
任意の文字の任意の文字コードを調べるには、iconv関数を使う。戻り値はデフォルトでは文字列のため、文字コードの値を知りたいのであれば、toRawオプションをTRUEにすることでロウ型で返すため、これをTRUEにする。WindowsのR(文字コードはシフトJIS)で実行すると、以下のようになる。
> iconv("あい亜井", to = "sjis", toRaw = TRUE)
[[1]]
[1] 82 a0 82 a2 88 9f 88 e4
> iconv("あい亜井", to = "utf-8", toRaw = TRUE)
[[1]]
[1] e3 81 82 e3 81 84 e4 ba 9c e4 ba 95
charToRaw関数を使う。以下は、Windows環境下(シフトJIS)で行った例。
> r <- charToRaw("か")
> r
[1] 82 a9
> r + 1
r + 1 でエラー: 二項演算子の引数が数値ではありません
> n <- as.integer(r)
> n
[1] 130 169
> rawToChar(as.raw(c(130, 169)))
[1] "か"
文字列にも使える。
> charToRaw("あいうABC阿伊宇")
[1] 82 a0 82 a2 82 a4 41 42 43 88 a2 88 c9 89 46
> n <- as.integer(charToRaw("あいうABC阿伊宇"))
> n
[1] 130 160 130 162 130 164 65 66 67 136 162 136 201 137 70
> rawToChar(as.raw(n))
[1] "あいうABC阿伊宇"
> dtf <- read.csv("table1_1_1.csv", header = TRUE)
> w <- 5
> sumn <- 0
> for (i in seq(140, 165, w)) {
+ n <- length(which(dtf$height > i & dtf$height <= i + w))
+ cat(sprintf("%d~%d %2d\n", i, i + w, n))
+ sumn <- sumn + n
+ }
140~145 1
145~150 11
150~155 54
155~160 76
160~165 45
165~170 13
> cat(sprintf("計 %d\n", sumn))
計 200
grep関数を使う。正規表現も使える。第一引数にパターンを指定する。
> s <- c("あいう", "いうあ", "うあい")
> grep("^あ", s, value = TRUE)
[1] "あいう"
> grep("あ$", s, value = TRUE)
[1] "いうあ"
> grep("[あ]", s, value = TRUE)
[1] "あいう" "いうあ" "うあい"
\n(改行)や\r(復帰)などが含まれている文字列は、ただ表示させると、その拡張表記のままに表示されてしまう。
> s1 <- "Hi."
> s2 <- "Hello.\n"
> s3 <- "Hi.\rHello."
> cat(s1)
Hi.> cat(s2)
Hello.
> cat(s3)
Hi.
Hello.>
print関数を使うと、拡張表記による文字は、その拡張表記そのままに¥記号を使って表示する。
> print(s1)
[1] "Hi."
> print(s2)
[1] "Hello.\n"
> print(s3)
[1] "Hi.\rHello."
rawToChar関数にロウ型で文字コードを与えればよい。以下はShift-JIS環境で実行した例。ASCIIコードで「A」は0x41、「1」は0x31、Shift-JISでは「朝」は0x92a9、「昼」は0x928b、「夜」は0x96e9。
> rawToChar(as.raw(c(0x41, 0x31)))
[1] "A1"
> rawToChar(as.raw(c(0x92, 0xa9, 0x92, 0x8b, 0x96, 0xe9)))
[1] "朝昼夜"
> rawToChar(as.raw(c(0x0d, 0x0a)))
[1] "\r\n"
エスケープシーケンスによる文字はそれが分かるように表示され、文字として割り当てられていない値の場合は、与えた値がそのまま返される。
> rawToChar(as.raw(c(0x0d, 0x0a)))
[1] "\r\n"
> rawToChar(as.raw(c(0xff, 0x0a)))
[1] "\n"
> rawToChar(as.raw(c(0xff, 0xfe)))
[1] ""
> rawToChar(as.raw(c(0x92, 0xff)))
[1] "<92>"
\演算子を使う。また、( )演算子、[ ]演算子、{ }演算子の中でも自由に改行が行える。
>>> 1 \
... + 2
3
>>> print(1
... + 2)
3
>>> 1 \
... + 2
3
>>> 1
1
>>> 1 \
... + 2
3
>>> print(3
... + 4)
7
プログラムでも同様。以下、それぞれ3つのプログラムをそれぞれ実行した例。最後の例は、改行が認められない状態で改行をした際の実行例。
例.1
x = 1 + 2 + 3 \
+ 4 + 5
print(x)
出力
15
例.2
x = (1 + 2 + 3
+ 4 + 5)
print(x)
出力
15
例.3 ※この書き方は正しくないため、エラーが発生する
x = 1 + 2 + 3
+ 4 + 5
print(x)
出力
File "○○.py", line 2
+ 4 + 5
IndentationError: unexpected indent
数値や文字などの情報を、8ビットずつ区切って表したものがバイト列。Rで扱うにはロウ型を使う。
> rw <- as.raw(c(1, 2, 0xa))
> print(rw)
[1] 01 02 0a
> as.integer(rw)
[1] 1 2 10
> as.integer(rw) + 20
[1] 21 22 30
文字列をロウ型に変換するにはcharToRaw関数を、ロウ型を文字列に変換するにはrawToChar関数を使う。
> rw <- charToRaw("ABC123")
> print(rw)
[1] 41 42 43 31 32 33
> as.raw(as.integer(rw) + 1)
[1] 42 43 44 32 33 34
> rawToChar(as.raw(as.integer(rw) + 1))
[1] "BCD234"
日本語も扱える。以下は、UTF-8の環境下で行った例。
> rw <- charToRaw("ABあいう12")
> print(rw)
[1] 41 42 e3 81 82 e3 81 84 e3 81 86 31 32
> print(rw[3:5])
[1] e3 81 82
> print(rawToChar(rw[3:5]))
[1] "あ"
osモジュールのsepを使う。以下は、ウィンドウズで実行した例。
>>> import os
>>> print(os.sep)
\
>>> print('csv' + os.sep + 'result.csv')
csv\result.csv
**演算子かpow関数を使う。pow関数はmathモジュールの関数ではなく、組み込み関数であることに注意。
>>> 2 ** 3
8
>>> 2 ** 0.5
1.4142135623730951
>>> 2 ** -4
0.0625
>>> -3 ** 3
-27
>>> pow(2, 3)
8
>>> pow(2, 0.5)
1.4142135623730951
>>> pow(2, -4)
0.0625
>>> pow(-3, 3)
-27
表1.1のデータのファイルをカレントディレクトリに置いて行うこと。
> dtf <- read.csv("table1_1.csv", header = TRUE)
> xxi <- log(as.double(dtf$NIC))
> yyi <- log(as.double(dtf$CO))
> n <- nrow(dtf)
> ssxx <- sum(xxi)
> ssyy <- sum(yyi)
> ssxx2 <- sum(xxi ^ 2)
> ssyy2 <- sum(yyi ^ 2)
> ssxxyy <- sum(xxi * yyi)
> xxim <- ssxx / n
> yyim <- ssyy / n
> ssx2 <- ssxx2 - ssxx ^ 2 / n
> ssy2 <- ssyy2 - ssyy ^ 2 / n
> ssxy <- ssxxyy - ssxx * ssyy / n
> bh <- ssxy / ssx2
> ah <- yyim - bh * xxim
> yyhi <- ah + bh * xxi
> ei <- yyi - yyhi
> ri <- ei / yyi * 100
> ai2 <- ei ^ 2 / sum(ei ^ 2) * 100
> #
> cat(sprintf("β^ = %.6f\n", bh))
β^ = 1.054475
> cat(sprintf("α^ = %.6f\n", ah))
α^ = 2.663670
> s <- sprintf("%7.5f %7.5f %8.5f %6.2f %5.2f", yyi, yyhi, ei, ri, ai2)
> for (i in 1:n) cat(sprintf("%2d %s\n", i, s[i]))
1 2.61007 2.50463 0.10544 4.04 2.49
2 2.80940 2.72511 0.08429 3.00 1.59
3 3.15700 3.41028 -0.25328 -8.02 14.35
4 2.32239 2.24138 0.08101 3.49 1.47
5 1.68640 1.69746 -0.01106 -0.66 0.03
6 2.70805 2.70503 0.00302 0.11 0.00
7 2.19722 2.37428 -0.17706 -8.06 7.01
8 2.50960 2.60958 -0.09998 -3.98 2.24
9 2.79117 2.78317 0.00799 0.29 0.01
10 2.73437 2.68455 0.04982 1.82 0.56
11 2.56495 2.67416 -0.10921 -4.26 2.67
12 2.66723 2.55257 0.11466 4.30 2.94
13 2.30259 2.07093 0.23166 10.06 12.00
14 2.32239 2.40167 -0.07929 -3.41 1.41
15 2.25129 2.34616 -0.09487 -4.21 2.01
16 0.40547 0.51231 -0.10684 -26.35 2.55
17 2.91777 2.90737 0.01040 0.36 0.02
18 2.53370 2.74482 -0.21113 -8.33 9.97
19 2.86220 2.62062 0.24158 8.44 13.06
20 1.58924 1.74891 -0.15968 -10.05 5.70
21 2.76632 2.67416 0.09216 3.33 1.90
22 2.14007 2.14245 -0.00238 -0.11 0.00
23 2.36085 2.27239 0.08846 3.75 1.75
24 2.63189 2.68455 -0.05266 -2.00 0.62
25 2.70136 2.45441 0.24695 9.14 13.64
> #
> plot(xxi, yyi, xlim = c(-2, 0.7), ylim = c(0.4, 3.5), pch = 20)
> idx <- order(xxi)
> lines(xxi[idx], yyhi[idx])
abs関数を使う。mathモジュールの関数ではなく、組み込み関数であることに注意。
>>> abs(10)
10
>>> abs(-20)
20
>>> abs(3.3) - abs(-3.3)
0.0
mathモジュールのsqrt関数を使う。
>>> import math
>>> math.sqrt(2)
1.4142135623730951
>>> math.sqrt(3)
1.7320508075688772
>>> math.sqrt(4)
2.0
>>> math.sqrt(-2)
Traceback (most recent call last):
File "", line 1, in
ValueError: math domain error
len関数を使う。
>>> len('ABC')
3
>>> len('あい')
2
>>> len('阿伊宇ab')
5
c関数を使う。
> n1 <- 1:3
> n2 <- 4:7
> print(n1)
[1] 1 2 3
> print(n2)
[1] 4 5 6 7
> print(c(n1, n2))
[1] 1 2 3 4 5 6 7
以下のとおり。○○○にはサインインしているアカウント名が入る。
C:\Users\○○○\anaconda3
C:\Users\○○○\anaconda3\Library\mingw-w64\bin
C:\Users\○○○\anaconda3\Library\usr\bin
C:\Users\○○○\anaconda3\Library\bin
C:\Users\○○○\anaconda3\Scripts
C:\Users\○○○\anaconda3\bin
C:\Users\○○○\anaconda3\condabin
sysモジュールのexit関数を使う。
import sys
print('終了')
sys.exit(3)
コマンドプロンプトでは、コマンド実行終了時の戻り値をエラーレベルといい、環境変数ERRORLEVELに格納される。
>python errorlevel.py
終了
>echo %errorlevel%
3
PowerShellでは、コマンド終了時の戻り値を終了コードといい、自動変数$lastexitcodeに格納される。
PS > python .\errorlevel.py
終了
PS > echo $lastexitcode
3
Anacondaのインストーラーでインストールした直後は、アプリと関連付けられてしまっているため、コマンドプロンプトなどでpythonを起動しようとするとストアが起動してしまう。このアプリとの関連付けを解除する。
numpyのarrayを使用してゼロ除算(0(ゼロ、零)で除算すること)などにより、計算結果がNaN(ナン、非数、not a number、0 / 0 の計算など)になるとき、このメッセージが表示される。
>>> import numpy as np
>>> x = np.zeros(2)
>>> x[0] = 0
>>> x[1] = 0
>>> print(x[0] / x[1])
<stdin>:1: RuntimeWarning: invalid value encountered in double_scalars
nan
numpyのarrayを使用してゼロ除算(0(ゼロ、零)で除算すること)して、計算結果が無限大(∞)になるときに、このメッセージが表示される。
>>> import numpy as np
>>> x = np.zeros(2)
>>> x[0] = 1
>>> x[1] = 0
>>> print(x[0] / x[1])
<stdin>:1: RuntimeWarning: divide by zero encountered in double_scalars
inf