Pythonのお勉強 Part62

■ このスレッドは過去ログ倉庫に格納されています
2019/09/15(日) 16:06:00.08ID:E+Kc3PWT0
★当スレにRubyのソースコード類を書くことを禁ず★
☆Ruby等、Pythonではないプログラミング言語での回答類を書くのも禁止
☆「Ruby では」「Rubyでは」をNGワード登録推奨

◆エラーを解決したいときはエラー文(勝手に省略禁止)と
 環境(Pythonのバージョン・OS名・IDEの種類とバージョン)をシッカリ書くこと

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

◇Pythonオフィシャルサイト
http://www.python.org/

◇まとめwiki
ttp://python.rdy.jp/

●関連スレ●
くだすれPython(超初心者用) その44【Ruby禁止】
http://mevius.5ch.net/test/read.cgi/tech/1563969768/

〇前スレ
Pythonのお勉強 Part61
http://mevius.5ch.net/test/read.cgi/tech/1563622784/

次スレの建立は>>985あたりが挑戦する。 [EOF]
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
75デフォルトの名無しさん (ワッチョイ 4797-i9+B)
垢版 |
2019/09/29(日) 00:22:44.02ID:nT1w560I0
初心者向け言語だとは思ってなかったけど
(FedoraとかのインストーラーはAnacondaって名前のPythonのスクリプトだってことをかなり昔から知ってたし)
Pythonでゴリゴリ書く前はブロックがわかりにくいとは思ってたな。

かといってカッコがあるとわかりやすいのか?っていうと、
カッコがあってもわかりにくい時は結構あるって感じがするけどな。
2019/09/29(日) 01:57:16.53ID:yF2ygbXTM
初心者向けっていうか「分かりやすい」
特に配列関連強い気がする。
ライブラリ多いからやりたいことがすぐ実現できる。
ブロックはカッコ後ろ派と同インデント派があるのに比べれば「分かりやすい」
初心者向けでも要求仕様満たせてれば問題ないんじゃないの?
それで生産性高かったり引き継ぎしやすいなら最高じゃんw
言語に優劣付ける程色々弄ってきてるなら対立煽る以外では不毛な話題でしか無いかと。
2019/09/29(日) 02:07:50.07ID:9sS1uJjp0
>>72
俺おっさんだけど新人にはPythonだけ教えてる
本質と違うところで悩んで欲しくないからね

言語体系として美しさに欠ける点が多々あるのは諦めている
ブロックが分かりにくいのもあるけどスコープも分かりにくい

withやtryで字下げしてブロック作ってるのにスコープは作らないとか
普通ならあり得ん仕様だ、まぁ便利なんだけど

with open(‘hoge.txt’, ‘r’) with f:
  a = 123 ← これ、ローカル変数じゃない
print(a) ←ブロックの外に出て表示可能
結果 123

こんなこと書くとrubyくんが降臨するかな
2019/09/29(日) 08:04:21.86ID:qdFsd7WD0
>>74
ブロックについては間違ったインデントで誤認すると言うのを防ぐためのものだからそう言うのが嫌ならPythonを使うことを諦めるしかないな
if(...)
 if(...)
  a = ...
else
 b = ...

>>77
スコープはたしかに分かりにくいね
ただPythonは変数宣言がないからスコープ作るとその例だと
a = 0
with open(‘hoge.txt’, ‘r’) with f:
 a = 123 ← これ、ローカル変数じゃない
print(a) ←ブロックの外に出て表示可能
みたいな本来不要なコードを入れる羽目になるから痛し痒しだね
2019/09/29(日) 09:54:04.21ID:6bWGECfja
>>78
今時オートインデントのないエディタやIDEなんて使わんから、前に誰かも言ってたけどループ抜けた直後の処理とかインデントを手動で調整する部分は明確に劣ってると思うけどね
掲示板とかの書き込みでも仕様によっては論理構造自体把握できなくなるし
それだけをもってPythonがどうのこうのと言う気はないし好んで使ってはいるけどね
80デフォルトの名無しさん (ワッチョイ 5f33-20m0)
垢版 |
2019/09/29(日) 10:36:00.68ID:o2dHW2ZP0
Pythonに限らずインデントは整えろよ
2019/09/29(日) 10:57:44.76ID:qdFsd7WD0
>>79
> 今時オートインデントのないエディタやIDEなんて使わんから
Pythonの仕様決めた頃の話に今時とか言われても…
後付で批判できる俺スゲーってか?w
2019/09/29(日) 11:03:04.37ID:sjKzDFMja
んなこと言い出したらなんの比較もできんわ
Pythonだけ崇拝してろよ
2019/09/29(日) 14:19:19.94ID:qdFsd7WD0
お前の批判の理由がおかしいだけ
2019/09/29(日) 15:04:48.86ID:wk/e9yFta
他の言語も実用上インデントが分かりにくい状況なんかあり得ないって言ってんだけどな
そうなるとブロックの終わりが視認しづらいってデメリットだけが目立つことになるわけ
Pythonのブロックがわかりにくくないって言うなら意見の違いだから別にそれで良いけど
85デフォルトの名無しさん (ワッチョイ 4797-i9+B)
垢版 |
2019/09/29(日) 15:12:39.88ID:nT1w560I0
オフサイドルールでブロックがわかりにくいより、
ブロックスコープがないほうがよっぽどPythonの欠点だと思うんだよな

