Pythonのお勉強 Part66

レス数が950を超えています。1000を超えると書き込みができなくなります。
2021/11/12(金) 07:48:11.11ID:vp8lzav70
!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://codepad.org/      ほぼ直感的に使える。Run codeボタンあり。
ttp://pastebin.com/     まずまずシンプル。
ttp://dpaste.com/      とてもシンプル。消えるまでの日数は十分長ーく指定のこと。

◇Pythonオフィシャルサイト http://www.python.org/
◇まとめwiki ttp://python.rdy.jp/

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

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

次スレの建立は>>985が挑戦する。(980通過して24h後も落ちなくなった)
VIPQ2_EXTDAT: default:vvvvv:1000:512:: EXT was configured
2022/01/17(月) 12:22:45.63ID:G6emDPZd0
もし「参照渡し」だったら __m を上書きすると
append された後の「__mの参照」も上書きされるわけだから……

pythonのは いわゆる「参照の値渡し」なので大丈夫って言ってやるのが楽のよーな気がする
2022/01/17(月) 13:32:51.96ID:4lMff3fz0
分かったかもしれん
インスタンス化する時には暗黙的にnewをする事を思い出した
つまり>>851の場合はmは全部実態は別になるんだね?

そうじゃないと極端に使いにくすぎるもんな
2022/01/17(月) 13:37:15.96ID:eSi1/nEN0
慣例的に参照渡しという表現は「変数の参照」を渡す事を言う
通常変数が静的領域やスタックに実体を持つ値型の言語では。

しかしPython変数は全て参照型(C言語的にはヒープへのポインタ)
そしてPythonにC++の&やC#のrefに相当する参照渡しはないので
参照を格納している変数の内容を呼び出し先から変更は出来ない
ただし同じ参照(ポンイタ値)を経由する実体の操作は共有される

C# Doc曰く「参照渡しで渡すという概念と参照型の概念とを混同しないでください

>>853 Exactly.
2022/01/17(月) 13:47:46.96ID:W+/63TdwM
C++の&だって呼び出し側が書き換えられているように見えるのはポインタと同じようにアドレス値を渡してるからであって、"参照の値渡し"と変わらんのでは?
値渡しでない参照が使える言語なんてあるの?
2022/01/17(月) 14:36:13.35ID:eSi1/nEN0
>>855
本質はそうだけども、Pythonに変数の参照を渡す術がない
元々が参照型(ポインタ)、「変数」ではなく「実体」への参照が渡る
デリファレンスもなく代入は常に参照の割り当てで、元変数も書き換えない

C++やC#で言う参照渡しは変数への参照が与えられ、元変数自体を変更可能
元々が参照型やポインタの場合にはポインタのポインタ状態になる
857デフォルトの名無しさん (ワッチョイ a136-vRJH)
垢版 |
2022/01/17(月) 16:24:52.14ID:TnyU9nQo0
python で参照渡しにするなら、配列で渡すしかないって事だよね。
2022/01/17(月) 16:54:46.12ID:vsIyvMGR0
Cを始めたばかりの頃ポインタめんどくせえと思ったけど明示的だし楽だったんだなあ
2022/01/17(月) 18:41:48.63ID:f9N3zclk0
デリファレンスかったるいからC++の参照がええわ
とゆうかいちいち書くのメンドイから参照ができたんでしょ
知らんけど
2022/01/17(月) 18:49:49.25ID:aiJhHrOhM
言語仕様としての参照とで混同してる
指してるものはいっしょやけど
861デフォルトの名無しさん (ワッチョイ a136-vRJH)
垢版 |
2022/01/17(月) 18:49:50.03ID:TnyU9nQo0
昔はリターン値が一つしか返せなかったけど、今は複数個返せるから参照渡しもあまり意味がないんだろ。
まあ、どデカい配列とかを渡すときは、参照渡しは意味あるだろうけど。
2022/01/17(月) 19:59:12.78ID:VZGb/HpKd
>>853
そう、だから
>>573
863デフォルトの名無しさん (ワッチョイ f901-yENW)
垢版 |
2022/01/18(火) 22:52:58.92ID:aXITGa9l0
私もここに常駐して皆さんぐらいのレベルに早くなりたいです。
2022/01/18(火) 22:58:28.99ID:5DfJOP/a0
作りたいものがあるとすぐだよ
過去に別の言語で作ったものの移植でもいい
865デフォルトの名無しさん (ワッチョイ 6e10-6KEr)
垢版 |
2022/01/19(水) 00:31:22.28ID:bCy7bu6O0
>>863
志が低過ぎる
2022/01/19(水) 00:50:38.28ID:b3RzcCJx0
揚げ足取りは世界一
2022/01/19(水) 02:00:34.92ID:ND4+DLhI0
ここ初心者向けスレじゃないの?
最近見始めたから知らんけど
2022/01/19(水) 06:37:45.42ID:VHoBV8Rl0
日本語初心者の質問は多いな
2022/01/19(水) 08:08:07.59ID:Jw4BGPpA0
Pythonの試験増えたね
https://codezine.jp/article/detail/15471

