[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2ch.scのread.cgiへ]
Update time : 07/24 13:04 / Filesize : 241 KB / Number-of Response : 994
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Pythonのお勉強 Part68



1 名前:デフォルトの名無しさん mailto:sage [2022/09/15(木) 18:52:26.67 ID:VqLViKoX0.net]
!extend:default:vvvvv:1000:1024
!extend:default:vvvvv:1000:1024
↑スレ立てる毎に減るので、減ってたら3つに補充すること。

・当スレにRubyのソースコード類を書くことを禁ず
・Ruby等、Pythonではないプログラミング言語での回答類・質問を書くのも禁止
・「Ruby では」「Rubyでは」「Rails」正規表現→「^クソチョンw$」をNGワード登録推奨
・エラーを解決したいときは、かならず
 エラー文(勝手に省略orスクショうp等の横着禁止)と
 おま環(Pythonのバージョン番号+OS名とバージョン+IDE名)を書け。

★Pythonのソースコードを5ちゃんに直貼はインデントが崩壊するので、
  ↓等のコードうp用サイトに貼ってきてくだしあ。(スクリーンショットをうpる「横着」禁止)
ttps://techiedelight.com/compiler/  Run Code機能あり。
ttp://ideone.com/      デフォ設定がCなので、Pythonするには言語種選択ボタン押下がピコ手間かも。
ttp://pastebin.com/     まずまずシンプル。
ttp://dpaste.com/      とてもシンプル。消えるまでの日数は十分長ーく指定のこと。

◇Pythonオフィシャルサイト www.python.org/
◇Pythonドキュメント https://docs.python.org/ja/3/
◇まとめwiki ttp://python.rdy.jp/

●関連スレ● 自称初心者は↓へ
【まず1嫁】くだすれPython(超初心者用) その57
mevius.5ch.net/test/read.cgi/tech/1653225908/

〇前スレ〇
Pythonのお勉強 Part67
https://mevius.5ch.net/test/read.cgi/tech/1653540315/

次スレの建立は>>985が挑戦する。(980通過して24h後も落ちなくなった)
### END of TEMPLATE ### ​
VIPQ2_EXTDAT: default:vvvvv:1000:512:: EXT was configured

62 名前:デフォルトの名無しさん mailto:sage [2022/09/21(水) 20:13:22.49 ID:VhW4jWqJ0.net]
os関連の処理は互換性とか捨てて、subprocessでやるのが楽でしかも安定してる

63 名前:デフォルトの名無しさん mailto:sage [2022/09/21(水) 20:30:50.72 ID:2GcRUbUk0.net]
繰り返される任意の文字列を1回の繰り返しに直す方法ありませんか?

"abcdabcdabcdefg"→"abcdefg"(abcdの繰り返し)
"abababc"→"abc"(abの繰り返し)
"aabbaabbc"→"aabbc"(aabbの繰り返し)

パターンの長さはとりあえず固定でいいので(例えば4でabcdとaabbはマッチできる)一気に置換する方法ないでしょうか

64 名前:デフォルトの名無しさん mailto:sage [2022/09/21(水) 20:30:55.54 ID:b5Bal3Dn0.net]
>>60
存在してます。path.rename()書いてない時は、同名のフォルダが作られて「すでに存在してる〜」みたいなエラーを吐いてました

そもそもpathlib使って>>52をやりたい場合は、osを使う必要がなかったりもするのでしょうか?

65 名前:デフォルトの名無しさん [2022/09/21(水) 20:31:19.96 ID:yjl6UhSi0.net]
>>59
https://ideone.com/E4lQt0

66 名前:デフォルトの名無しさん mailto:sage [2022/09/21(水) 20:52:17.39 ID:b5Bal3Dn0.net]
>>64
参考に直して見たら無事にできました。ありがとうございます。
https://i.ibb.co/XSzr82B/CB-0002.jpg

67 名前:デフォルトの名無しさん mailto:sage [2022/09/21(水) 20:58:11.32 ID:b5Bal3Dn0.net]
変数名とか色々、短く略して書いた方が良いのでしょうか?
入力時間的には大差ないので、見返した時に分かりやすいようにしてるのですが
これは初心者だからで、経験者から見ると見苦しいとか、むしろ略されてた方が見やすいとかありますか?

