Pythonのお勉強 Part73

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ f610-G7il)
垢版 |
2024/06/06(木) 08:48:10.07ID:DsazphEm0
!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のお勉強 Part72
https://mevius.5ch.net/test/read.cgi/tech/1703659345/
VIPQ2_EXTDAT: default:vvvvv:1000:512:: EXT was configured
2024/08/25(日) 07:08:32.01ID:v8rADpZv0
>>709
ありがとうございます
トイプロの形態だと、段階的に習得できそうです。
2024/08/25(日) 08:18:55.02ID:hNWqtkNw0
TOYPROみたいな難易度だと馬鹿にされてる気にならないか
AtCoderの過去問のギリギリ解けないくらいの難易度に挑戦するのがいい
2024/08/25(日) 12:06:13.04ID:RYi2McLx0
>>717
ふむ

わりとバックエンド系が多い感じかな?
AIしか作ったことないから、よくわからないわ。

最近は、JavaScriptを勉強し始めたわ
2024/08/25(日) 16:43:39.90ID:4hCnijZ/0
Pythonは少なくとも国内ではバックエンドというかバッチ処理が多い
COBOL→Java→の流れでSIerのゴミが大量に流入してきている
2024/08/25(日) 17:01:03.91ID:RYi2McLx0
>>721
ふむ

昔つくったCOBOLを、Pythonで作り直すって感じ?
需要は多いのかな?
2024/08/25(日) 19:14:35.71ID:iGZXlcQ10
COBOLは十進法をきちんと扱えるという以外にはほとんどメリットがない言語という印象しかない
2024/08/25(日) 20:04:56.14ID:hNWqtkNw0
大昔の言語なのに自然言語みたいに書こうと思っただけで凄い
2024/08/25(日) 20:09:37.74ID:hNWqtkNw0
ADD 1 TO A
と書いてあるのをパースして a += 1 の意味だと解釈するのと、
Aに1を加算する
1をAに加算する
と日本語の語順になってるのとでは難易度違うだろうか
2024/08/25(日) 21:54:50.38ID:ccGLiIcN0
JavaですらDecimalのバッチ処理はCOBOLよりも数倍遅くて困ることがよくあったくらいなのにPythonで作り直すとかよほどの特殊案件でもない限りないだろ
2024/08/25(日) 22:05:31.74ID:hNWqtkNw0
1日分のバッチ処理が24時間で終わればokなんじゃないの
728デフォルトの名無しさん (ワッチョイ 22e7-odry)
垢版 |
2024/08/25(日) 22:59:45.21ID:v44CMEUo0
>>726
RDBの存在を無視した構成なんて意地悪な仮定の話だろ
2024/08/25(日) 23:09:54.62ID:RcRPlRXa0
今はそういうのはrustってやつに移ったんだろ
730デフォルトの名無しさん (アウアウエー Sa0a-PBPb)
垢版 |
2024/08/26(月) 10:51:45.30ID:3+7ACU+Ua
>>724
ぴゅう太のことですねわかります
731デフォルトの名無しさん (アウアウエー Sa0a-PBPb)
垢版 |
2024/08/26(月) 10:54:05.39ID:3+7ACU+Ua
>>725
>ADD 1 TO A
>と書いてあるのをパースして a += 1 の意味だと解釈するのと、

違うと思う

ADD 1 TO A
と書いてあるのをパースして inc a だったり add a, 1

a += 1;
と書いてあるのをパースして inc a だったり add a, 1

それぞれはあっても
>ADD 1 TO A
>と書いてあるのをパースして a += 1 の意味だと解釈するのと、
は(当時の発想として)無い
732デフォルトの名無しさん (アウアウエー Sa0a-PBPb)
垢版 |
2024/08/26(月) 10:56:58.91ID:3+7ACU+Ua
>>726
描かれた当時のCOBOLやJavaのDecimalよりも
今の最新機種でPythonのDecimalの方が速ければ良い
ってことしか考えてないのが彼らの発想
(それが良いかどうかは別問題)
2024/08/26(月) 11:00:13.19ID:sJ3BJnnX0
ぴゅう太が好例なんだよな
FORをマワレに置き換えることしかできなくて、日本語としての自然言語にはならなかった

