[過去ログ]
Pythonのお勉強 Part68 (1002レス)
Pythonのお勉強 Part68 http://mevius.5ch.net/test/read.cgi/tech/1663235546/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
133: デフォルトの名無しさん (ワッチョイ 2f97-5djn) [] 2022/09/26(月) 09:12:30.59 ID:P9G+/qqR0 木構造とかグラフ構造を自作したいなら(間々ある)、 クラスにした方が便利なときある気がするけどな。 get_tree_children(node)とかしだすなら、node.children()の方が名前空間がすっきりしていいし。 実装の詳細を見せたくないかどうかというよりは、関心の分離をしたいかどうかによるような気がするな。 確かにクラス作るまでもないようなことは多いけど。 http://mevius.5ch.net/test/read.cgi/tech/1663235546/133
134: デフォルトの名無しさん (ワッチョイ 1e66-yYUR) [sage] 2022/09/26(月) 20:32:27.38 ID:b9hyANFk0 >>128 値が変えられないがな http://mevius.5ch.net/test/read.cgi/tech/1663235546/134
135: デフォルトの名無しさん (ワッチョイ 429b-+bWc) [sage] 2022/09/26(月) 23:15:54.08 ID:QR+uVx8I0 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 になるのでしょうか? http://mevius.5ch.net/test/read.cgi/tech/1663235546/135
136: デフォルトの名無しさん (ワッチョイ 429b-+bWc) [sage] 2022/09/26(月) 23:17:59.46 ID:QR+uVx8I0 >>135 ideone に貼っときます https://ideone.com/yVmxfv なぜでしょうか? http://mevius.5ch.net/test/read.cgi/tech/1663235546/136
137: デフォルトの名無しさん (ワッチョイ 1e66-yYUR) [sage] 2022/09/26(月) 23:31:03.60 ID:b9hyANFk0 a = 1 c = 1 の時と同じ理由 http://mevius.5ch.net/test/read.cgi/tech/1663235546/137
138: デフォルトの名無しさん (ワッチョイ 4b17-NGtF) [sage] 2022/09/26(月) 23:32:02.41 ID:Gide+MMY0 >>136 ならない http://mevius.5ch.net/test/read.cgi/tech/1663235546/138
139: デフォルトの名無しさん (ワッチョイ 4b17-NGtF) [sage] 2022/09/26(月) 23:33:01.37 ID:Gide+MMY0 ほらよ https://i.imgur.com/mESpBvj.jpg http://mevius.5ch.net/test/read.cgi/tech/1663235546/139
140: デフォルトの名無しさん (ワッチョイ d201-/Peb) [sage] 2022/09/26(月) 23:49:19.92 ID:eE4Lst2k0 >>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) http://mevius.5ch.net/test/read.cgi/tech/1663235546/140
141: デフォルトの名無しさん (ワッチョイ 4212-+bWc) [sage] 2022/09/27(火) 00:20:20.92 ID:LFY5tutJ0 >>140 ありがとうございます、オプティマイゼーションの余地がある、ということですね、納得しました http://mevius.5ch.net/test/read.cgi/tech/1663235546/141
142: デフォルトの名無しさん (ワッチョイ 2f97-5djn) [] 2022/09/27(火) 19:02:24.07 ID:zjZtbJ3M0 a is cが真になるかはかなりケースバイケースな気がするし、 中身を比較したいんだったら使うべきじゃないね 本当に同じtupleインスタンスかどうかを確認したいときだけにすべき http://mevius.5ch.net/test/read.cgi/tech/1663235546/142
143: デフォルトの名無しさん (ワッチョイ 3733-tX/F) [] 2022/09/27(火) 22:33:08.85 ID:3OHfLHhN0 tupleだけの話ではなくてどの型でも同じだけどね 例えば文字列とか http://mevius.5ch.net/test/read.cgi/tech/1663235546/143
144: デフォルトの名無しさん [sage] 2022/09/27(火) 23:35:04.66 ID:tKd9rAjb n=12345.67 小数点以下が何桁あるのか調べたいのですが len(str(n).split(".")[1]) if isinstance(n, float) else 0 こんなんでいいですかね・・? http://mevius.5ch.net/test/read.cgi/tech/1663235546/144
145: デフォルトの名無しさん (ワッチョイ 3733-tX/F) [] 2022/09/27(火) 23:51:45.87 ID:3OHfLHhN0 >>144 https://ideone.com/pSUvOH http://mevius.5ch.net/test/read.cgi/tech/1663235546/145
146: デフォルトの名無しさん (ワッチョイ 1610-DrlT) [] 2022/09/27(火) 23:53:56.84 ID:+joc5Asc0 >>144 誤差で予想外の挙動しそうだからDecimal使う方がいい http://mevius.5ch.net/test/read.cgi/tech/1663235546/146
147: デフォルトの名無しさん (ワッチョイ 2701-tX/F) [sage] 2022/09/28(水) 02:27:12.38 ID:OOL0jr8Q0 >>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 http://mevius.5ch.net/test/read.cgi/tech/1663235546/147
148: デフォルトの名無しさん [sage] 2022/09/28(水) 09:19:00.77 ID:9I9ISsCh >>145-147 たしかに 0.30000000000000004に対して17得られたのは正解だと思いますが 0.00001で1e-05になっててエラーでました Decimalかformat使ってみようと思います ありがとうございました http://mevius.5ch.net/test/read.cgi/tech/1663235546/148
149: デフォルトの名無しさん [sage] 2022/09/28(水) 10:07:58.97 ID:9I9ISsCh やりたかったことは 受けとった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でもいい みたいにしたかったのですが難しい・・ http://mevius.5ch.net/test/read.cgi/tech/1663235546/149
150: デフォルトの名無しさん [sage] 2022/09/28(水) 10:17:26.42 ID:9I9ISsCh from decimal import Decimal str(Decimal(0.123456)) str(Decimal(0.123456)*Decimal(1.05)) #'0.1296288000000000015945911258' あれ、そもそも0.123456の小数部の桁数はどうやって知るんだっけ?? てところで詰まってます・・ http://mevius.5ch.net/test/read.cgi/tech/1663235546/150
151: デフォルトの名無しさん [sage] 2022/09/28(水) 11:25:04.93 ID:9I9ISsCh 冗長な気がしますがこんな感じにしてみました 何かバグが発生しそうな気がします 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") http://mevius.5ch.net/test/read.cgi/tech/1663235546/151
152: デフォルトの名無しさん [sage] 2022/09/28(水) 11:30:47.23 ID:9I9ISsCh 連投すみません 結果です https://ideone.com/exojEw http://mevius.5ch.net/test/read.cgi/tech/1663235546/152
153: デフォルトの名無しさん (ワンミングク MM42-nX9g) [sage] 2022/09/28(水) 13:38:45.48 ID:E42G0/DqM 元々の桁数でroundしたいって感じなのかな http://mevius.5ch.net/test/read.cgi/tech/1663235546/153
154: デフォルトの名無しさん (ワッチョイ 2701-tX/F) [sage] 2022/09/28(水) 18:25:19.27 ID:OOL0jr8Q0 >>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は好みのオプションでどうぞ http://mevius.5ch.net/test/read.cgi/tech/1663235546/154
155: デフォルトの名無しさん [sage] 2022/09/28(水) 19:37:21.94 ID:9I9ISsCh >>154 ありがとうございます やはり至るところで誤差が発生するのですね 四捨五入は今回の用途ではどちらでも良い感じです せっかくなのでまとめてみました https://ideone.com/JmTu06 ありがとうございました http://mevius.5ch.net/test/read.cgi/tech/1663235546/155
156: デフォルトの名無しさん (ワッチョイ 96bb-nd6Q) [sage] 2022/09/28(水) 19:42:02.44 ID:o0cHd3Tq0 先にIEEE754読んでみては? 誤差に関しての勘所がわかるようになる http://mevius.5ch.net/test/read.cgi/tech/1663235546/156
157: デフォルトの名無しさん (ワッチョイ 2f97-5djn) [] 2022/09/28(水) 20:32:50.93 ID:x5UMfEp40 Pythonに限らず浮動小数点数を使う場合は常に誤差の問題がつきまとう。 0.1というのがすでに二進数ではきっちり表現できない数字なので、有効数字を何桁にするのかというのは実装の段階で決めなくちゃならない。 https://docs.python.org/ja/3/tutorial/floatingpoint.html 正確に表現できるのは、0.5,0.25,0.125...と1を2で割っていった数とその整数倍のみ 0.1は1/(2×5)となり1/5が2進数では循環小数となり浮動小数点数では正確に表せない。 ということを念頭に置いてまず何がやりたいか考えた方がいいよ。 decimalモジュールは便利そうだね。 http://mevius.5ch.net/test/read.cgi/tech/1663235546/157
158: デフォルトの名無しさん (ワッチョイ 23da-QqKk) [sage] 2022/09/28(水) 23:21:28.71 ID:FDPwu/KN0 log2で有効桁数計算出来るでしょ http://mevius.5ch.net/test/read.cgi/tech/1663235546/158
159: デフォルトの名無しさん (ワッチョイ 2701-tX/F) [sage] 2022/09/29(木) 00:26:06.29 ID:3C3gpnCY0 >>154 どちらの書き方でも -0.015 を四捨五入したら-0.02だった、すまん -0.01にしたい場合は自力でなんとかして http://mevius.5ch.net/test/read.cgi/tech/1663235546/159
160: デフォルトの名無しさん (ワッチョイ 9202-XjGR) [sage] 2022/09/30(金) 00:55:04.52 ID:qun5+YRs0 昔から不思議なんだけど 何で分数で処理しないのかな? 最後に割り算を一回だけすれば 誤差がでないじゃないの http://mevius.5ch.net/test/read.cgi/tech/1663235546/160
161: デフォルトの名無しさん (ガックシ 06de-TTgm) [sage] 2022/09/30(金) 01:46:32.47 ID:0IYvIpx66 掛け算でも足し算でも誤差が出るから http://mevius.5ch.net/test/read.cgi/tech/1663235546/161
162: デフォルトの名無しさん (ワッチョイ b302-nX9g) [sage] 2022/09/30(金) 01:53:32.93 ID:sForoGQI0 Pythonは整数側の桁数制限が無いのを利用して高精度にできそう http://mevius.5ch.net/test/read.cgi/tech/1663235546/162
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 840 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.014s