68 名前:デフォルトの名無しさん [2022/09/21(水) 22:11:39.31 ID:yjl6UhSi0.net]
>>62
競プロの問題?

69 名前:デフォルトの名無しさん mailto:sage [2022/09/21(水) 22:25:22.90 ID:sVtx8qcf0.net]
>>62
質問の意味がよくわからん
"abcdabcdefcdefg"の場合どうしたいの

70 名前:デフォルトの名無しさん (ワッチョイ d763-DwLj) mailto:sage [[ここ壊れてます] .net]
LZ78の考え方の応用で行け



71 名前:デフォルトの名無しさん (ワッチョイ ffdb-OuJ4) mailto:sage [[ここ壊れてます] .net]
>>67
普通に処理したいだけです

>>68
"abcdabcdefcdefg"なら"(abcdabcd)efcdefg"→"abcdefcdefg"だと思います

72 名前:デフォルトの名無しさん (ワッチョイ ffdb-OuJ4) mailto:sage [[ここ壊れてます] .net]
あ、cdefcdefが繰り返されていたんですね…
最終的に人がチェックする工程があるので、先にマッチした方優先とかで大丈夫です

73 名前:デフォルトの名無しさん [2022/09/21(水) 23:11:15.16 ID:yjl6UhSi0.net]
'abcabcdabcabcdefg'
だったら?

74 名前:デフォルトの名無しさん mailto:sage [2022/09/21(水) 23:16:47.91 ID:VS1qJent0.net]
長さ4固定でいいなら、正規表現あたりで

>>> import re
>>> re.sub(r'(....)\1+', r'\1', "abcdabcdabcdefg")
'abcdefg'
>>> re.sub(r'(....)\1+', r'\1', "aabbaabbc")
'aabbc'

75 名前:デフォルトの名無しさん mailto:sage [2022/09/21(水) 23:21:53.64 ID:757dNGj40.net]
>>62
https://www.online-python.com/36ZCD0xAqV

76 名前:デフォルトの名無しさん mailto:sage [2022/09/21(水) 23:30:41.78 ID:Qxk2XzJU0.net]
そこにforを使うなんて

77 名前:デフォルトの名無しさん mailto:sage [2022/09/21(水) 23:49:19.41 ID:2GcRUbUk0.net]
>>73 >>74
ありがとうございます!
文中に含まれてるものにも対処したいので73を長さ変えながら複数回適用で使いたいと思います

78 名前:デフォルトの名無しさん (アウアウウー Sa5b-8eP5) [[ここ壊れてます] .net]
>>39
いらね

79 名前:デフォルトの名無しさん [2022/09/22(木) 11:11:13.09 ID:u9/ouAZsa.net]
>>72 の回答はよ

80 名前:デフォルトの名無しさん mailto:sage [2022/09/22(木) 11:12:02.23 ID:ufV304t80.net]
見てすぐ判らんようなもんは使うべきではないな



81 名前:デフォルトの名無しさん mailto:sage [2022/09/22(木) 13:04:09.56 ID:kBSagdtc0.net]
abracadabra

82 名前:デフォルトの名無しさん [2022/09/23(金) 06:05:04.44 ID:l/gDdEyB0.net]
x = [i for i in range(10)]
idxs = [start, end] # 0 <= start <= end <= max(x)かつend +=1

xが上記の場合
最小はidxs = [0, 1]
最大は idxs = [0, 11]
です。このとき
for i in idxs:
__x[i]
だと最後が11のときindexErrorになるんだけど
try exceptでcontinueする以外にいい書き方ないですか

if i == len(x): breakみたいなのとか
_idxs[1] -= 1
for i in idxs:
みたいなのは嫌です

83 名前:デフォルトの名無しさん mailto:sage [2022/09/23(金) 06:29:46.22 ID:ciin+wbx6.net]
その11にはどういう意味があるんですか

84 名前:デフォルトの名無しさん mailto:sage [2022/09/23(金) 06:42:29.24 ID:j5q+73vfM.net]
>>82
そもそも、「いい書き方」って何ですか