ただオフサイドルールは逆に便利なときもあるような気がするけどなー
JSとかで閉じカッコの対応がめちゃくちゃになるときよくあるもの
まぁそれは無名関数を突っ込めるからってのとも関係してるだろうし、
同一条件じゃないから単純比較はできないと思うけど
2019/09/29(日) 15:26:02.16ID:wk/e9yFta
関数が長くなってきたときとか、分岐やループで一時的にしか使わない変数名にも気を使わないといけないのは確かに面倒くさいな
スコープの仕様自体はわかりやすいんだけど他の言語で広く常識とされてる仕様とは違うからね
2019/09/29(日) 15:37:16.47ID:11si1Xxn0
if文で && って書いちゃう
2019/09/29(日) 16:19:10.31ID:qnyhMUgLp
>>86 code folding
でブロックを閉じたり開いたりすれば簡単。
Jupyter notebook なら入ってるよ。
2019/09/29(日) 17:29:15.15ID:qdFsd7WD0
>>84
>>78のコード見たらわかると思うけど正しいコードの話をいくらされても意味ないよ
他の言語はインデントとコードの意味は関係ないからインデントによって誤認する可能性があって事実それによるバグもあったのでPythonみたいな考え方が出てきたって話ね
別にそれで全てを解決するわけじゃないし色々指摘されてる通り弊害もあるのはわかってる
2019/09/29(日) 17:32:32.79ID:qdFsd7WD0
>>85
ブロックスコープは>>78の後半に書いてる通り変数宣言と絡むからちょっと難しいな
個人的にはあまり大規模なコードを書くような仕様じゃないと感じてる
2019/09/29(日) 19:57:20.42ID:0Rn4cTtQa
>>89
>>78のコードで言いたいことがわからんのだけど、elseの対応がわかりやすいってこと?それはあんまりメリットに見えないから誤解してるようだったら申し訳ない
インデントを文法に含めた時代背景とかは知らんかったから勉強になったよ
ただ、今は実用上そうする意義はあんまりないよねって言いたかっただけだから話がかみ合わなかったような気がするわ
いきなり煽られたからカッカしてたわすまんな
92デフォルトの名無しさん (ワッチョイ 4797-i9+B)
垢版 |
2019/09/29(日) 20:25:33.13ID:nT1w560I0
>>90
大改造にはなるだろうね。どんなところが問題になるか把握してないけど、
JSにES6でlet/constが導入できたみたいにPythonでも導入されるとなんとなく嬉しそうではある。
大規模なコードは書かないから個人的には問題になったことがないけれど。

元の話になったPythonディスおっさんも、ブロックスコープがない、マルチコア時代にそれを活かしづらい設計、
とか言ってディスるなら、そうですねおっしゃるとおりですという感じになるんだけどなぁ。
2019/09/29(日) 20:59:13.92ID:qdFsd7WD0
>>91
え?
elseがどのifに対応するのかぱっと見てわかるなら素ですごいと思う
ただ誰にでも君みたいな能力があるわけじゃないからインデントとブロックが合うようにしようってだけのこと
今は意味がないと言うけどみんながみんな理想的な環境使ってるわけじゃないしね
2019/09/29(日) 21:01:42.52ID:qdFsd7WD0
>>92
まあPython 2からPython 3で結構手を入れたからやれなくもないとは思うけど、変数宣言しなくていいと言うメリットを捨ててまでブロックスコープ作るのがいいかどうかは微妙だし
2019/09/29(日) 22:22:19.03ID:5vhDzuHra
それは(ツールに任せればいい話で)メリットにみえないから、(誰でも知ってることを懇切丁寧に説明してくれた以上のことがあるはずだし)誤解してるようだったら申し訳ない、と言わないと伝わらんよなすまん
言語の成り立ちはわかったし教育上有益だとは思うけど話がかみ合わんからもういいよ

