[過去ログ] Pythonのお勉強 Part68 (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
130: (ワッチョイ 4b08-KM/t) 2022/09/25(日)17:54 ID:AFTbeWYX0(1) AAS
クラスは実装の詳細を見せたくない時に限る
131: (ワッチョイ 1610-Nf8B) 2022/09/26(月)07:24 ID:ciNDFZ6I0(1) AAS
クラス名をclass Hoge
ファイル名をhoge.py
インポートでimport hoge
インスタンス名何にしようかいつも悩む
??? = hoge.Hoge()
132: (ワッチョイ 2f97-5djn) 2022/09/26(月)09:07 ID:P9G+/qqR0(1/2) AAS
>>81
そもそも[0,1]のときにx[0]を2つ取り出したいのかどうかがよくわからないな
あと、最大(?)は[0,10]じゃないか?
[0,9]のときと[0,10]のときでどう処理を変えたいのかよくわからない
半開区間に含まれる最小最大を取り出したいなら、
for i in [idxs[0], idxs[1] - 1]でいいと思うのだけどこれは嫌?
133: (ワッチョイ 2f97-5djn) 2022/09/26(月)09:12 ID:P9G+/qqR0(2/2) AAS
木構造とかグラフ構造を自作したいなら(間々ある)、
クラスにした方が便利なときある気がするけどな。
get_tree_children(node)とかしだすなら、node.children()の方が名前空間がすっきりしていいし。
実装の詳細を見せたくないかどうかというよりは、関心の分離をしたいかどうかによるような気がするな。
確かにクラス作るまでもないようなことは多いけど。
134: (ワッチョイ 1e66-yYUR) 2022/09/26(月)20:32 ID:b9hyANFk0(1/2) AAS
>>128
値が変えられないがな
135(2): (ワッチョイ 429b-+bWc) 2022/09/26(月)23:15 ID:QR+uVx8I0(1/2) AAS
python 3.9.10
a = (1, 2, 3)
b = a
c = (1, 2, 3)
print(a==b)
print(a is b)
print(a==c)
print(a is c) #True?
なぜ a is c が true になるのでしょうか?
136(1): (ワッチョイ 429b-+bWc) 2022/09/26(月)23:17 ID:QR+uVx8I0(2/2) AAS
>>135
ideone に貼っときます
外部リンク:ideone.com
なぜでしょうか?
137: (ワッチョイ 1e66-yYUR) 2022/09/26(月)23:31 ID:b9hyANFk0(2/2) AAS
a = 1
c = 1
の時と同じ理由
138: (ワッチョイ 4b17-NGtF) 2022/09/26(月)23:32 ID:Gide+MMY0(1/2) AAS
>>136
ならない
139(1): (ワッチョイ 4b17-NGtF) 2022/09/26(月)23:33 ID:Gide+MMY0(2/2) AAS
ほらよ
画像リンク
140(1): (ワッチョイ d201-/Peb) 2022/09/26(月)23:49 ID:eE4Lst2k0(1) AAS
>>139
それREPLでやってるからinterningが効いてないじゃないかな
>>135
Tupleはimmutableだからaとcが同じオブジェクトを指しても問題なくて
Pythonが最適化をした場合はa is cがTrueになるケースがある
「interning」でググってみて
例えばTupleを関数で返すようにすればinterningされずにFalseになると思う
def foo(x):
return (x, x+1, x+2)
a = foo(1)
c = foo(1)
141: (ワッチョイ 4212-+bWc) 2022/09/27(火)00:20 ID:LFY5tutJ0(1) AAS
>>140
ありがとうございます、オプティマイゼーションの余地がある、ということですね、納得しました
142: (ワッチョイ 2f97-5djn) 2022/09/27(火)19:02 ID:zjZtbJ3M0(1) AAS
a is cが真になるかはかなりケースバイケースな気がするし、
中身を比較したいんだったら使うべきじゃないね
本当に同じtupleインスタンスかどうかを確認したいときだけにすべき
143: (ワッチョイ 3733-tX/F) 2022/09/27(火)22:33 ID:3OHfLHhN0(1/2) AAS
tupleだけの話ではなくてどの型でも同じだけどね
例えば文字列とか
144(3): 2022/09/27(火)23:35 ID:tKd9rAjb(1) AAS
n=12345.67
小数点以下が何桁あるのか調べたいのですが
len(str(n).split(".")[1]) if isinstance(n, float) else 0
こんなんでいいですかね・・?
145(1): (ワッチョイ 3733-tX/F) 2022/09/27(火)23:51 ID:3OHfLHhN0(2/2) AAS
>>144
外部リンク:ideone.com
146(1): (ワッチョイ 1610-DrlT) 2022/09/27(火)23:53 ID:+joc5Asc0(1) AAS
>>144
誤差で予想外の挙動しそうだからDecimal使う方がいい
147(1): (ワッチョイ 2701-tX/F) 2022/09/28(水)02:27 ID:OOL0jr8Q0(1/2) AAS
>>144
それだと
n=1.0 -> 1
n=0.00001 -> IndexError
になる
len(format(n,".17f").split(".")[1].rstrip("0"))
後ろのif isinstance(n, float) else 0も不要
n=1.0 -> 0
n=0.00001 -> 5
148: 2022/09/28(水)09:19 ID:9I9ISsCh(1/6) AAS
>>145-147
たしかに
0.30000000000000004に対して17得られたのは正解だと思いますが
0.00001で1e-05になっててエラーでました
Decimalかformat使ってみようと思います
ありがとうございました
149: 2022/09/28(水)10:07 ID:9I9ISsCh(2/6) AAS
やりたかったことは
受けとった1234.56や0.12345などの固定小数点数に
0.1とかを掛けたり足したりして計算、変形したのを
受け取った固定小数点数の整数部と小数部の数を維持したまま
固定小数点か文字列で処理したかったのですが
改めてやってみるとなんか勝手に桁数が変わってしまいますね・・
1234.56で受け取った場合、1.05を掛けたとき→1296.288ではなく1296.29
0.12345で受け取った場合、1.05を掛けたとき→0.1296225ではなく0.12962
1234で受け取った場合、1.05を掛けたとき→1295.7でもいいし1296でもいいし1296.0でもいい
みたいにしたかったのですが難しい・・
150: 2022/09/28(水)10:17 ID:9I9ISsCh(3/6) AAS
from decimal import Decimal
str(Decimal(0.123456))
str(Decimal(0.123456)*Decimal(1.05))
#'0.1296288000000000015945911258'
あれ、そもそも0.123456の小数部の桁数はどうやって知るんだっけ??
てところで詰まってます・・
151: 2022/09/28(水)11:25 ID:9I9ISsCh(4/6) AAS
冗長な気がしますがこんな感じにしてみました
何かバグが発生しそうな気がします
from decimal import Decimal
ary=[1234.5,165,0.34,0.0001,0.000001,3.00001,0.1*3,123456]
def f(n):
s=format(n)
return int(s.split("-")[1]) if "-" in s else len(s.split(".")[1].rstrip("0")) if "." in s else 0
r=1.05
for n in ary:
d=f(n)
c=Decimal(n)*Decimal(r)
rs=c.quantize(Decimal("0."+("0"*d)))
print(n,c,d)
print("-->",rs,"\n")
152(1): 2022/09/28(水)11:30 ID:9I9ISsCh(5/6) AAS
連投すみません 結果です
外部リンク:ideone.com
153: (ワンミングク MM42-nX9g) 2022/09/28(水)13:38 ID:E42G0/DqM(1) AAS
元々の桁数でroundしたいって感じなのかな
154(2): (ワッチョイ 2701-tX/F) 2022/09/28(水)18:25 ID:OOL0jr8Q0(2/2) AAS
>>152
format使うの提案したけど使わないほうがよさそう、誤差がでる
f(n): 負数で落ちる
s=str(n).lstrip("-")
c=Decimal(n*r) のところで
n*r で誤差がでる
c=Decimal(str(n)) * Decimal(str(r))
負数対応四捨五入 -0.015 を四捨五入して -0.02
rs=((c > 0) - (c < 0)) * abs(c).quantize(Decimal("0."+("0"*d)), rounding=ROUND_HALF_UP)
-0.015 を四捨五入して -0.01のようにしたい場合
rs=c.quantize(Decimal("0."+("0"*d)), rounding=ROUND_HALF_UP)
四捨五入したいのかよくわからんかった、roundingは好みのオプションでどうぞ
155: 2022/09/28(水)19:37 ID:9I9ISsCh(6/6) AAS
>>154
ありがとうございます
やはり至るところで誤差が発生するのですね
四捨五入は今回の用途ではどちらでも良い感じです
せっかくなのでまとめてみました
外部リンク:ideone.com
ありがとうございました
156: (ワッチョイ 96bb-nd6Q) 2022/09/28(水)19:42 ID:o0cHd3Tq0(1) AAS
先にIEEE754読んでみては?
誤差に関しての勘所がわかるようになる
157: (ワッチョイ 2f97-5djn) 2022/09/28(水)20:32 ID:x5UMfEp40(1) AAS
Pythonに限らず浮動小数点数を使う場合は常に誤差の問題がつきまとう。
0.1というのがすでに二進数ではきっちり表現できない数字なので、有効数字を何桁にするのかというのは実装の段階で決めなくちゃならない。
外部リンク[html]:docs.python.org
正確に表現できるのは、0.5,0.25,0.125...と1を2で割っていった数とその整数倍のみ
0.1は1/(2×5)となり1/5が2進数では循環小数となり浮動小数点数では正確に表せない。
ということを念頭に置いてまず何がやりたいか考えた方がいいよ。
decimalモジュールは便利そうだね。
158: (ワッチョイ 23da-QqKk) 2022/09/28(水)23:21 ID:FDPwu/KN0(1) AAS
log2で有効桁数計算出来るでしょ
159: (ワッチョイ 2701-tX/F) 2022/09/29(木)00:26 ID:3C3gpnCY0(1) AAS
>>154
どちらの書き方でも
-0.015 を四捨五入したら-0.02だった、すまん
-0.01にしたい場合は自力でなんとかして
上下前次1-新書関写板覧索設栞歴
あと 843 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ
ぬこの手 ぬこTOP 0.015s