85 名前:デフォルトの名無しさん mailto:sage [2022/09/23(金) 07:14:40.79 ID:ILPrLpfC0.net]
これ、やべぇな
https://gigazine.net/news/20220922-python-old-bug-unpatched-15-years/

GitHub Copilot とかで広まっちゃうのか

86 名前:デフォルトの名無しさん (スッププ Sdbf-HYId) mailto:sage [[ここ壊れてます] .net]
>>84
これは完全に誤訳
翻訳元では、GitHub上の数多くのOSSにこの脆弱性が存在するからCopilot等がそれを学習して広がるかもしれないと言っているだけ

87 名前:デフォルトの名無しさん (ワッチョイ bf66-C6xl) mailto:sage [[ここ壊れてます] .net]
そんな風に読んだけど違うの?

88 名前:デフォルトの名無しさん mailto:sage [2022/09/23(金) 10:22:01.14 ID:7VR4OLWz0.net]
確かにtarを使うリポジトリではcopilot経由で広がる可能性があるけど、tarを使うリポジトリなんてリポジトリ検索してもそんなにないので実数としては眉唾
依存関係から侵入してくる方がよっぽど可能性が高い

Copilotが批判されがちなので批判の文脈で喋ったほうが肯定的に聞いてもらえるだろうという余計な意図が入ってるのではと邪推してしまうね:)

89 名前:デフォルトの名無しさん mailto:sage [2022/09/23(金) 12:26:25.28 ID:nucVVsrtd.net]
>>86
> Trellixによると、35万件を超えるリポジトリがこの脆弱性に脅かされていると見られ、その多くでGitHub Copilotなどの自動ツールが使われているとのこと。
前知識なく普通にこれ読んだら、35万件のリポジトリがGitHub Copilptを使っている、そして、Copilotがその脆弱性の原因であると思うでしょ
というかこの記事書いた人はたぶんそのように誤解してる
> https://www.trellix.com/en-us/about/newsroom/stories/research/open-source-intelligence.html
まあソースも推計方法や論理がガバガバで似たようなレベルだが

90 名前:デフォルトの名無しさん (アウアウウー Sa5b-8eP5) [[ここ壊れてます] .net]
>>81 が何を考えてるのか詳しく知りたいなωωω



91 名前:デフォルトの名無しさん mailto:sage [2022/09/24(土) 01:05:33.05 ID:WVAdUwxP0.net]
>>81
インデックスなら0~10の番号で管理すべきじゃないの
endを取り出して使うときに+1すれば良いんじゃない
スライシングと混同してるのかな

92 名前:デフォルトの名無しさん [2022/09/24(土) 02:03:35.51 ID:6DJLRQJMH.net]
>>90
外部入力でスライス範囲を受け取ってて(start, end)
その値を使いまわしてインデックスアクセスしたいんだろう
テーブル扱うGUIとかでままある

93 名前:デフォルトの名無しさん mailto:sage [2022/09/24(土) 07:13:39.52 ID:52DloiQc0.net]
単にインデックスの範囲とスライスを混同してるだけだろ
外部からの入力なら値のチェックは必須だしその時に調整しとけばいいだけ

94 名前:デフォルトの名無しさん mailto:sage [2022/09/24(土) 07:29:05.56 ID:RoHmfu6K0.net]
一昔前のseabornのカラーマップだか忘れたけど1から数えて最後の数字を入れるようなインデックス指定を偶に見かける
[0, 10] → 0から9までと
[1, 10] → そもそも0が存在せず1から10
この2つの書き方にそれぞれ名前ついてたりする?

95 名前:デフォルトの名無しさん mailto:sage [2022/09/24(土) 08:37:46.88 ID:3mLYFKO40.net]
>>93
前者は「半開区間」として [0,10) といった表記にするのをよく見る

96 名前:デフォルトの名無しさん mailto:sage [2022/09/24(土) 09:09:58.79 ID:RoHmfu6K0.net]
>>94
あーたしかに数学で見るわ

97 名前:デフォルトの名無しさん mailto:sage [2022/09/24(土) 09:21:01.36 ID:P3HsQQA/0.net]
メモリマップとかで、
A: 0x0000 - 0x0fff
B: 0x1000 - 0x1fff
みたいに末尾をfffにせずに、末尾は1足して表記する、という約束にした方が使いやすい