https://it.impress.co.jp/articles/-/22573
2022/01/19(水) 08:22:24.60ID:ov2X7pn30
ぐぐってコピペするとか、作っておいた虎の巻を参照するとか、
ツールが候補を教えてくれるとか、そういう作り方をするのが常道なので、
記憶だけで答える試験は制約が大きい

持ち込み可(google含む)なら意味ある
2022/01/19(水) 09:26:51.15ID:VHoBV8Rl0
そうなんだよね
記憶だけで答える試験は年寄りには不利だ
試験問題難しくて良いから資料持ち込みはありだよな
2022/01/19(水) 10:28:34.76ID:9a+02jGb0
公式サイトのみ閲覧OKで
2022/01/19(水) 11:11:54.51ID:ND4+DLhI0
Pythonの試験www
情弱オブ情弱www
2022/01/19(水) 11:17:13.44ID:Gn+IJNl2a
基本情報処理とかな
2022/01/19(水) 11:32:28.79ID:ov2X7pn30
まあ、自費で受けるようなもんじゃないから何でもいい
2022/01/19(水) 12:47:17.28ID:R+1XHYGi0
ベータ試験って何か合格しても嫌だな
877デフォルトの名無しさん (オイコラミネオ MMd5-0hlo)
垢版 |
2022/01/19(水) 13:22:05.24ID:WxcLvF91M
python自体よりファイルのパスの指定方法とかライブラリのデータはどこへ格納してどうやって指定するの?とかpythonのバージョン合わせるのどうやるのとかpipやenvってどういう事?とか色々そっちの方が難しい
2022/01/19(水) 21:07:39.29ID:MU1QvUuQ0
Python以前にターミナルをちゃんと使えている人どれだけいるのって感じはする。
pythonを教え込まれた学生は脳死でAnaconda prompt開いてpython filepathすることしかできん。
カレントディレクトリ、相対パス、基本コマンドを全く知らないのに実行してるのはむしろ恐怖。
データサイエンスやりたいのはわかるけどpowershell教えたほうが生産的なんじゃないか
2022/01/19(水) 21:10:38.05ID:64KTdvqJ0
さすがにpsはない
2022/01/19(水) 21:21:07.11ID:MU1QvUuQ0
>>879
プリインストールで非プログラマでも使えるツールの中ではめちゃくちゃ使えると思うけどなぁ
CLIめちゃくちゃ大事なのに、Pythonの入門書でも何でも説明されている方が珍しいし、されていてもイケてないコマンドプロンプトだったりで頭抱える
2022/01/19(水) 21:34:56.27ID:ov2X7pn30
形式的にはCLIだけど、ガチでコマンドタイプしてpython使う奴はいない
別の手段で同じことを実現する
そんな古くて面倒なことはみんな忘れるのがpython
882デフォルトの名無しさん (ワッチョイ 6e10-6KEr)
垢版 |
2022/01/19(水) 21:51:30.92ID:bCy7bu6O0
ps使うぐらいならwsl入れろ
883デフォルトの名無しさん (ワッチョイ a136-vRJH)
垢版 |
2022/01/19(水) 21:52:01.11ID:XG/tmssg0
windowsじゃ無くてlinuxから入るべきだなw
2022/01/19(水) 22:24:33.31ID:uUfRyRoD0
PSみたいなゴミ導入するぐらいなら、最初からbash使わせろやって話だな
2022/01/19(水) 22:26:12.88ID:VHoBV8Rl0
>>881
その物言いだとbase環境だけで使ってる感じだなw
2022/01/20(木) 08:31:22.24ID:ESGatvgk0
要するに初心者と意識低い系はちゃんとmacを使えって事だな
2022/01/20(木) 08:38:55.47ID:fLKXds2N0
macの人はツールを使って何かを作る専門で、
仕組み自体を作ったりはしないのでは
2022/01/20(木) 10:17:40.64ID:VZGuEXXO0
公式サイトの1/14のニュースにはM1 Macで開発したとあるけどな
MacBookのトラックパッドが満足に動けばLinuxでもいいんだけどね
どうせ動作確認、CIはコンテナでするから端末はLinuxじゃなくても困らない
889デフォルトの名無しさん (オイコラミネオ MM29-o6XP)
垢版 |
2022/01/20(木) 11:52:16.52ID:AnlXyinuM
コマンドライン分からん思ってたがガラケーのメニュー入れ替えたり、iPhone3GS脱獄したりネット見ながら色々やってる間に知らないうちに触ってたんだな
無知とは恐ろしい
2022/01/20(木) 13:09:45.12ID:ZN8PVu5V0
たしかに無知だな
何も身についてない証拠
2022/01/20(木) 18:42:45.54ID:ESGatvgk0
俺も無知だからおk
それよりクラスごとtryで囲っていい?エラー吐いて終わったときにある処理をしたいんだが
2022/01/20(木) 18:57:01.24ID:ZN8PVu5V0
そのエラーとやら置きそうなとこだけtryで囲むのが普通
まぁでもいいんじゃない?クラスごとの意味が分かんないけど
やってみれば?
2022/01/20(木) 18:58:09.69ID:NuVLsXYX0
class定義をtryで囲むって事?
それだと定義時のエラーを捕まえるだけでインスタンスのエラーは捕まえられないよ
2022/01/20(木) 19:07:33.03ID:29Oj4UZnM
デコレータでうまくやれんかね
2022/01/20(木) 19:23:33.34ID:ZN8PVu5V0
クラス定義時のエラーって何
文法エラー?
2022/01/20(木) 20:27:41.96ID:ESGatvgk0
やりたいのはseleniumのdriverを、どんな例外が発生した場合でもclose()すること
ググったらwith使うパターンが良さそうかなとも思ったけど@contextmanagerを使うパターンもあるみたいだけどどっちもよく分からない
とりあえずwithを使えるのは内部に__enter__と__exit__を持つクラスとメソッド?なのは分かった