視認性の話は>>88も言ってるとおりIDEかちょっと気の利いたエディタで解決する問題だし
2019/09/29(日) 22:58:57.71ID:GVs7K/pUM
まあコンパ語と比べるのもアレだがとりまCと比べてif文を例にしたとしても
条件式の()が強制されなくて{}も不要でa<b<cみたいにサンドイッチそのまま書ける等々、コーディングが楽なのは確実
97デフォルトの名無しさん (ワッチョイ 4797-i9+B)
垢版 |
2019/09/29(日) 23:12:58.62ID:nT1w560I0
>>94
宣言しないものは今まで通り、varなりletなりつけて宣言したものはブロックスコープってなると
ありがたいかな、文法上矛盾なく実現できるのかはわからないけど
明示的にブロックスコープを要求しないとブロックスコープにならないって仕様でも、そんなに困らない気がするな。
今でもdefして直後に呼び出すってことで実現できるっちゃできるのかもしれないけど。
2019/09/30(月) 06:47:26.08ID:II5MOx76M
>>97
> 宣言しないものは今まで通り、varなりletなりつけて宣言したものはブロックスコープってなる
宣言するものとしないものが混在すると宣言し忘れなのか意図して宣言してないのかがわからなくなるのでそれはそれで嫌かも
なんて意見も出てきたりするからホント難しい
99デフォルトの名無しさん (ワッチョイ 4797-i9+B)
垢版 |
2019/09/30(月) 10:20:08.17ID:Bc8Kvfnp0
>>98
宣言し忘れを警告するアノテーションをファイルや関数に追加できるようにしたらいいんじゃない。
2019/09/30(月) 11:41:28.14ID:auJmx+hY0
>>60
日経Linux 9月号の付録本に、xclip コマンドについて書いてあるけど、

X Window には内部に、Primary, Secondary, Clipboard の、3つのセレクションがある。
この内、普段クリップボードで使うのは、Clipboardセレクションだから、
「-sel c」オプションを付ける

xclip -o -sel c | toilet
2019/09/30(月) 12:27:42.38ID:II5MOx76M
>>99
それをするぐらいならすべての変数の宣言を必須とした方がいいんじゃね?
っていう意見が出ると思うよ
2019/09/30(月) 14:20:51.95ID:QmRxkeUJ0
>>92 Python のルール内の
命名規則に従えば良いだけの話だろ。

[Pythonコーディング規約]PEP8を読み解く
https://qiita.com/simonritchie/items/bb06a7521ae6560738a7


命名規則

定数 全大文字 + アンダースコア区切り MY_FAVORIT
103デフォルトの名無しさん (ワッチョイ 0712-94li)
垢版 |
2019/09/30(月) 15:19:40.01ID:SaJNFqAl0
見てるスレがどこもかしこもくだらねえ話題に走ってんな
そういう時期なのか…?
104デフォルトの名無しさん (ワッチョイ 2763-i9+B)
垢版 |
2019/09/30(月) 18:59:04.06ID:lsZA7Zit0
>>101
反論したいだけなのか?JSはそうなってないし、Pythonにおけるその意見の合理性はなに?
文法上そうしないと矛盾が出る具体的な考察はある?
宣言しない変数も使えてほしいというのは現状そうなってるから合理的な意見だと思うけど。
105デフォルトの名無しさん (ラクペッ MMdb-94li)
垢版 |
2019/09/30(月) 20:29:58.47ID:C5a1QkZEM
俺が考えるPythonをよくする提案だったら公式の掲示板でやってくんないかな〜
ママに話して聞かせるようなくだらない提案に頭の計算資源使いすぎて、
ガイジ並みの知能になってるのか?クソカス
2019/09/30(月) 20:56:31.01ID:II5MOx76M
>>104
仕様決めなんてトレードオフの連続なんだから唯一の正解なんてないよ
JSみたいな言語もあるだろうしもっとガチガチなAdaみたいな言語もある
>>99がだめと言ってるわけじゃなくて反論は必ず出るってこと
またJSなんかを見てりゃわかると思うけど時代によって要求されることが変わってきたりするしね
だから世の中に山ほどプログラム言語があるわけ、わかる?
107デフォルトの名無しさん (ワッチョイ 4797-i9+B)
垢版 |
2019/10/01(火) 03:33:47.77ID:DUbYYSbu0
>>106
論点はなんなの?
こっちは、「ブロックスコープがないと不安なときがある」ぐらいしか言ってないよ。
導入されないのには合理的な理由も当然あるだろうなーと思ってる。
日常的に6個ぐらいプログラミング言語開発で使ってるから得意不得意があることぐらいわかるよ。
「Aという意見もある、難しい」「Bという意見も出る、難しい」しか言ってないように感じるんだけど、
何が言いたいの?反論は出るなんて言語仕様を変更するならどんな言語でどういう風に変更したって
大抵出るような当たり前のことだろうし、さすがにそんなことだけを言いたいわけじゃないだろうし。
108デフォルトの名無しさん (ワッチョイ 4797-i9+B)
垢版 |
2019/10/01(火) 03:50:49.11ID:DUbYYSbu0
>>57
http://mevius.5ch.net/test/read.cgi/tech/1545421414/722n
> 722 名前:デフォルトの名無しさん (ワッチョイ 5f2c-+BGV)[] 投稿日:2019/09/30(月) 20:12:39.70 ID:auJmx+hY0
> 任意の列数のCSV ファイルから、そのファイルを上書きせずに、特定の2列だけを抜き出したい。
> 2列以外のすべての列を削除したりできますか?
> ただし、列名・列数は、ファイルごとに変化します