98 名前:デフォルトの名無しさん mailto:sage [2022/09/24(土) 09:53:57.04 ID:N1C+NhRL0.net]
そうすると最後は
F: 0xf000 - 0x10000
と最後だけ2バイトでは表記しきれなくなるね

99 名前:デフォルトの名無しさん mailto:sage [2022/09/24(土) 10:03:22.17 ID:P3HsQQA/0.net]
それはもう0でいい

100 名前:デフォルトの名無しさん mailto:sage [2022/09/24(土) 10:26:03.89 ID:8OhmHPew0.net]
すみません、プログラミング初心者です、python構築について質問があります
python3.10.7をインストールしたのですがコンドプロンプトで確認したらpython 3.9.12になっています
もしかしたら以前DLしてたのかと思って探しても見つからないのですが
こういうものなのでしょうか?



101 名前:デフォルトの名無しさん mailto:sage [2022/09/24(土) 10:37:33.81 ID:8OhmHPew0.net]
すみません、調べてみたらanacondaの方にpythonが入ってたみたいです

102 名前:デフォルトの名無しさん [2022/09/24(土) 10:54:04.69 ID:gdtERKOB0.net]
まーたanaconda被害者がひとり…

103 名前:デフォルトの名無しさん mailto:sage [2022/09/24(土) 10:55:37.98 ID:8OhmHPew0.net]
>>101
そんなに有名な事でしたか…
調べても出てこなかったので

104 名前:デフォルトの名無しさん [2022/09/24(土) 11:18:28.18 ID:4ctEaw520.net]
君は悪くない、anacondaも悪くない
anacondaを進める入門的な書籍やサイトが悪い

105 名前:デフォルトの名無しさん mailto:sage [2022/09/24(土) 11:29:33.35 ID:8t4kL4/n0.net]
pipでバイナリを配布できなかった時代ならまだしも、今そんな時代じゃないしな~

106 名前:デフォルトの名無しさん mailto:sage [2022/09/24(土) 11:34:58.91 ID:P3HsQQA/0.net]
何かのツールをインストールするとpythonも一緒にインストールされるのはよくある
python2だったりもする
大抵は、自分用のバイナリを自分で使うだけなので迷惑はかけないけど、
行儀の悪い奴もいる

107 名前:デフォルトの名無しさん mailto:sage [2022/09/24(土) 12:01:38.29 ID:52DloiQc0.net]
>>98
さすがにそれはアホすぎる

108 名前:デフォルトの名無しさん [2022/09/24(土) 12:23:45.45 ID:gdtERKOB0.net]
未だにpython事始めで検索すると
無責任な入門サイトの「anaconda入れとけ☆」 ばっかり
いやべつにいいんだけどさあanacondaでも。オールインワンで便利なのも分かるけど

109 名前:デフォルトの名無しさん mailto:sage [2022/09/24(土) 13:25:40.55 ID:mEJjKZc00.net]
anacondaでもpipでも両方使えばいいジャマイカ

110 名前:デフォルトの名無しさん mailto:sage [2022/09/24(土) 13:33:00.23 ID:+zHy6u5Kr.net]
condaのコマンドで新しい環境作れるようにしたらスタンドアロンのpythonが外れた記憶ある



111 名前:デフォルトの名無しさん mailto:sage [2022/09/24(土) 15:33:58.69 ID:BGgCMaIl0.net]
俺も初心者の頃はアナコンダ入れてた。
けど後から無駄も多く必要ないことがわかったのでアンインストールした。
pythonとVSCodeあれば事足りる。

112 名前:デフォルトの名無しさん (ワッチョイ 1214-P81A) mailto:sage [[ここ壊れてます] .net]
ファイル名に使えない文字を全角に変換するコードってこんなに長くなるものなんですか?
https://qiita.com/kusunamisuna/items/a32679874afedc032158