命令文の先頭に動詞が来るという文法体系がパーサにとって都合がいい

プログラム言語に留まらず、数式の記法とか、いろんなもんが西洋的にできている
内包表記は恐らく英語ネイティブにはすんなり読める
734デフォルトの名無しさん (ワッチョイ 2217-HfY5)
垢版 |
2024/08/26(月) 11:53:04.79ID:IX0YJneq0
>>733
書いてることが適当過ぎるだろw
2024/08/26(月) 12:12:33.19ID:Mlnqm5XWd
死諸葛.走(生仲達)
漢語ならよゆーよゆー
2024/08/26(月) 13:51:43.12ID:+6LxARHTF
pythonは高速化されましたが何か?
https://www.youtube.com/watch?v=V979LbYA35c
2024/08/26(月) 17:01:41.75ID:e4+Ag4it0
おCOBOL頂戴せん
738あぼーん
垢版 |
NGNG
あぼーん
2024/08/27(火) 10:48:36.43ID:34JJYlBb0
>>738
そろそろ終了かい
2024/08/27(火) 11:44:47.44ID:oZygCrgB0
レジェンド級の開発者が追放されたらしいけどPython劣化していくの?

>Python理事会が古参開発者を追い出して開発者コミュニティが騒動に
https://qiita.com/rana_kualu/items/0369ab4e1df50bc37d7e
2024/08/27(火) 11:47:18.67ID:Olv0GL3m0
座禅 of pythonを書いた人だな
2024/08/27(火) 12:05:38.30ID:4Xanv84P0
>> うっかりPythonが遅いと口走ったhypernovaが永久BANされたり

www
2024/08/27(火) 12:12:10.27ID:QrAXowH6M
どこかで見た景色だな
2024/08/27(火) 12:21:33.85ID:HtqvmbLe0
python財団胡散臭いよな
2024/08/27(火) 13:41:47.95ID:z6Yz2T7N0
たった3ヶ月のバンやろ
2024/08/27(火) 14:11:40.82ID:2FiUICNvd
Python始めたんだがもしかして数学無勉の人生やとしんどい?
2024/08/27(火) 14:32:50.59ID:e8RCU1u30
たまたまやってこなかっただけならいけるかも
苦手なのが分かってて避けてきたならしんどい
2024/08/27(火) 15:40:58.25ID:jU+wQ64h0
websocket終了させても次起動すると前の命令が残ってて受信しだすのどうにかならないの・・
2024/08/27(火) 16:03:48.90ID:s5Uqc+HW0
外してるかもしれんけどpub/subの話ならサーバ側がそういう実装なんじゃ
サーバ側を見直すか別名でsubscribeしたらどうか
2024/08/27(火) 16:20:43.45ID:+d875zN80
>>749
なるほどやってみるか
2024/08/27(火) 19:17:56.22ID:Q1x0BOco0
大事なのはPythonで何やるかだろう
簡単なタスクを自動化するみたいなレベルなら四則演算できるレベルで十分
2024/08/27(火) 19:34:11.22ID:Olv0GL3m0
プログラムはロジックで、数学は抽象化だからな
必要な素養が全然違う
2024/08/27(火) 20:18:30.22ID:s5Uqc+HW0
ロジックは分野関係なく当たり前の素養
挙げるとしたらモデル化能力
それには抽象化能力ないとね
2024/08/27(火) 20:27:14.51ID:l+VCbokh0
手計算で3日かかるの数秒で出来るのええやん
2024/08/27(火) 20:31:30.23ID:Olv0GL3m0
一般社会のロジックとプログラムのロジックは別物
例外を一切認めないようなrigidなロジックはプログラム特有
2024/08/29(木) 09:40:06.31ID:1jszJs3na
良きに計らえ(シャチョーさん)
2024/08/29(木) 15:55:49.43ID:F2p43Zdw0
import re
s = 'abc\\n'
print(re.search('a(.+)\\\\n', s).groups()[0]) # bc
print(re.search('a(.+)\\n', s).groups()[0]) # error