import sys
import pandas as pd

field_name_1 = 'AAA'
field_name_2 = 'BBB'

df = pd.read_csv(sys.argv[1])[[field_name_1],[field_name_2]] # AAA列とBBB列だけのDataFieldが出来る
2019/10/01(火) 06:45:24.85ID:lPnANaUAM
>>107
> 「Aという意見もある、難しい」「Bという意見も出る、難しい」しか言ってないように感じるんだけど
いや、初めからそう言う風にしか言ってないけど?
>>98とかを読んでそう取れないとしたらあなたの理解力に相当問題あると思うよ
110デフォルトの名無しさん (ワッチョイ 4797-i9+B)
垢版 |
2019/10/01(火) 14:58:13.70ID:DUbYYSbu0
>>109
「難しい」として例に出された意見が本当に難しいのか?って内容だったからなぁ。
次に出された「難しい」も、そういう意見が出てきそうな根拠がよくわからない
「始めから全部宣言すれば」だったし。
もうちょっとブロックスコープを導入するにあたって現実的に問題になりそうな点について
「AやBの両立をどうするかって意見があるから難しいよ」って言ってもらえればこっちもすんなり納得するんだけど、
誰でも思いくようなレベルの話を言って「意見の対立があるだろうから難しい」と言われても、
Pythonコミュニティならそんな簡単なことはすぐ合理的に決定するのでは?って思っちゃう。
こっちはブロックスコープの可能性について書いてるのに、仕様変更による意見の対立があるから難しいってのは的を外した反論だし、
じゃあ具体的にどういう対立があるのか?っていうことに対しても知見のある反応をしているとは思えない。
それなのに、「ホント難しい」と、まるで間近で見てきたか議論に参加してきたかのような書きぶりで違和感があったが 、
実際間近で見たとかなのか?それだったらすまんよ。
2019/10/01(火) 18:10:31.98ID:edrieGWV0
基礎的な数値計算の疑問で
x = 0
for i in range(10000):
x += 0.0001
print(x)

0.9999999999999999062
になる理由がよく分からないので教えてください
2019/10/01(火) 18:16:03.81ID:yGujYsxV0
0.0001を2進数に直す
113デフォルトの名無しさん (オッペケ Srbb-SUCl)
垢版 |
2019/10/01(火) 18:42:48.99ID:vlDmDXF7r
0.0001は2進数では循環小数になる→表現できる桁数は有限だから誤差が積もってゆく
2019/10/01(火) 18:43:28.06ID:FnDrhLoap
>>111
>>112の返答がほぼ答えだけど、もう少し親切に説明しようと思う
浮動小数点で0.0001を表すと厳密には0.0001ではなくて小さな誤差を持つので、足し合わせても1にはならない
2019/10/01(火) 18:51:08.71ID:edrieGWV0
>>114
ありがとう
116デフォルトの名無しさん (ワッチョイ 5f11-qPRK)
垢版 |
2019/10/01(火) 19:15:16.00ID:9fvqkmcJ0
>>111
「割り切れない数」の代表格の1/3は三進数では0.1
πはπ進数では10
2019/10/01(火) 20:05:23.27ID:lPnANaUAM
>>110
ぼくのかんがえたていあんをりかいできないとかありえない