name_ng = ["/","\",":","*","?","<",">","|"]
こんな感じでリストに入れてfor文の中で replace で置換すれば良いんじゃないかと思ったけど、リストにする段階でエラーになります

上記のURLの記述が最適解?
簡略化された書き方があったら教えてほしいです。

113 名前:デフォルトの名無しさん mailto:sage [[ここ壊れてます] .net]
a=True
b=True

aかつbがTrue、それ以外の全て
の条件って
if not (a and b): でよかったっけ・・?

114 名前:デフォルトの名無しさん (ブーイモ MMde-zdrj) mailto:sage [[ここ壊れてます] .net]
>>111
translate使えばforすらいらない

115 名前:デフォルトの名無しさん mailto:sage [2022/09/24(土) 18:29:31.09 ID:LDtPUxey0.net]
>>111
その記事が最適かどうかは別問題として、まず0x5cをちゃんとエスケープして、あなたの考えを動くコードとして完成させよう
その上で、記事のコードと分かりやすさや速度を気の済むまで比較してみればよい

116 名前:デフォルトの名無しさん mailto:sage [2022/09/24(土) 19:22:50.96 ID:nYu0cH9J0.net]
>>113
調べて試してみます

>>114
そもそも ”\” は文字列としても単体では使うことができない感じですかね?
知らなかったです。教えてくれてありがとうございます

117 名前:デフォルトの名無しさん (アウアウウー Sa43-a1Je) [[ここ壊れてます] .net]
r'hoge\hoge'

118 名前:デフォルトの名無しさん [2022/09/25(日) 00:00:20.77 ID:TfTFVrn20.net]
>>112
if all([a, b]):
else

119 名前:デフォルトの名無しさん mailto:sage [2022/09/25(日) 00:30:59.06 ID:wq9M03AC0.net]
allとanyは積極的に使おう
フラグを別に持つとか途中で抜けてループ変数を見るとか、
何でレガシーな言語はそれで満足してたのか判らん

120 名前:デフォルトの名無しさん [2022/09/25(日) 02:03:20.35 ID:ouzeiwB30.net]
今日からPython始めたんだけど、エラーが出て動かなくて悩んでたらインデントが原因だったw
調べたらインデント自体プログラム構造的に意味を持ってたんだな。。。



121 名前:デフォルトの名無しさん mailto:sage [2022/09/25(日) 05:32:21.54 ID:WCcUyzUQ0.net]
少しコードが長くなってきたので、関数を定義してみようと思ったのですが
関数を使うくらいなら、最初からclassとmethodでやった方が後々便利ですかね?

それから現段階ではまだinstance変数を使うかどうかは不明ですが
classの最初に__init__は決まり文句として書いておいて良いのでしょうか?
仮に全く使わなかった場合にバグの元になったりするのでしょうか?

122 名前:デフォルトの名無しさん [2022/09/25(日) 05:38:14.60 ID:iEmY5l+s0.net]
そのレベルならまず関数に慣れよう
classはそのあと

123 名前:デフォルトの名無しさん mailto:sage [2022/09/25(日) 05:54:55.13 ID:WCcUyzUQ0.net]
了解しました

124 名前:デフォルトの名無しさん mailto:sage [2022/09/25(日) 11:02:47.56 ID:sQFmQmse0.net]
classを使うほうが常に優れていると思ってるなら認識を改めたほうがいいよ。
classと関数両方使えるがpythonのメリット。
標準ライブラリだって両方共存してるのにどちらかを捨てるなんてもったいない

125 名前:デフォルトの名無しさん mailto:sage [2022/09/25(日) 11:22:42.32 ID:Sdaj2srm0.net]
自己満だからといっていつも意識的にそれらを考えていかなければより良い設計はできないのかもしれない

126 名前:デフォルトの名無しさん mailto:sage [2022/09/25(日) 11:43:23.68 ID:rlnwElI30.net]
クラスはメンバ変数にselfが強制だからコードが冗長になって嫌だわ

127 名前:デフォルトの名無しさん [2022/09/25(日) 12:37:00.29 ID:uj3dGGMEr.net]
>>125
インデントも深くなるし、状態持つ必要が無ければモジュール化で十分よな

128 名前:デフォルトの名無しさん mailto:sage [2022/09/25(日) 12:49:19.19 ID:wq9M03AC0.net]
大仰なクラスを作ろうとするから
インスタンス変数が2つだけ、みたいなのでも十分役立つ

129 名前:デフォルトの名無しさん [2022/09/25(日) 17:18:10.55 ID:hs4ndUhv0.net]
>>127
それくらいならNamedTupleでも良いかな

130 名前:デフォルトの名無しさん [2022/09/25(日) 17:41:46.06 ID:iEmY5l+s0.net]
dataclassええで



131 名前:デフォルトの名無しさん mailto:sage [2022/09/25(日) 17:54:34.18 ID:AFTbeWYX0.net]
クラスは実装の詳細を見せたくない時に限る

132 名前:デフォルトの名無しさん mailto:sage [2022/09/26(月) 07:24:51.77 ID:ciNDFZ6I0.net]
クラス名をclass Hoge
ファイル名をhoge.py
インポートでimport hoge
インスタンス名何にしようかいつも悩む
??? = hoge.Hoge()

133 名前:デフォルトの名無しさん [2022/09/26(月) 09:07:29.52 ID:P9G+/qqR0.net]
>>81
そもそも[0,1]のときにx[0]を2つ取り出したいのかどうかがよくわからないな
あと、最大(?)は[0,10]じゃないか?
[0,9]のときと[0,10]のときでどう処理を変えたいのかよくわからない
半開区間に含まれる最小最大を取り出したいなら、
for i in [idxs[0], idxs[1] - 1]でいいと思うのだけどこれは嫌?

134 名前:デフォルトの名無しさん [2022/09/26(月) 09:12:30.59 ID:P9G+/qqR0.net]
木構造とかグラフ構造を自作したいなら(間々ある)、
クラスにした方が便利なときある気がするけどな。
get_tree_children(node)とかしだすなら、node.children()の方が名前空間がすっきりしていいし。
実装の詳細を見せたくないかどうかというよりは、関心の分離をしたいかどうかによるような気がするな。

確かにクラス作るまでもないようなことは多いけど。

135 名前:デフォルトの名無しさん mailto:sage [2022/09/26(月) 20:32:27.38 ID:b9hyANFk0.net]
>>128
値が変えられないがな

136 名前:デフォルトの名無しさん mailto:sage [2022/09/26(月) 23:15:54.08 ID:QR+uVx8I0.net]
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 になるのでしょうか?

137 名前:デフォルトの名無しさん mailto:sage [2022/09/26(月) 23:17:59.46 ID:QR+uVx8I0.net]
>>135
ideone に貼っときます
https://ideone.com/yVmxfv

なぜでしょうか?

138 名前:デフォルトの名無しさん mailto:sage [2022/09/26(月) 23:31:03.60 ID:b9hyANFk0.net]
a = 1
c = 1
の時と同じ理由

139 名前:デフォルトの名無しさん mailto:sage [2022/09/26(月) 23:32:02.41 ID:Gide+MMY0.net]
>>136
ならない

140 名前:デフォルトの名無しさん mailto:sage [2022/09/26(月) 23:33:01.37 ID:Gide+MMY0.net]
ほらよ
https://i.imgur.com/mESpBvj.jpg



141 名前:デフォルトの名無しさん mailto:sage [2022/09/26(月) 23:49:19.92 ID:eE4Lst2k0.net]
>>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)