俺が作ったモジュールではdriverを引数としていくつかのメソッドに渡したりreturnしたりしてるけど機能するんだろうか
試してみようかな
2022/01/20(木) 20:45:32.87ID:3Ud5USvA0
seleniumのインスタンスが対象メソッド外からでもアクセスできるなら
>>894 のいうとおりデコレータで表現すればコードのスマートさが保てる
2022/01/20(木) 20:54:37.26ID:ZN8PVu5V0
withもデコれーたも分かってないなら
一連のdriver.〜を素直にtry catchしよう
2022/01/20(木) 21:16:34.29ID:ESGatvgk0
今流れでクロージャについて調べてる
最終的にはwith使う事になりそう
2022/01/20(木) 22:05:27.10ID:OJXHwtm40
close()じゃなくてquit()ならcontext manager実装されてるよ

with webdriver.Chrome() as driver:
__do_something_with(driver)
2022/01/21(金) 00:28:30.50ID:lqkWi8hl0
>>900
これdriverをreturnする関数作って試してるけどurllib3.exeptions.MaxRetryError出て上手く行かんわ

ちょっと調べないと
2022/01/21(金) 08:51:33.02ID:mgMk+9mL0
>>852
参照はポインタを抽象化した概念で値はない
2022/01/21(金) 08:55:24.44ID:mgMk+9mL0
>>861
関数の副作用として破壊的操作が必要な時
コピーではなく参照による引数渡しは必須の機能だ
なければ純粋関数型言語と同じになる