何故こんな挙動に?
2024/08/29(木) 16:35:29.97ID:01fBpAqb0
>757
>>> len('abc\\n')
5
>>> len('abc\n')
4
>>> len(r"abc\n")
5
https://docs.python.org/ja/3.11/library/re.html#raw-string-notation
正規表現リテラルに関しては3番目のraw stringで書いた方がいい
2024/08/29(木) 16:55:49.87ID:F2p43Zdw0
import re
s = 'abc\\n'
print(re.search(r'a(.+)\\n', s).groups()[0]) # bc
print(re.search(r'a(.+)\n', s).groups()[0]) # error

rで書いてもおかしい気がするんだよな
rなんだから\1個でいい筈なのに
2024/08/29(木) 18:16:38.86ID:vHnGlZfZ0
Pythonのインタープリタが要求するバックスラッシュのエスケープと
正規表現が要求するバックスラッシュのエスケープと
二重にエスケープが必要だから

re.search(r'a(.+)\n', s)は改行コードの`\n`にマッチ
re.search(r’a(.+)\\n’, s)はバックスラッシュ+nという文字列にマッチ
正規表現エンジンに`\n`は改行コードじゃないよと伝えるのに
バックスラッシュをエスケープする必要がある
2024/08/29(木) 18:39:37.30ID:01fBpAqb0
s = 'abc\n' # abc+改行の4文字
じゃないの?ってことなんだけど
2024/08/29(木) 18:42:15.14ID:F2p43Zdw0
rで書いてるなら、文字列中に\nを改行として書くことは諦めろとしか
rとはすべてがエスケープされてるモードなんだからエスケープ要らない約束の筈
2024/08/29(木) 21:44:40.32ID:vHnGlZfZ0
>>762
正規表現ではバックスラッシュが特別なエスケープ文字として扱われるというのは理解してる?

それを理解してれば検索対象文字列に存在するバックスラッシュそのものにマッチさせるには
正規表現としてエスケープしたバックスラッシュ(=バックスラッシュ2つ)が必要というのはわかるよね?

s = 'abc\\n’にはバックスラッシュそのものが含まれてて
それにマッチさせたいわけだから正規表現として`\\`が必要になる
この正規表現でのエスケープはPythonが文字列を解釈するときのエスケープとは別のもの
2024/08/29(木) 21:50:09.32ID:vHnGlZfZ0
一応書いておくけどバックスラッシュの二重エスケープが必要なのはPythonに限らずどの言語でも同じ
raw stringや正規表現リテラルを使った場合は一重エスケープでよくなる
2024/08/29(木) 21:57:35.86ID:F2p43Zdw0
うちの店では昔っからこうなんだよと強弁されても
rawってのは生っていう意味で、未加工なんだよ
\nを改行の意味に変換したら加工しとるやろ
2024/08/29(木) 22:55:26.96ID:F2p43Zdw0
文字列の表現としてはrawでも、それを渡した先でどう扱われるかは別問題
という話なんだろうな
正規表現ですらなくて、誰かの作った関数で\nと連続してたらそれは改行文字として扱います
というお約束ならそれに従うしかない

\nを改行に変換するかもしれない仕組みを2回通すので、
変換されない為には2重のエスケープが必要
3回通すならもっと必要
raw表現はエスケープを1回減らす効果しか無い
767デフォルトの名無しさん (ワッチョイ 22e7-zZP0)
垢版 |
2024/08/29(木) 23:45:40.59ID:N4XBWKhx0
>>763
その指摘は正規表現の話ではない
2024/08/29(木) 23:52:54.64ID:F2p43Zdw0
raw文字列というpythonの仕様と、
reというpython標準のライブラリがごっちゃになって、
rawと書いたら受け取った人もrawとして扱う筈、というのはただの思いこみで、
受け取った側は元がどう書かれてたかなんか知る由もなくただのstrとして受け取って、
そこから独自の字句解釈を開始する、というだけの話
2024/08/30(金) 00:50:19.40ID:S+WRgUIX0
>>765
>\nを改行の意味に変換したら加工しとるやろ
raw文字列は\nを改行文字としては扱ってないやろ
バックスラッシュとnという2文字を渡された正規表現エンジンがそれを改行文字として扱う
それが正規表現のルール
770デフォルトの名無しさん (ワッチョイ 22e7-odry)
垢版 |
2024/08/30(金) 02:17:10.13ID:+R5e+PNr0
そもそもrawデータというのは文字として決めつけて処理するものではなく、バイナリーデータとして扱って処理するものです。
771デフォルトの名無しさん (ワッチョイ 6e2a-EI2W)
垢版 |
2024/08/30(金) 07:42:30.12ID:FeMupkVu0
お前等hexで話せよ。分かりにくい。

6162 635c 6e abc\n
6162 630a  abc.
772デフォルトの名無しさん (アウアウエー Sa0a-PBPb)
垢版 |
2024/08/30(金) 09:24:30.71ID:742oYIECa
import re
s = r'abc\\n'
print(re.search('a(.+)\\n', s).groups()[0]) # !
print(re.search('a(.+)\n', s).groups()[0]) # !!!
773デフォルトの名無しさん (アウアウエー Sa0a-PBPb)
垢版 |
2024/08/30(金) 09:26:08.10ID:742oYIECa
import re
s = r'abc\n'
print(re.search('a(.+)\\n', s).groups()[0]) # !
print(re.search('a(.+)\n', s).groups()[0]) # !!!
774デフォルトの名無しさん (アウアウエー Sa0a-PBPb)
垢版 |
2024/08/30(金) 09:27:35.22ID:742oYIECa
import re
s = r'abc\\n'
print(re.search(r'a(.+)\\n', s).groups()[0]) # !
print(re.search(r'a(.+)\n', s).groups()[0]) # !!!
775デフォルトの名無しさん (アウアウエー Sa0a-PBPb)
垢版 |
2024/08/30(金) 09:27:52.88ID:742oYIECa
import re
s = r'abc\n'
print(re.search(r'a(.+)\\n', s).groups()[0]) # !
print(re.search(r'a(.+)\n', s).groups()[0]) # !!!
2024/08/31(土) 10:12:39.92ID:tZuU9Lep0
webページの取得をconcurrent.futuresで複数同時に回す
取得自体はseleniumで行う
毎回ログインするのを避ける為、ログイン済のdriverをmax_workers分用意する

そこまではいいとして、submitする時あるいはsubmit先で、
今どのdriverが使えるか判断しないといけない
自前でセマフォ作ってもいいけど、そんな管理もしてくれる何かがありそうな気がする
777デフォルトの名無しさん (ワッチョイ 82ad-aK75)
垢版 |
2024/08/31(土) 13:22:35.58ID:fwQH707u0
関数やクラスにインデックスの指す中身の値でなく“インデックス指定”を渡したいのですがうまく出来ません
こんな場合どういうような考え方があるのでしょう(タプルでインデックス数字を渡す?)

# [[0,0,0,0,0],[[0,0,0,0,0]]
alist = [[0]*5]*2

# 値ではなく箱の位置を意図してるが…
hako = alist[0][3]

def change(b):
b = 3
return

change(hako)

print(alist) # 全部0のまま

change(alist[0][4])

print(alist) # こちらも全部0


実際にはrpgゲームの様々のステートやフラグやそのセーブを管理するクラスに
alist[6][15](王さまと喋ったとか)を1にするといった仕事をさせたいと試行錯誤しています
喋る関数、戦う関数やクラスのとこから発生しだいリストを直で操作すればいいのだけど
State.change(インデックス, 1)みたく一元的にやりたいとクラスを作ってきています
目的で位置の固定されたフラグなのでメニューを開いているかState.menu(1)、State.kingtalked(1)などとしその先のクラスの関数で位置を決め撃ちするのが良いのかななどと困って考えています
2024/08/31(土) 13:25:10.84ID:fwQH707u0
しまった質問スレの存在を忘れてましたごめんなさい移動します>>3
2024/08/31(土) 14:06:22.04ID:o+gAgvj50
>>777


ごちゃごちゃ、わからんわ
2024/08/31(土) 14:44:18.13ID:fwQH707u0
>>779
最下段の文は無視してもらって
プログラム部分で
[[0,0,0,3,0][0,0,0,0,0]]
[[0,0,0,3,3][0,0,0,0,0]]なprint結果となる関数への渡し方や手法がしりたい
「書き換えたい多次元リストのインデックス」を関数などに渡しそこで処理する方法

書いてるうちに設計からおかしい気がしてきた
せっかくクラスを勉強してるので無理やりそこでまとめて(意味なく)処理したがってる

なにかあれば聞きたいけど質問は取り下げます
2024/08/31(土) 15:51:47.51ID:Ogc9sW700
無理なのでインデックスを渡すしかない
2024/08/31(土) 16:07:04.72ID:tZuU9Lep0
インデックスといえば
l = [1, 2, 3]
l.index(2)
で1を得るけど、これの計算コストってどんなもんなんだろ
リストだけど固定なのが判ってたら、一旦逆引きのテーブルを作った方が有利なのか、
気にするほどでもないのか
2024/08/31(土) 16:18:16.80ID:Ogc9sW700
https://github.com/python/cpython/blob/5332d989af45378e6ae99aeda72bfa82042b8659/Objects/listobject.c#L3181
ループするからO(n)かかる
それが問題になるならdictに突っ込むとかして高速化すればいい
2024/08/31(土) 16:31:39.30ID:tZuU9Lep0
思ったより何も工夫してなかった
困ったら高速化しよう
まあ、困らないんだけど
2024/08/31(土) 17:34:03.31ID:mruaKbs00
>>777
2次元で固定ならタプルで渡す
def modify(alist, indices, new_value):
 alist[indices[0]][indices[1]] = new_value

任意の深さに対応したいならループさせる
(エラーになる状況が増えるので用途に合わせて対応が必要)
def modify(alist, indices, new_value):
 element = alist
 for i in indices[:-1]:
  element = element[i]
 element[indices[-1]] = new_value

あとalist = [[0]*5]*2 の初期化方法は要注意
alist[0][3] = 3とすると[[0, 0, 0, 3, 0], [0, 0, 0, 3, 0]]になるから
2024/08/31(土) 18:14:58.61ID:fwQH707u0
>>785
ありがとう!固定要素数じゃない場合の例が思案に明け暮れていたとこで、助かります!
丁度さっき、そうだ受け取ったstrに応じる形で"関数側のcase match文"で
決められた格納場所に同じく受け取ったvalueを書き込もう、としていました
コマンドウィンドウを開いているか否か0or1みたいなものを
StatsクラスのStats.write("commandopen", 1)、これの第一引数をcaseでふるいにかけ書き込むべきインデックスに辿り着く感じ…(>_<)
2024/08/31(土) 18:51:32.93ID:mruaKbs00
{“commandopen”: 1}がkey/valueなら
素直にdictionaryで状態管理したほうがいいんじゃないかな
case文やインデックス変換なくせるよ
2024/08/31(土) 18:59:52.21ID:fwQH707u0
たしかに…辞書やjsonといった物の扱いに恐怖心があって無意識に避けてたかも
2024/09/01(日) 08:53:52.90ID:5+RJ54+E0
前回と今回のid一覧があって、
今回追加分のidに該当するものがなければ終了
みたいな処理をどう書こうか考えてて、
結局setの演算にしたら1行になった
setむっさ使える
2024/09/02(月) 14:46:18.35ID:V2ztMrfU0
テキストをフィルターしていて、
特定の行があったら、その前後の行も削除して出力したい

後ろも削除はiterでnext()すれば飛ばせるけど、
すでに出力しちゃったものを無かったことにするのが難しい
一旦全部バッファに溜めておくしか無いのかな
2024/09/02(月) 16:47:53.26ID:ciLmvDW/0
全部じゃなく
1行バッファして次が来たら出力する部品でいいんでは?
もちろんバッファ削除とフラッシュの機能もつける
2024/09/02(月) 17:05:31.51ID:V2ztMrfU0
削除する必要が最大1行ならいいけど、実際には2行のケースもある
2024/09/02(月) 17:13:39.22ID:ciLmvDW/0
理解力というか応用力低すぎて草
2024/09/02(月) 17:30:55.08ID:V2ztMrfU0
んー、そんな小手先で回避してたらすぐ行き詰まるよ
2024/09/02(月) 17:52:44.67ID:DywOJmSg0
1回目は削除インデックスを確保するだけで2回目のフィルタリングでそのインデックスを削除する
何行削除でも可能
2024/09/02(月) 18:08:44.35ID:V2ztMrfU0
なるほど2パスにするのか
入力はファイルなのでそれで十分だし高速だしメモリも食わない
ストリームにまで対応可能な方法は多分ない
797デフォルトの名無しさん (ワッチョイ 072a-DKuy)
垢版 |
2024/09/02(月) 18:18:02.18ID:cZu9PahF0
>>790
俺にはこの話題の sed コマンドは全く理解できないが、解るなら python に移植してみてはどうだ。
https://mevius.5ch.net/test/read.cgi/unix/1085730992/593-
2024/09/02(月) 18:18:35.06ID:0P3ClJWr0
dpでやるやつじゃね?
2024/09/02(月) 18:24:28.25ID:V2ztMrfU0
sed的にやろうとすると、ファイル全体を読み込んで検索して、というやり方と同じなので、
メモリはファイルサイズだけ食うことになる
sedはそれをストリームに対してやるのでメモリ食わない

メモリ節約するなら最低限だけ読みながら、という処理になるけど、
最低限が何行なのかは条件次第なので条件の解析までやらないといけなくて、
ツブシの効かないコードを頑張って書くことになる
2024/09/02(月) 18:39:20.59ID:ciLmvDW/0
主に最適化の理由で出力のバッファリングはPython内外で透過的に行われてるし
そこに出力遅延するio.Writer追加するだけの話
バッファはいくらでも動的に確保したらいい
小手先らしいけどそれで必要十分
2024/09/02(月) 18:49:11.43ID:R3lh7LPd0
本人がバッファリングが必要な範囲を抽象化して捉えられてないから1行とか2行とかって説明になるんだろ

最近出現頻度の高い末尾54さんはいつもこのパターン
2024/09/02(月) 18:53:10.49ID:V2ztMrfU0
前後の行としか書いてないけどな
前後n行だよ

バッファリングするのはいいとして、フラッシュのタイミングが不明だとどうしようもない
前後n行に絶対引っかからない行が定義できない
2024/09/02(月) 18:56:45.68ID:DywOJmSg0
前の全部の行が削除対象になり得ることを考えるとストリームにやるなら全部バッファに溜めるしかなさそうだ
804デフォルトの名無しさん (ワッチョイ ff7c-rxv+)
垢版 |
2024/09/03(火) 15:35:20.10ID:GbfXXZxt0
>>0790

https://ideone.com/R9UweU

前後N行消したいなら、前のN行をバッファできれば充分。1パスでいけるよ
2024/09/03(火) 21:07:40.33ID:l2RoLSBv0
N行が全行−1行になることもあるから1パスだとメモリ食ってヤダって話みたいよ

そもそもの問題認識が間違ってるよね
2024/09/03(火) 21:28:25.04ID:b8qS9knc0
今やメモリなんて膨大にあるから、1億行でも平気
そんなこと気にしないのが簡単でかつ現実的
一応気にして2パスにするのも、比較的簡単
中途半端に気にして対応すると手間がかかる上に不完全になる
807デフォルトの名無しさん (ワッチョイ 5f5c-1cCN)
垢版 |
2024/09/03(火) 22:33:39.88ID:2uJG6i7Z0
じゃあ何を悩んでたの?
よく分かんねーけど能書きの前に常識として謝辞のひとことくらい述べたらどうかね
2024/09/03(火) 22:36:18.67ID:b8qS9knc0
なんか知らんけど、勉強する気のない奴が紛れ込んでるんだよな
809デフォルトの名無しさん (ワッチョイ e768-3eZc)
垢版 |
2024/09/04(水) 10:07:28.75ID:1egc59UO0
slenium使ってWebページの巡回してますが、CSSセレクターやxpathが日によって変動する場合の対処法をご教授願えれば幸いに存じ上げマッスルマッスル。
2024/09/04(水) 13:21:36.89ID:8f/9E+Y70
フルで指定しなくても部分でもいけるので、変わらない部分を使う
2024/09/04(水) 16:46:15.23ID:8f/9E+Y70
またストリームっぽい話
デリミタ行があって、それで区切った単位で処理する
デリミタを見つけたら処理、みたいにすると、デリミタ無しで終了した場合に最後が抜ける

元データの方で最後にもデリミタを入れる
ループを抜けた後に同じ処理を追加する
デリミタ or EOF みたいな判定にする
等の対応があって、EOFがスマートそう

でもEOFの検出が大変
ファイルを1行ずつ読んでても次を読んでみないと判らないし、
iterでも例外を起こすとか、リストが対象だったらコピーしといてpopしていって空か見るとか

最後まで行ったら自動で終わる処理はとても書きやすいのに、
最後の処理の最中に最後だと判定するのが困難
2024/09/04(水) 16:53:37.40ID:mtP1OC380
日本語を見ればプログラミング適性がないのがよくわかる
2024/09/04(水) 17:15:00.32ID:u5L50CbY0
デリミタ行以外で終端になったら
追加でデリミタ行を返すイテレータを書くだけ
2024/09/04(水) 17:24:08.15ID:8f/9E+Y70
データ数nでデリミタ数n-1、という気持ち悪い状態が自然によくあるんだよな
joinで結合して、splitで分解するのと同様に、
デリミタで分解する処理を最初に入れるのが多分正解
最後のデリミタがあってもなくてもいいようにしないといけない
2024/09/04(水) 17:28:38.80ID:8f/9E+Y70
分解する処理が全く同じ問題にぶつかるんですが
816デフォルトの名無しさん (ワッチョイ 87a9-vKF2)
垢版 |
2024/09/04(水) 17:30:47.74ID:6BJD9ak60
>>810
ありがつお!フルで指定しないとエラーでます。
ifとか使ってあがいてみマッスルマッスル!
2024/09/04(水) 17:33:35.02ID:8f/9E+Y70
perlだったら、f = open(file) みたいなので取得したファイルオブジェクトに対して
eof(f) を見たら終端に達してるかどうかが判る
pythonでもf.eof() みたいなのを作っといてくれればいいのに無いというのは、
そんなプログラムは書くなという明示的な意図なんだろうな

便利なのになー
なんで駄目なんだろ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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