142 名前:デフォルトの名無しさん mailto:sage [2022/09/27(火) 00:20:20.92 ID:LFY5tutJ0.net]
>>140
ありがとうございます、オプティマイゼーションの余地がある、ということですね、納得しました

143 名前:デフォルトの名無しさん [2022/09/27(火) 19:02:24.07 ID:zjZtbJ3M0.net]
a is cが真になるかはかなりケースバイケースな気がするし、
中身を比較したいんだったら使うべきじゃないね

本当に同じtupleインスタンスかどうかを確認したいときだけにすべき

144 名前:デフォルトの名無しさん [2022/09/27(火) 22:33:08.85 ID:3OHfLHhN0.net]
tupleだけの話ではなくてどの型でも同じだけどね
例えば文字列とか

145 名前:デフォルトの名無しさん mailto:sage [2022/09/27(火) 23:35:04.66 ID:tKd9rAjb.net]
n=12345.67

小数点以下が何桁あるのか調べたいのですが
len(str(n).split(".")[1]) if isinstance(n, float) else 0
こんなんでいいですかね・・?

146 名前:デフォルトの名無しさん [2022/09/27(火) 23:51:45.87 ID:3OHfLHhN0.net]
>>144
https://ideone.com/pSUvOH

147 名前:デフォルトの名無しさん [2022/09/27(火) 23:53:56.84 ID:+joc5Asc0.net]
>>144
誤差で予想外の挙動しそうだからDecimal使う方がいい