今どきのスクリプト言語は基本型以外ほぼすべて参照による引数渡し
2022/01/21(金) 15:30:08.32ID:lqkWi8hl0
>>901
これ結局djangoのBaseCommand継承クラスのhandleメソッド内でやったら出来た
原因不明
あとkeyboardinturreptでは機能しないんだな
2022/01/21(金) 17:24:35.56ID:Llt7QcId0
>>904
django?
テストコードでselenium使ってるならsetupとteardownで良くない?
2022/01/21(金) 17:46:15.09ID:lqkWi8hl0
>>905
いや普通のデータ収集
2022/01/21(金) 18:05:24.47ID:1bXl6qPl0
スクレイピングって結局、htmlを正規表現で解析した方が正確で速かったりする
自由に書けすぎるものを型にはめても絶対溢れる
2022/01/21(金) 18:13:55.00ID:pFjUBAs70
画面遷移でリクエスト構築するの面倒だしすぐbot判定されそう
2022/01/21(金) 18:27:50.59ID:uYMfMtVk0
なんで急にスクレイピングの話になったんだ?
大丈夫か?
910デフォルトの名無しさん (ワッチョイ f901-Nrkm)
垢版 |
2022/01/22(土) 14:06:13.46ID:P7lfAWJG0
args = sys.argv
id = args[1]
【エラー】
IndexError: list index out of range

★”id”には何が入るのですか、どなたか教えてくれませんか。
2022/01/22(土) 14:46:36.26ID:y3RiWYQh0
>>910
https://docs.python.org/ja/3/library/sys.html#sys.argv
2022/01/22(土) 14:50:38.03ID:xJ8GN0MU0
args = sys.argv[1:]
for arg in args:
print(arg)

こんな風にすると安全
2022/01/22(土) 15:10:05.08ID:QWAkInsq0
どっちも同じエラーになると思うけど、どう安全?w
2022/01/22(土) 15:12:07.97ID:QWAkInsq0
と思ったけど長さ0のリストにどんなスライスかけても同じもの返すのか
2022/01/22(土) 15:48:27.81ID:y3RiWYQh0
お前も落ち着いて>>911を読め
2022/01/22(土) 20:19:52.93ID:dTW6+L1p0
idに入るのはidなんじゃないか?
中身を聞かれてもそのスクリプトがどんな用途なのか知らないと答えようがない
2022/01/22(土) 20:29:14.09ID:xJ8GN0MU0
argcは無いんだからargvという名前は変だよな
918デフォルトの名無しさん (ワッチョイ 8736-3ds2)
垢版 |
2022/01/22(土) 20:30:52.89ID:j0z/5Y+Y0
って言うか、エラーが出てる時点で何も入らないんじゃねえの?
2022/01/22(土) 20:33:00.49ID:QWAkInsq0
上のやつのことなら、なにも入ってない
なんかいれる前に、配列外へアクセスしたことによるエラーでプログラムが落ちた
2022/01/22(土) 21:54:45.25ID:GJqn9WH1M
>>917
配列なんだし別におかしくないと思うが
2022/01/22(土) 21:58:36.37ID:f0jQfsum0
直後に
dir(id)
すればわかるが
idはそもそも組み込み関数なので変数名に利用すべきじゃない
2022/01/22(土) 22:03:45.12ID:ZquoYFuO0
>>920
vectorのvだもんな
2022/01/22(土) 22:11:38.24ID:v6co4ARz0
argument variableじゃなかったん?
2022/01/22(土) 22:26:58.29ID:QWAkInsq0
id関数って動くコードで使うこと殆んどないし別に…
ただidって言葉が自然言語として意味がバカ広くて
あとから読んだ時謎の変数に見えてくるのは容易に想像できるから
そういう意味ではおすすめできない
2022/01/22(土) 22:30:08.60ID:xJ8GN0MU0
listとarrayとvectorの違いを述べよ
2022/01/22(土) 22:31:23.98ID:y3RiWYQh0
未だに>>910分かってるやつ
俺と>>912しかいないの草
2022/01/22(土) 22:53:38.08ID:f0jQfsum0
>>926
第1引数必須のプログラムなら元コードがシンプルで素直
ヘルプだしたりフォールバックするなら例外補足したらいいんだし
>>912 は可変長を考慮してるんだと思うがさらに解析が必要だし
なら最初からargparse/getoptつかえばってなる
2022/01/22(土) 23:01:44.46ID:xJ8GN0MU0
引数で指定するものなんて処理対象だけだし
複数あればずらずら並べるだけ

設定と処理対象を混ぜる方式は面倒なだけなので、
そっちは別で指定して configparser で読み込む
2022/01/23(日) 00:10:54.70ID:KYoztYh80
>>927
俺じゃなくて>>910に言えよ
>>921も回答になってないけどw
930デフォルトの名無しさん (JP 0H8f-vKrE)
垢版 |
2022/01/23(日) 00:37:48.64ID:X663g2ceH
ser = serial.Serial('COM4', 9600, timeout=1)
【エラー】
could not open port 'COM4': PermissionError(13, 'アクセスが拒否されました。', None, 5)

どなたかおしえていただけませんか...
2022/01/23(日) 00:50:09.34ID:KYoztYh80
COMポート番号が合ってるか確認する
管理者権限で実行してみる
他にシリアル使ってるプログラムが無いか確認する
932デフォルトの名無しさん (JP 0H8f-z3gx)
垢版 |
2022/01/23(日) 01:17:24.35ID:X663g2ceH
>>931
管理者権限で実行したところ同じエラーが出ました。
また、COMポート番号はデバイスマネージャーからポートのところを見たらそれしかなかったので間違っていないと思います。
他にシリアルを使っているプログラムがあるかは、デバイスマネージャーのポートの詳細
設定のポートを選ぶ部分で使用中になっていなかったので大丈夫かなと思ったんですけどそれじゃ不十分だったりするんでしょうか...
2022/01/23(日) 01:32:18.11ID:KYoztYh80
>デバイスマネージャーのポートの詳細設定のポートを選ぶ部分で使用中になっていなかった
これは現在使用中って意味じゃない(現に自分にPCには存在しないポートも(使用中)と出る)
閉じていいアプリは全部落としてやってみそ
934デフォルトの名無しさん (JP 0H8f-z3gx)
垢版 |
2022/01/23(日) 01:37:35.86ID:X663g2ceH
>>933

ありがとうございます!やってみます!
935デフォルトの名無しさん (JP 0H8f-z3gx)
垢版 |
2022/01/23(日) 01:40:22.24ID:X663g2ceH
VScode以外落としてみたんですけどダメでした...泣
2022/01/23(日) 02:00:02.91ID:KYoztYh80
インタラクティブモードでやってる?
ちょっと試したけど既にポート開いてるなら2回目は PermissionErrorで失敗するみたい
serの中身がSerial<id=0x・・・・, open=True>みたくなってない?
937デフォルトの名無しさん (JP 0H8f-z3gx)
垢版 |
2022/01/23(日) 02:17:56.46ID:X663g2ceH
インタラクティブモードでやってなかったので今やってみたらこんな風に出ました
Serial<id=0x20237cc3880, open=True>(port='COM4', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=1, xonxoff=False, rtscts=False, dsrdtr=False)
2022/01/23(日) 02:26:45.29ID:KYoztYh80
あごめん、言い方悪かった
別にインタラクティブモードじゃなくてもスクリプトでもいいけど
すでに開いてるポートを開こうとするとエラーになるんで
ser.close()せずに再びser=serial.Serial(..)してんじゃない?

>>> import serial
>>> ser=serial.Serial('COM8')
>>> ser
Serial<id=0x2992c530940, open=True>(略
>>> ser=serial.Serial('COM8')

serial.serialutil.SerialException: could not open port 'COM8': PermissionError(13, 'アクセスが拒否されました。', None, 5)
>>> ser.close()
>>> ser
Serial<id=0x2992c530940, open=False>(略
>>> ser=serial.Serial('COM8')
>>> ser
Serial<id=0x2992c043970, open=True>(略
>>>
939デフォルトの名無しさん (JP 0H8f-z3gx)
垢版 |
2022/01/23(日) 02:49:00.53ID:X663g2ceH
なるほど!
ありがとうございます。2つのファイルを実行して、どちらもserを使うので2回開こうとしてました!どこかで閉じるようにしてみます
940デフォルトの名無しさん (ワッチョイ c701-z3gx)
垢版 |
2022/01/23(日) 03:03:09.94ID:MLqhVhgC0
>args = sys.argv
>id = args[1]
>【エラー】
>IndexError: list index out of range

>>910の追加項目
私の機械:windows10 Python 3.9 
目的:SQLiteへデータを登録しようとするPG作成中です。
”id"を目的のサンプルPGの一番最初の部分です。
どなたか教えてくれませんか。
941デフォルトの名無しさん (ワッチョイ 8736-3ds2)
垢版 |
2022/01/23(日) 06:46:02.96ID:PgBhXr380
シリアルポートなんて、いまどき使うんだ。
RS232か、昔はよく使ってたなw
942デフォルトの名無しさん (ワッチョイ 8736-3ds2)
垢版 |
2022/01/23(日) 06:56:09.26ID:PgBhXr380
>>940

sys.argv[0] が プログラム名
sys.argv[1]が 第一引数。

プログラム起動時に引数を指定してないんじゃねえの?

prog id の所を prog で起動してるとか。
2022/01/23(日) 10:23:54.10ID:bZmeHR4M0
マイコン工作するとUSBで接続して仮想シリアルポートにして通信するのが楽
2022/01/23(日) 10:30:27.98ID:gURfbQct0
>>940
せっかく>>911が正解を書いてくれてるのに無視?
この程度が理解できないならあきらめた方がいい
2022/01/23(日) 10:41:43.43ID:bZmeHR4M0
いや、判らん状態で>>911読んでも判らんだろこの書き方では
サンプルや動作結果の一つでも無いと

そもそも[0]が本体の名前になるというのが、悪しき伝統な気がする
直感的には1つ目の引数がargv[0]であるべき
でも自分が誰か知りたいとかフルパスを知りたいとかの用途にも応える為に、
[0]にプログラム名を割り込ませた
そのせいで、大抵の場合は先頭を除去する処理が増えた
2022/01/23(日) 10:47:56.63ID:zjhM3+vK0
>>945
一回で覚えろ
2022/01/23(日) 10:59:24.82ID:v6WsaUYQ0
>>945
ターミナルに打った文字列まんまでわかりやすいと思ってたんだがそうでもないのか
2022/01/23(日) 11:04:06.14ID:bZmeHR4M0
コマンドラインそのものは、argumentではないんだよな
function(x)があって、functionの引数はと聞かれてfunction, xと答えるようなもの
2022/01/23(日) 11:07:00.46ID:abLOZeidM
正解は>>918だろ
>>911は教え方を知らないアホ
2022/01/23(日) 11:11:17.46ID:bZmeHR4M0
第1文の
> Pythonスクリプトに渡されたコマンドライン引数のリスト
だけ読めば、[0]が1つ目の引数だと解釈して当然

第2文の
> argv[0] はスクリプトの名前となりますが
これがいきなり第1文と矛盾していて、そのことに配慮していないのが問題
2022/01/23(日) 11:26:34.23ID:KYoztYh80
>>942
正解

>>949
アホ
レス数が950を超えています。1000を超えると書き込みができなくなります。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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