ってか?
バカじゃねーの?
そんな簡単にブロックスコープの問題が解決されるなら誰も苦労はせんよw
言語設計者をなめすぎ
2019/10/01(火) 20:21:37.81ID:edrieGWV0
>>116
高校数学をやらなければいけないことは分かった、ありがとう
2019/10/01(火) 22:46:37.27ID:5NrAsYQP0
>>117
結局煽ってマウント取って気持ちよくなりたいだけなんだね。わかったよ。ありがとう。
2019/10/02(水) 04:59:18.95ID:fPPXHhjt0
>>119
それお前だろ…
どんだけ悔しがりなんだよw
2019/10/02(水) 07:42:31.71ID:YpMEiTCH0
二進数の浮動小数点演算では誤差が出る。

誤差を出さないために、Pythonでは fraction (文数) という概念がある。
0.0001 は誤差が出るが、1/10000 なら誤差は出ないという話。

from fractions import Fraction
print(Fraction(1, 10000)*3)

#3/10000

実際のプログラムで誤差を出さない様にするためには、整数演算だけで行う事がよくある。

print(1*3/10000)
#0.0003

x = 0
for i in range(10000):
 x += 1
x = x/10000
print(x)
#1.0
122デフォルトの名無しさん (アウアウエー Sa1f-yXpG)
垢版 |
2019/10/02(水) 13:01:18.79ID:55+aQRnYa
>二進数の浮動小数点演算では誤差が出る。

だから違うから初心者に誤解を招く表現はやめろ
十進数でも浮動小数点演算では誤差が出る
原因は二進数じゃない
2019/10/02(水) 13:27:56.11ID:vkK/4cs10
>>122
from decimal import *
getcontext().prec = 6

print(Decimal('0.0001')*3 , 0.0001*3)
# 0.0003 0.00030000000000000003
2019/10/02(水) 14:07:38.62ID:vkK/4cs10
decimal --- 十進固定及び浮動小数点数の算術演算
https://docs.python.org/ja/3/library/decimal.html?highlight=decimal#module-decimal
decimal モジュールは正確に丸められた十進浮動小数点算術をサポートします。

数値間の等価性を厳しく保たなければならないようなアプリケーションを考えるなら、十進数による数値表現が望ましいということになります。

ハードウェアによる 2 進浮動小数点表現と違い、decimal モジュールでは計算精度をユーザが変更できます(デフォルトでは 28 桁です)。
この桁数はほとんどの問題解決に十分な大きさです:
125デフォルトの名無しさん (ワッチョイ 5f11-qPRK)
垢版 |
2019/10/02(水) 14:15:23.16ID:BQ6RkETu0
三進数で 0.1 - 0.001 = 0.022 で有限小数となるけど十進数で問題解決できるの?
十進数では1/3も1/27も有限小数じゃなくなるけど。
2019/10/02(水) 15:22:36.64ID:vkK/4cs10
>>125 数字をどう扱うかだろうね。 
途中演算は全て分数で計算し結果も分数ならそれで終わりだし、最終的に浮動小数点数で表したければ何桁で丸めるかと言うだけの話だろ。
有理数として扱いたければ分数で最終まで扱うしかない。

from decimal import *
from fractions import Fraction
getcontext().prec = 28

f137 = Fraction(1,3)+Fraction(1,7) # 1/3 + 1/7 -> f137= 10/21
print(f137 , Decimal(float(f137)))
# 10/21 0.47619047619047616404230893749627284705638885498046875

同じことを普通の浮動小数点演算すると
print(13/+1/7)
# 0.47619047619047616
127デフォルトの名無しさん (アウウィフ FF8b-wGQq)
垢版 |
2019/10/02(水) 15:30:33.78ID:dOlpIXopF
>>124
丸めてるじゃねーかωωω
128デフォルトの名無しさん (アウウィフ FF8b-wGQq)
垢版 |
2019/10/02(水) 15:32:50.13ID:dOlpIXopF
>>126
二進数でも二進数のまま全て分数で計算すればそれで終わり
2019/10/02(水) 15:33:03.55ID:vkK/4cs10
>>127 >>126
2019/10/02(水) 15:47:10.47ID:gHIFLYdkp
>>128 分数で扱うのなら二進数も10進数も無い。

ただ、最終的に浮動小数点数として扱うなら
2進数の浮動小数点数は、ハードウェアの演算機の精度で有効桁数が決まるが、10進数の場合は自由に決められるから自分の好みの結果が得られる。
131デフォルトの名無しさん (アウウィフ FF8b-wGQq)
垢版 |
2019/10/02(水) 15:59:41.87ID:dOlpIXopF
なんでそうなる
2019/10/02(水) 16:10:31.11ID:gHIFLYdkp
なんでそうなるって、decimal が、そう言う仕様で作られてるからに決まってんじゃん。
133デフォルトの名無しさん (アウウィフ FF8b-wGQq)
垢版 |
2019/10/02(水) 16:14:01.35ID:dOlpIXopF
わざとボケてんのか?

>2進数の浮動小数点数は、ハードウェアの演算機の精度で有効桁数が決まるが、

なんでそうなる

2進数の浮動小数点数だって自分で自由に決められるだろ
2019/10/02(水) 16:37:42.79ID:gHIFLYdkp
>>133 ボケてるのどっち?

15. 浮動小数点演算、その問題と制限
https://docs.python.org/ja/3.7/tutorial/floatingpoint.html

近年の殆どのコンピュータでは float 型は、分子に最も重大なビットから始めて最初の 53 ビットを使い、分母に 2 の累乗を使った、二進小数を使って近似されます。
 1/10 の場合は、二進小数は 3602879701896397 / 2 ** 55 となります。
これは、1/10 に近いですが、厳密に同じ値ではありません。

ハードウェアの浮動小数点演算をサポートしている全ての言語で同じ種類の問題を見つけることができます

Python は 本当に float の正確な値が必要なレアケースに対応するためのツールを提供しています。 float.as_integer_ratio() メソッドは float の値を有理数として表現します:

>>> x = 3.14159
>>> x.as_integer_ratio()
(3537115888337719, 1125899906842624)

>>> x == 3537115888337719 / 1125899906842624
true


fractions モジュールと decimal モジュールを使うとこれらの計算を簡単に行えます
135デフォルトの名無しさん (アウウィフ FF8b-wGQq)
垢版 |
2019/10/02(水) 17:00:45.15ID:dOlpIXopF
>>134
朝鮮人みたいな絡み方だなお前
2019/10/02(水) 17:51:41.97ID:gHIFLYdkp
>>135 最後は捨て台詞? 勉強してね。
2019/10/02(水) 17:55:40.23ID:wzM2k9fzp
ここまでIEEE-754の単語の一つも出ないのは何故なのか
138デフォルトの名無しさん (アウウィフ FF8b-wGQq)
垢版 |
2019/10/02(水) 18:08:35.75ID:dOlpIXopF
捨て台詞っていうか論点がかみ合わないなと思ってね
2019/10/02(水) 18:09:09.11ID:qnjdQ6x30
知らないんでしょw
知ってりゃ
「二進数の浮動小数点演算では誤差が出る」
「数値間の等価性を厳しく保たなければならないようなアプリケーションを考えるなら、十進数による数値表現が望ましい」
「2進数の浮動小数点数は、ハードウェアの演算機の精度で有効桁数が決まるが、10進数の場合は自由に決められるから」
とか出てこない。
2019/10/02(水) 18:15:52.10ID:QS7AdVKy0
Pythonの話はしないのか
しないなら次スレからタイトル変えて
2019/10/02(水) 18:21:26.45ID:4+yUm89/p
>>139 ここはPython スレだぞ。 Python の仕様を否定するのならこのスレを見てる意味はない。

全て仕様書に書かれてる言葉そのものなのに何をどう反論したいのかな?
2019/10/02(水) 18:51:41.09ID:qnjdQ6x30
>>141
IEEE 754よめw
2019/10/02(水) 19:00:26.82ID:4+yUm89/p
>>142 アホ、IEEE を理解していないな。
2019/10/02(水) 19:05:33.69ID:qnjdQ6x30
一応説明しとく
「二進数の浮動小数点演算では誤差が出る」
→間違い。一般的に言われる「浮動小数点問題」は
https://docs.python.org/ja/3/tutorial/floatingpoint.html#representation-error
に説明がある。雑に言うと、10進数に近似するときに出る誤差を問題にしている。
「数値間の等価性を厳しく保たなければならないようなアプリケーションを考えるなら、十進数による数値表現が望ましい」
→そもそも10進数で表現する必要がないのであれば、等価性を厳しく保つために2進数を採用するのが適切。
「2進数の浮動小数点数は、ハードウェアの演算機の精度で有効桁数が決まるが、10進数の場合は自由に決められるから」
→これこそIEEE754の制限でしょw高速性を求めないのであれば、2進数だろうが10進数だろうが精度は自由に設定できる。
2019/10/02(水) 19:43:16.62ID:QS7AdVKy0
IEEEと二進数をNGにしておこうか
146デフォルトの名無しさん (アメ MM4b-qPRK)
垢版 |
2019/10/02(水) 19:46:16.71ID:U7L7TEhBM
各言語での 0.1 + 0.2 の結果
http://0.30000000000000004.com/
2019/10/02(水) 19:55:32.68ID:328phbLi0
仮数部と指数部の話はPythonの話やんけ
2019/10/02(水) 20:27:29.73ID:R3JG1dEeM
相変わらずクソどうでもいいことで言い争ってるな
>>146のリンク貼れば終わる話だろうが
149デフォルトの名無しさん (ワッチョイ 2763-i9+B)
垢版 |
2019/10/02(水) 23:40:17.77ID:8TApxQXN0
2進数の浮動小数点数、10進数の浮動小数点数ってものが
それぞれネイティブのIEEE754のfloatとBinary Coded Decimalを指してる立場でものを言ってるのか、
純粋に「2進数」の「浮動小数点」などと捉えてものを言っているのかで違っているような

floatはfloatって言うべきだし、BCDはBCDって言うべきだし、それぞれを2進数、10進数の浮動小数点数って言うのは
正確なものの言い方ではないと思うけどね
2019/10/03(木) 00:33:06.53ID:4GYQfqj50
>>144 おいおい、ここはPython スレだぞ。 どこの言語の話をしてるんだ。
2019/10/03(木) 00:39:40.00ID:4GYQfqj50
>>149 Python で話せよ。 くだらん話をすんな。
2019/10/03(木) 00:52:45.07ID:8EsWJ49w0
俺はくだらないと思わないが、引き際は大事だと思うよ
これ以上掘り下げてもほとんど意味ないしね
2019/10/03(木) 00:53:02.11ID:T7eEfky90
scipyで数値積分をおこなうときに積分範囲をベクトルで与えて
積分の値もベクトルで返す方法はありますか?

例えば ∫_0^x 2*t dt の積分を積分範囲を 0から x=0,1.5, 3 と3通りにかえて
積分結果をベクトルで [0, 2.25, 9] とかえしてくれるようなプログラムを書きたいです。

import numpy as np
from scipy import integrate
from scipy import stats

y = lambda t: 2*t
x = np.linspace(0,3,3)
inty = integrate.quad(y, np.zeros(3), x)

としても
ValueError: The truth value of an array with more than one element is ambiguous.
Use a.any() or a.all()
とエラーがでます。for文を使わずにうまいこと書く方法を教えてください。
2019/10/03(木) 01:42:20.97ID:8EsWJ49w0
>>153
残念ながらfloatにnp.arrayを突っ込むような使い方はできない
こういうときは仕方がないので、以下のようにarray_likeな引数を受け取るような関数を作ることになる

https://ideone.com/czl80w

他にうまい方法があるなら俺も知りたい
2019/10/03(木) 03:22:12.23ID:3+KdsVIy0
>>154
なるほど分かりました
ありがとうございます。
2019/10/03(木) 06:10:56.73ID:Eu2t0lrZ0
>>151
まあくだらん話だよな
> 2進数の浮動小数点数は、ハードウェアの演算機の精度で有効桁数が決まる
とアホなこと言ってる奴がボコられてるだけだしw
157デフォルトの名無しさん (ワッチョイ 6610-Zj0d)
垢版 |
2019/10/03(木) 06:32:35.92ID:4qlP7y1B0
今の主流のコンピュータでは2進数に対応する電圧の状態を利用して計算している

ソフトウェアでそれをどう上手く使って計算するか

IEEEの浮動小数点数の形式で扱うと誤差が出ることがある
Pythonのライブラリで色んな工夫をしている
自分で課題を解決できるライブラリを開発して貢献する事も可能だろう

現在のコンピュータで計算するには
10進数→2進数→10進数
の変換があるからこの過程で
必要な精度を保てるように工夫が必要だろう
158デフォルトの名無しさん (ワッチョイ 7963-V2QA)
垢版 |
2019/10/03(木) 06:37:12.39ID:/3F4mXI80
木曜日だから今NGすれば一週間消せる
2019/10/03(木) 08:36:04.46ID:4GYQfqj50
>>156

Pythonの浮動小数点数float型の範囲(最大値・最小値)
https://note.nkmk.me/python-sys-float-info-max-min/

Pythonの浮動小数点数float型は64ビットの浮動小数点数表現である倍精度浮動小数点数で、Cなどほかのプログラミング言語におけるdoubleに相当する。
2019/10/03(木) 11:45:59.34ID:z1c5xmGqM
で?
整数演算機能しか持たない8bit CPUでも多倍長の浮動小数点演算をすることもできる
当然今君が使ってる目の前のPythonでも多倍長の浮動小数点演算ができる
君にできるかどうかは知らんけどねw
なので
> 2進数の浮動小数点数は、ハードウェアの演算機の精度で有効桁数が決まる
と言うのは真っ赤な嘘
2019/10/03(木) 12:14:43.08ID:4GYQfqj50
>>160 負け惜しみはやめろ。そりゃなんだってゴリゴリやればなんでも出来る。

ここで話してるのはPython の仕様の話だ。

float は、倍精度しか無いと仕様書に書かれている。
それが全てだ。 仮数部53ビット。
これは一般的な64ビット浮動小数点演算機の物理的な制限からきているのは明らか。
162デフォルトの名無しさん (ワッチョイ b67c-WcZE)
垢版 |
2019/10/03(木) 12:35:57.29ID:YSTER/9m0
ctypes.c_longdouble()
2019/10/03(木) 12:36:57.80ID:2k415C0d0
まだ言ってんのか^^;

> 一般的な64ビット浮動小数点演算機の物理的な制限からきているのは明らか。

違うぞ。どっちもIEEEによって縛られてるだけ。
2019/10/03(木) 12:55:46.18ID:z1c5xmGqM
>>161
負け惜しみ?
Pythonの話?

馬鹿にされてるのは2進数と10進数の話だぞw
> ただ、最終的に浮動小数点数として扱うなら
> 2進数の浮動小数点数は、ハードウェアの演算機の精度で有効桁数が決まるが、10進数の場合は自由に決められるから自分の好みの結果が得られる。
2019/10/03(木) 19:19:02.85ID:9IWXvZRK0
ラムダ式のリストを作りたいのですが、
def func(n):
  return lambda n: print(n)

list = [func(n) for n in range(10) ]
list[0]
list[1]
list[2]

は狙い通りに
0
1
2
という結果が出るのに

list = [lambda n: print(n) for n in range(10)]
list[0]
list[1]
list[2]

だと
9
9
9
になってしまうのはなぜですか?
166デフォルトの名無しさん (ラクペッ MM65-V2QA)
垢版 |
2019/10/03(木) 19:59:14.72ID:W+JElR6/M
ならないと思うけど
後者のラムダ式は評価されてないから
<function <listcomp>.<lambda> at 0x2b850b976ea0>
とか出るだろ
サンプルは正確に頼む
2019/10/03(木) 20:19:26.33ID:nXwJdy3O0
すみません
def func(n):
return lambda : print(n)

list = [func(n) for n in range(10) ]
list[0]()
list[1]()
list[2]()

list = [lambda : print(n) for n in range(10)]
list[0]()
list[1]()
list[2]()
でした
ID変わってるかもしれないけど165です
2019/10/03(木) 20:31:44.96ID:0JhZY07I0
list = [lambda x=n : print(x) for n in range(10)]
2019/10/03(木) 20:33:42.58ID:nXwJdy3O0
>>168
どうしてそうなるのかわかりませんが、うまくいきました
ありがとうございます
2019/10/03(木) 22:34:54.68ID:MIbrEnWV0
Pythonでファイルの一括処理を行うと
他の言語やシェルの結果と比較してエラーが多い気がしますが、(特にテキスト処理)
気のせいでしょうか?
2019/10/03(木) 23:13:50.33ID:twcV991sM
僕が論理的に原因分析できないのはここのスレ住民のせいだと思います。気のせいでしょうか?
2019/10/03(木) 23:55:55.59ID:4GYQfqj50
>>171 気の所為です。 被害妄想とも言います。
ひたすら練習あるのみ。
2019/10/04(金) 02:06:06.17ID:kLahYNxr0
>>170
エラーではないけど、この関数は将来廃止予定です、みたいな警告はよく見る
174デフォルトの名無しさん (ワッチョイ b67c-MsYi)
垢版 |
2019/10/04(金) 16:24:44.36ID:JXWhYfPM0
def func(n):
  return lambda n: print(n)
list = [func(n) for n in range(10) ]
これと
list = [lambda n: print(n) for n in range(10)]
これは等価ではない
前者と等価になるのは
list = [(lambda n: print(n))(n) for n in range(10)]
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況