148 名前:デフォルトの名無しさん mailto:sage [2022/09/28(水) 02:27:12.38 ID:OOL0jr8Q0.net]
>>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

149 名前:デフォルトの名無しさん mailto:sage [2022/09/28(水) 09:19:00.77 ID:9I9ISsCh.net]
>>145-147
たしかに
0.30000000000000004に対して17得られたのは正解だと思いますが
0.00001で1e-05になっててエラーでました
Decimalかformat使ってみようと思います
ありがとうございました

150 名前:デフォルトの名無しさん mailto:sage [2022/09/28(水) 10:07:58.97 ID:9I9ISsCh.net]
やりたかったことは
受けとった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でもいい
みたいにしたかったのですが難しい・・



151 名前:デフォルトの名無しさん mailto:sage [2022/09/28(水) 10:17:26.42 ID:9I9ISsCh.net]
from decimal import Decimal
str(Decimal(0.123456))
str(Decimal(0.123456)*Decimal(1.05))
#'0.1296288000000000015945911258'

あれ、そもそも0.123456の小数部の桁数はどうやって知るんだっけ??
てところで詰まってます・・

152 名前:デフォルトの名無しさん mailto:sage [2022/09/28(水) 11:25:04.93 ID:9I9ISsCh.net]
冗長な気がしますがこんな感じにしてみました
何かバグが発生しそうな気がします
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(

153 名前:r)
 rs=c.quantize(Decimal("0."+("0"*d)))
 print(n,c,d)
 print("-->",rs,"\n")
[]
[ここ壊れてます]

154 名前:デフォルトの名無しさん mailto:sage [2022/09/28(水) 11:30:47.23 ID:9I9ISsCh.net]
連投すみません 結果です
https://ideone.com/exojEw

155 名前:デフォルトの名無しさん mailto:sage [2022/09/28(水) 13:38:45.48 ID:E42G0/DqM.net]
元々の桁数でroundしたいって感じなのかな

156 名前:デフォルトの名無しさん mailto:sage [2022/09/28(水) 18:25:19.27 ID:OOL0jr8Q0.net]
>>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は好みのオプションでどうぞ

157 名前:デフォルトの名無しさん mailto:sage [2022/09/28(水) 19:37:21.94 ID:9I9ISsCh.net]
>>154
ありがとうございます
やはり至るところで誤差が発生するのですね
四捨五入は今回の用途ではどちらでも良い感じです
せっかくなのでまとめてみました
https://ideone.com/JmTu06
ありがとうございました

158 名前:デフォルトの名無しさん mailto:sage [2022/09/28(水) 19:42:02.44 ID:o0cHd3Tq0.net]
先にIEEE754読んでみては?
誤差に関しての勘所がわかるようになる

159 名前:デフォルトの名無しさん [2022/09/28(水) 20:32:50.93 ID:x5UMfEp40.net]
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モジュールは便利そうだね。

160 名前:デフォルトの名無しさん mailto:sage [2022/09/28(水) 23:21:28.71 ID:FDPwu/KN0.net]
log2で有効桁数計算出来るでしょ



161 名前:デフォルトの名無しさん mailto:sage [2022/09/29(木) 00:26:06.29 ID:3C3gpnCY0.net]
>>154
どちらの書き方でも
-0.015 を四捨五入したら-0.02だった、すまん
-0.01にしたい場合は自力でなんとかして

162 名前:デフォルトの名無しさん mailto:sage [2022/09/30(金) 00:55:04.52 ID:qun5+YRs0.net]
昔から不思議なんだけど
何で分数で処理しないのかな?
最後に割り算を一回だけすれば
誤差がでないじゃないの






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<241KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef