- ベストアンサー
Pythonの上達法
Pythonのドキュメントが読みなせるようになりたいです。 https://docs.python.org/3.11/index.html とりあえず下記の本やサイトは一通り読みました。あとはどんな本やサイトを読んでいけばいいですか? おすすめのものを教えてください。 Python入門 https://atmarkit.itmedia.co.jp/ait/subtop/features/di/pybasic_index.html わかるPython https://www.sbcr.jp/product/4797395440/
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
追加情報。 「Python 逆引き」で検索すると次のような本も見つかった。 逆引きPython標準ライブラリ 目的別の基本レシピ180+!: https://book.impress.co.jp/books/1117101049 こっちも僕は未読、なんだけど目次とか見たら秀和システムのブツより良さそうなカンジ・・・・・・。 まぁ、こっちも、図書館で借りてみるなり、大きな本屋へ行って立ち読みするなりして確認してみて。
その他の回答 (6)
- cametan_42
- ベストアンサー率62% (162/261)
> @ITの連載でも引数に関数を入れられる場合と、入れられないから一度変数に格納して渡している場合があったのを思いまだしました。多分関係あると思います。 例えば、だね。稚拙な例だけど、なんかを購入して、子供(20歳未満)は400円×個数、大人は1,200円×個数を払う、としてみよう。 この条件だけで2つ関数がでっち上げられる。 def child(count): return 400 * count def adult(count): return 1200 * count 通常、これをまとめた関数calcは次のように書かれる。 def calc(age, count): if age < 20: return child(count) else: return adult(count) 一方、「関数がファーストクラスオブジェクト」であるPythonは次のような記述法が認められるんだ。 def calc(age, count): return (child if age < 20 else adult)(count) 5行あった関数定義が2行まで圧縮出来る。そしてこれが「関数がファーストクラスオブジェクトだ」と言う意味だ。 ここで使ったif〜elseはいわゆる「条件分岐文」じゃなくって「条件式」だ。値を返す構文であって、条件分岐文とは別物だ。 条件式: https://docs.python.org/ja/3/reference/expressions.html#conditional-expressions んで、一般に条件式は「値を返す」モノだ、ってぇんで、1と言う数値とか、"I love Python!"と言う文字列だとか、あるいは[1, 2, 3]と言ったデータを返すと思われている。それはそれで正しいんだけど、じゃあ「関数は?」となると、「関数がファーストクラスオブジェクト」であるPythonでは関数さえも「値」なんだ。 上の短縮版だと「条件によって違う関数を返し」、それに対して引数を適用させている。 (child if age < 20 else adult)(count) ------------------------------------ -------- | | 関数部分 引数部分 結果これは「構文的には正しい」わけだ。 一つ言っておくと「こう書きなさい」って言ってるわけじゃない(笑)。メインテナンスの問題もあるし、「どういう形式で書くか」ってのは極論好みの問題だから、だ。 ただし「出来る」と言う事を知るためには「練習」は必要になる。 んで、C言語なんかの経験者だとこういう形式をただ「難読だ」って言い出すんだけど、平たく言うと「関数がファーストクラスオブジェクトだ」と言う意味が分かってないだけ、だ。ある言語がある機能を備えてて、それが「使える」以上、そういう「書き方」ってのは許容されてしかるべき、なんだけど、「C言語での常識」を他言語に持ち込もうとするのは愚かとしか言いようがない。 逆に、実の事を言うと、他の「関数がファーストクラスオブジェクト」である言語ユーザーにとっては「上の書き方」は別段突飛な書き方でもなく、許容範囲で「フツー」なのね。「ああ、出来るようね、そういうの」で終わり、だ(笑)。 簡単に「難読だ」と判別しない事。そのためには、実践上「使うか否か」ってのは別問題だけど、ある程度「練習して」使いこなせるようになる必要がある。その上での「判断」なんだ。 また、高級言語はそもそも、「クッソ長いアセンブリ言語」を書かずに如何にコードを短く書くか、ってぇんで生まれてる。言い換えると実は「短ければ短い程正義」って側面があるんだ。仮に短くて難読化する、って言語があれば、単純に元々「設計が良くない」って事を意味する。Pythonならアタマの体操程度で「短いコードを書こう」と挑戦する事は悪くないし、前の投稿で書いた膨大な「モジュール・ライブラリ」の存在も「実際書くコードを短くする為に」存在してる。 まぁ、切り詰めすぎると「読みづらくなる」ってのは否定はしないけど、「どの程度短くするのが」自分の好みになるのか、ってのは研究対象にしていいと思うし、他の人の判断じゃなくって「自分で判断出来る」ってのがPythonみたいな高級言語を使う「旨味」だと思うよ。 > 私が「覚えることが多い」、と感じたのは多分このへんなんだと思うんです。サンプル見て理解することを繰り返しているうちに、見ても全然わからないから「まずどういうものがあるのか徹底的に覚えよう」として、ところが多分後々(少なくとも当面は)自分で使わないものまで覚えまくるようになってしまったこと。切り捨てるという選択肢も必要だな、と。 貴方、多分マジメな人、なんだよ(笑)。 んで、確かに、抽象データ型としてリストを紹介する際に「メソッドてんこ盛り」て教えよう、とする本が多いんだ。言っちゃえばそういう本を書いてる人ってのは「C言語しか知らん」人ばっかで、「データを破壊的変更する」危険性に無頓着な人が書いてるのね。Cだと「データ書き換え」がフツーだからさ。 一方、モダンな言語だと、基本的には「データをコピーしたり」「データを生成する」のが戦略なの。もちろん使用メモリが増えたりする、って欠点があるんだけど、バグを作り込む危険性は減る。 もう一つはガベージコレクタ、ってのがあって、その起動のコストを嫌う人が多い、んだけど、必ずしもガベージコレクタが「速度低下の原因になる」とは限らないんだ。 例えば次の例を考える。 >>> lst = [1, 2, 3] >>> lst.extend([4, 5, 6]) >>> lst [1, 2, 3, 4, 5, 6] extendってメソッドが実行されると、lstは元の形式を保持出来ない。こういうのを「破壊的変更」って言うんだ。ある関数が破壊的にデータを変更したら別の関数が同じデータにアクセスして「思ったんと違う」結果になる、ってのは良くあるんだ。たくさんコードを書いてると「どこで変更が行われたのか」パッと見分かりづらくなる。 上のようなコードを書くのなら、次のように書いた方が「安全」なの。 >>> lst = [1, 2, 3] >>> lst + [4, 5, 6] [1, 2, 3, 4, 5, 6] >>> lst [1, 2, 3] これなら元データを変更せずに同じ結果を得られる。 繰り返すけど、リストのメソッドの殆どは「破壊的変更」が前提で、存在理由は「コードを最適化する」為なのね。非破壊的にコードを書いていった結果、「スピードが遅い」時に「差し替える」為にある。ただし、最初からそれを使うのは「早すぎる最適化は諸悪の根源」ってヤツなんだ。 リストのメソッドを全部覚えるよか、最初に覚えた方がいいのは、むしろ「プロファイラ」の使い方だ。 Pythonプロファイラ: https://docs.python.org/ja/3/library/profile.html プロファイラは貴方の書いたコードの「どこが」速度低下の原因(ボトルネックと呼ぶ)になってるのか教えてくれる。そして、大体のケースに於いて、ボトルネックは「貴方が想像した部分じゃない場所だ」と、計算機科学者のドナルド・クヌースは言ってるんだ。 ドナルド・クヌース: https://ja.wikipedia.org/wiki/%E3%83%89%E3%83%8A%E3%83%AB%E3%83%89%E3%83%BB%E3%82%AF%E3%83%8C%E3%83%BC%E3%82%B9 いずれにせよ、プロファイラはモダンな言語処理系だとデバッガと対になってる「二大開発ツール」のうちの一つ、だ。 存分に活用しよう。 > やる気がわいてきたというか、ワクワクしてきました。 頑張ってください。
お礼
マジメかどうかで言えばまじめにやるつもりでいるけれど、自分の利益ですからね。おかげさまで収穫が多いので当分楽しめそうです。
- cametan_42
- ベストアンサー率62% (162/261)
> まずは図書館で予約しておきました。 おお、いいね。図書館の弾力活用。 なかなかね、プログラミング系の技術書って値段が高いのが多いから、図書館とか利用出来るんならガンガン利用した方がいい。 それで本の良し悪しを見て、良かったら購入、って流れの方がいいよね。 > 約束事が多い、はおっしゃる通りピンとずれてました。できることが多い、ですね。その分覚えることが多いだけの事。単に高級言語の恒久の度合いが高いというだけのことだとは思います。 そう、高級言語はレベルが高ければ高いほど機能が増える。 なお、昨今のモダンな高級言語って大まかに言うと次のような機能が含まれてるんだ。 1. 関数がファーストクラスオブジェクトである 2. 無名関数が扱える 3. レキシカル・スコーピングがある 4. 条件分岐が値を返す 5. パターンマッチ構文がある 6. 遅延評価、あるいはその部分的実装を持っている うーん、多分こんなトコ。Pythonじゃないけど、例えば最近人気の言語のRustなんかは6以外はこんなカンジになってて、C言語なんかじゃ追っつかない程の機能を抱え持っている。 つまりこれらは「将来的には」プログラミング言語が持つ機能の「スタンダード」になる可能性が高い、って事だ。 正直言うと、Pythonは2、3、4と6が怪しい(部分的な実装、って程度)。ただそれでも、今Pythonの機能を学べば、「他の言語に移る」際にも概念的には「新しい事を学ぶ必要が」全くない、たぁ言わないけど「かなり減る」ね。 ただ、それを置いても、実際問題、意外とPythonでは「学ぶ事が多い」。と言うのも、実は最初の段階ではそうでもなかったんだけど、今だと「実用的な言語」ってのが前面に出てきちゃったから、なのね・・・元々Pythonってのは他の言語とちと観点が違っていて、「Python自体を高速化する」とかそういう事は考えてなかった言語なのよ。・・・要はフツーの言語だと「何でも自分自身で出来ないとダメ」なんで速度を稼ごうと頑張る。スピードが稼げないと「ダメ言語」の烙印が押されるじゃない? ところがPythonってのはその辺「ぶん投げた」のね(笑)。「速度が欲しいならそれ専用の言語を使えばイイじゃない」ってぇんで、速さが必要な時にはその辺はC言語とかFortranに「ぶん投げる」(笑)。言い換えるとC言語とかFortranとかとの「連携」を重視するように設計されてて、それがウケた大きな理由なんだ。逆に見ると、PythonはCで書かれたプログラムの「フロントエンド」になり得るように設計されてる、ってわけだ。 Python自身は「頑張らない」。だから一時期、グルー言語(糊言語)とか言われて初期はそういう立ち位置だったわけ。 一方、Pythonは3.xになると割に「Python自身の効率化」ってのが視野に入ってきちゃった。それが理由で、「効率化の為に・・・」って言う実装上の「説明」を多用せざるを得ない言語になっちゃってるの。平たく言うと「イテレータ」の存在なんだけど、これは概念的には実はプログラミング初心者にはちと厄介なブツなんだ。まずそれが一つ。 もう一つが「battery included」って概念だよな。「充電済み」。つまり、コンピュータサイエンス的な「宿題」的なアルゴリズムや、「よく使う」あるいは「良く使えそう」な関数とかはユーザーが書く前にライブラリ・モジュールとして「提供しよう」って事だ。これは便利なんだけど、言い換えると「覚える事が多く」なる。 例えば data = [10, 20, 30, 40, 50] ってのがあったとして、「平均を求めなさい」って問題があったとする。 その場合、次のように書けば「ダメ」なんだ。 >>> result = 0 >>> for i in data: ... result += i ... ... >>> result / len(data) 30.0 もちろん、「ロジックが間違ってるから」って事ではない。単にPythonにはstatistics.meanって関数が用意されてるんで「それを使うべき」なんだよ。 statistics.mean: https://docs.python.org/ja/3/library/statistics.html#statistics.mean >>> from statistics import mean >>> mean(data) 30 つまり、Pythonでは「用意されている(標準)ライブラリ・モジュール」を徹底活用して「短いコードを書くのが美徳」ってプログラミング言語なんだ。 こう聞くと「良く出来てる」と思うんだけど、実はこの標準で用意されているライブラリ・モジュールを「全部覚える」とか相当なハードタスクだ(笑)。そっちはそっちで「実用的じゃない」とは言えるよね? ぶっちぇけ、「Pythonはシンプルで覚えやすい言語です」ってのは嘘だ。もっとも、どんな言語だろうが似たような事を言ってるし、要は現実的には、人を誘う為の枕詞以上のモノがないのかもしんない。それでも実際にはPythonってのは「巨大」だ。全部知るのは相当骨が折れる。そしてそれは「実用的な言語」である事を目標とする以上、避けられないんだよね。 世の中には言語仕様が100ページに満たないプログラミング言語、なんつーのもあって、確かにシンプルなんだけど、一方、そういうプログラミング言語は「実用性が乏しい」。充分な「標準ライブラリ」が無ければユーザーが全部フルスクラッチで色々と書かなアカンくなるから、だ。 それに比べるとPythonは・・・多分マシ、ではあるんだよ(笑)。たとえ全ライブラリを合わせた解説が電話帳みてぇになってた、としてもだ。この辺はある種トレードオフだよな。 ただ、Pythonはもう一つ厄介な欠点があって、実は「マトモな言語仕様書が存在しない」。例えばライバルと言えるRubyやJavaScriptには「言語仕様書」が存在してて、「スタンダードはこう、よって最低限持ってなきゃならないライブラリ及びライブラリ関数はこれこれ」って厳密に定義されてるんだけど、Pythonの場合は言っちゃえば「明日はどうなるか分からん」のよね(笑)。急に関数が増えたり、あるいは削除される、って事は常にあり得るわけ。何故なら「スタンダード」を定義した仕様書が存在しないから。 もちろん、事前にアナウンスとかは流れるんだけど、「Pythonオタク」でも無い限り、公式サイトにかじりついてアナウンスをずーっと監視してる、ってわけにゃいかないでしょ?だから覚えた事が「どのくらい恒久的なモノなのか」保証の限りじゃない、って弱点がある。 ただ、VB6をやってた、って事なんで、その辺はMicrosoftが全部握ってて、「突然の仕様変更があり得る」Visual Basicで慣れてるだろうから、気にしないかもしんないけど。 んで、ああそっか・・・問題が明確になってきたな。 例えば上の例で「平均を求めよ」って言われてstatistics.meanをすぐ「思い浮かれられる」ってのは「そういうモジュール/関数の存在を知ってるから」だよな。言い換えると「存在を知らなきゃ思いつきもしない」(笑)。当たり前だ。実際、Python本でstatistics.meanを知らないで「自分でコードを書かせる」ようなアホな示唆をしてる本もあるんだ。 Pythonのドキュメントもそうだけど、「知ってるから」関数名から機能を調べられるんであって、知らなければそもそも探しようがねぇだろ、って事は当然と言えば当然だわな(笑)。うん。 よって「やりたい事から」関数を探す「逆引き」が必要なんだろう。多分これが正解だ。 僕は読んだ事ないんだけど、Pythonでは次のような本が発売されている。 現場ですぐに使える! 最新Pythonプログラミング逆引き大全450の極意: https://www.shuwasystem.co.jp/book/9784798071558.html 多分これが「貴方に必要な」マテリアルだ。「やりたい事」からPythonの機能を探し、説明が不十分ならそのモジュール/関数名から「機能」を調べる。 そうだね、「逆引き」は必要だ。総体的に「電話帳」みたいになってるブツに対して調べるなら「逆引き」が有効でしょう。
お礼
さらなるご回答ありがとうございます。 statistics.meanの話、実は疑似逆行列計算するコードをAIに頼んだら、np.linalg.pinv(A)の一発でおしまいで衝撃受けました。むしろ無償で使えるMatlabだと思っていますけどね。 「Pythonはシンプルで覚えやすい言語です」ってのは嘘だ。ってのもすごくそう思っていて、これは頭のいい人ほどこんなに楽しい言語はないと思います。それにすごくいろんなことができるのPythonオタクになる価値あります。 逆引きも一つ有効だと思います。ただしなんでも逆引きに載ってるわけじゃないから、やはり言語リファレンスがスラスラ読めるようにならなければいけないと思うんですよね。で、そうなるためには自分で読んで書いて経験積むしかないので、あとはそこに至るまでの効率だけの問題。その効率を上げるために良質の教材を集めてるところ。←今ここ
- _kappe_
- ベストアンサー率68% (1581/2304)
たとえば、https://docs.python.org/ja/3.11/library/array.htmlを読んでよく分からない部分はどこですか? array.html以外のページを例にしてもいいです。 質問者さんが把握できていないのがPython固有の概念なのか、OSとかデータ型、アルゴリズムなど、もっと幅広いコンピュータ一般の知識なのかによって次に学習すべきものが違ってくると思います。
お礼
ご回答ありがとうございます。もっと基本的な部分だと思います。 例えば array.typecodesってarrayクラスの.typecodesメソッドなの?typecodesって.typecodeメソッドで使用するイテラブルじゃないの? class array.array(typecode[, initializer])の”typecode[, initializer]”ってどういう意味? typecodeはいいとして、itemsize、append(x)は第2、第3引数なの?それとも第一引数なの? みたいな感じです。
- cametan_42
- ベストアンサー率62% (162/261)
さて、最後に。プログラミング言語にはいくつか「脱初心者になる為のツボ」ってのがあるんだ。Pythonではそれがどこなのか、かいつまんで説明していく。 ・「関数がファーストクラスオブジェクト」だと言う意味を良く理解する事 Pythonでは「関数がファーストクラスオブジェクト」だ。これは気に食わない言い回しでもあるんだけど、何が言われてるのか、と言うのは実は単に「Pythonでは関数自体もデータ型の一つ」って意味なんだ。代入したり関数の引数になったり関数の返り値にも出来る。 日本で書かれたどんなPythonクソ本でも多分「関数は第一級オブジェクトだ」の類は諳んじられてるだろう。ただし、書いてる側が「その意味を分かってる」たぁ限らない、んだ。 Pythonでの関数定義defは結果ある種のコンストラクタだ。関数は一旦生成されればそれはデータ型として扱える。ここを「使えるようになって」、初めて「関数はファーストクラスオブジェクトだ」と言う意味が分かる事になる。 ・リストを使いこなせ、ただし、暫くの間はリスト付随のメソッドを使うのは避ける事 Pythonのリストは他の言語で言う「配列」に当たる。配列は他の言語でも重要なデータ型なんだけど、Pythonの場合、他の言語に見られるような「リストに入れるデータは同じ型じゃなきゃいけない」とか「固定長である」等と言った制限がない。 よってあらゆる局面で、抽象データ型が必要になる場合、まずは第一候補として「リスト」が来て、徹底的に使う局面になる、ってのは他の言語の比じゃない。リストを基準としてプログラムを書く、ってカンジになるだろう。 ただし、appendとかpopとか、あまりそういった「メソッド」は使わないようにしよう。これらは「プログラムの最適化する際の道具」であって、はじめからアテにしてはいけない。仮に使う場合は「返り値があるメソッド」のみ、にすべきだ(例えばcountとか)。 大体のケースではスライスすれば何とかなる。リスト+スライス、とかリストの+による結合、でいろんな局面は凌げるはず。 いずれにせよ、「最初からリストのビルトインメソッドをアテにする」と言うのは良くないプログラミング書法だ。 ・ビルトインデータ型で最重要データ型は辞書型だ もちろんリストが第一に来るけど、意外とそれ以上で重要なデータ型に辞書型がある。「初心者はまずはリストに慣れるべき」なら脱初心者の為のデータ型は辞書型、だ。 関数を書いてて、「条件分岐」が必要になった時、毎回「辞書型を使うギミックに落とし込めないか・・・?」と自問するのは良い訓練だ。もちろん上手く行かないケースは多いだろうが、「良い思考の訓練」になる。辞書型は「条件分岐を消し去る」良い代替手法で、結果コードはシンプルになる事が多い。 加えると「関数がファーストクラスオブジェクトである」Pythonでは、辞書型の「値」に関数を仕込める。キーによって「適切な関数を選ぶ」とか使い方は無限に広がる。そういう「可能性」に夢を見る事。 モダンなプログラミング言語とその記述法では「条件分岐」が減らせるなら減らした方が良い、ってのが戦略だ。辞書型はその助けになってくれる。 ・Pythonでの最重要構文はリスト内包表記 とにかく「リスト内包表記」を使いこなそう。実際、プログラムを書く上で、「繰り返し」が必要になるケースでは80%くらいはリスト内包表記で解決出来る。殆ど「素のfor文」が出てくる必要性なんざ無い、んだ。 「なんでもリスト内包表記」と言う意気込みでいても間違いない、くらいだ。「リスト内包表記は分かりづらい」なんて言う意見には耳を傾けない事。むしろリスト内包表記を使わないPythonプログラムなんて「クリープがないコーヒー」のようなモノだ。 リスト内包表記は貴方が挙げたWebページでは次のトコに書かれている。 リスト内包表記: https://atmarkit.itmedia.co.jp/ait/articles/1905/31/news015_4.html#listcomprehension 読み直して使いこなすようにしよう。 ・Pythonで最重要関数はfunctools.reduce Pythonでの最重要関数はfunctools.reduceだ。 functools.reduce: https://docs.python.org/ja/3/library/functools.html#functools.reduce これを使いこなせればPython初心者は脱却した、と言っていい。 Pythonにはいろんな組み込み関数があるけど、抽象度の高さ、つまり汎化性能ではこのreduceを超える関数はない。 よって、この関数を「使いこなせれば」、ある意味「悟りを開いた」と言うのと同義、になる。 functools.reduceを使ってフィボナッチ数列でも書ければ、まぁ、免許皆伝と言っていい。 それは宿題にしておこう、と思う。 なお、プログラムを書いてて「繰り返し」が出てきた時の大体80%くらいはリスト内包表記で対応可能で、残り15%くらいはfunctools.reduceで対応出来る。 「どうしてもforを使わないとならない」のは5%以下、ってのがホントのトコで、また、汎用性から言うとforよりもwhileの方がむしろ使い勝手はある、って事を参考までに言っておこう。 と言うわけで、Python脱初心者を頑張って目指して欲しい。
お礼
>・「関数がファーストクラスオブジェクト」だと言う意味を良く理解する事 @ITの連載でも引数に関数を入れられる場合と、入れられないから一度変数に格納して渡している場合があったのを思いまだしました。多分関係あると思います。 >ただし、appendとかpopとか、あまりそういった「メソッド」は使わないようにしよう。これらは「プログラムの最適化する際の道具」であって、はじめからアテにしてはいけない。仮に使う場合は「返り値があるメソッド」のみ、にすべきだ(例えばcountとか)。 私が「覚えることが多い」、と感じたのは多分このへんなんだと思うんです。サンプル見て理解することを繰り返しているうちに、見ても全然わからないから「まずどういうものがあるのか徹底的に覚えよう」として、ところが多分後々(少なくとも当面は)自分で使わないものまで覚えまくるようになってしまったこと。切り捨てるという選択肢も必要だな、と。 たくさんの情報ありがとうございます。自分で学べるようなって歯車が回るようになればどんどん進むようになると思います。没頭してみます。わかりはじめると面白いので数独で時間つぶしているくらいならこっちのほうがはるかに役に立つのになぁ、と思ったりしているんですけどね。
補足
たくさんの情報ありがとうございました。やる気がわいてきたというか、ワクワクしてきました。
- cametan_42
- ベストアンサー率62% (162/261)
ふむ。 > Pythonのドキュメントが読みなせるようになりたいです。 まずは、だな。 リファレンスマニュアルとか言語リファレンスとかは「読みこなせる」ようになるモノでもないんだよな。 要はこれらは辞書、なんだよ。 例えば貴方が、「日本語を上達したい」って言う外国人に 「日本語の辞書が読みこなせるようになりたい」 って言われた時に感じるモノがこちらが感じてる事だ(笑)。 「辞書を引ける」くらいの日本語力は必要だけど、かと言って「辞書を通読出来るには?」とか言われると困っちゃうでしょ(笑)。 辞書を読みこなせる日本語力って何だろ、とかなると思う。大体「日本語の辞書を通読したことねぇよ!」と(笑)。 そうなの、特に「リファレンス」の類ってのは前提としては「つまみ読み」の為の文書なのね。なんか見慣れない関数とか出てきた時、それの「使い方」とかを調べる為にそのテの文書がある。書かれてるサンプルを実際にインタプリタで打ってみて、その説明の通りになるか調べる。そのための「リファレンス」なんだ。 でも、Pythonドキュメントの中では、唯一通読しておいた方が良い文書が一つだけ、ある。それはこれだ。 チュートリアル: https://docs.python.org/ja/3.12/tutorial/index.html これは一回くらいは通読しておいた方が良いだろう。何故ならここには「Pythonの全部」が、辛うじて書かれているから、だ。 「チュートリアル」は「入門書」って意味だけど、ここで想定してるのは「他の言語を使った事がある経験者」だ。「プログラミング入門書」は意図していない。他の言語でAと言うやり方はPythonではどうなるのか、と言う観点で書かれている。 よって非常に纏まっているんで、これを読む事はMUSTになるだろう。 > とりあえず下記の本やサイトは一通り読みました。 ふむ。 ええと、ソフトバンクの方の出版物だけど、これは読んだ事はない。 ないけど、多分「ダメな本だろうな」とは予想してる。 ぶっちゃけ、Pythonに碌な本は出てないんだよ。クソばっかだ。 だからこのテの本は信用ならん。トイレットペーパーを読んでた方がマシ、ってブツの方が多いんだ。何故なら「どっちも何も書かれてない」から、だ。 多分、チリ紙交換が来たら交換してもらった方がいいと思う。ケツが拭けてかつケツが痛くならないだけトイレットペーパーの方がマシだ。 Python本って「Pythonを良く知りもしない」奴らが書いた本ばっか、なんだよ。 一方、貴方があげたWebページの記事だけど、驚いた。こっちはすごく良く書けてる。初めて見たけどマジでビックリした。 ちょっと章構成が冗長だけど、キチンとPythonの各機能の「理念」にツッコんだ話が書かれてるね。近頃稀に見る「良い記述」で溢れている。 んで、多分、貴方が最初にすべき事は、「手を広げる」より、こっちの文書をもう一回最初から読み直す方が良いと思う。それくらいこの連載記事は良い。良いモノ見つけたね。貴方の検索能力とこの出会いに感謝した方が良い。 んで、Further Readingもご期待に沿って挙げていこう。 まず、オンラインで読めるPDFがある。 Think Python: https://cauldron.sakura.ne.jp/thinkpython/thinkpython/ThinkPython2.pdf 上で挙げた「チュートリアル」は実は結構難しいんだ。そもそも上で書いた通り、あの「チュートリアル」はプログラミング経験者向けに書かれていて、それも恐らく「エキスパートが読みやすい」ようになってて、初心者が読むには確かにムズイんだわ。 Think Pythonは「チュートリアル」に類した書籍なんだけど、チュートリアルよりは易しく、チュートリアルは上で書いた通り「一回は通読すべき」本なんだけど、そこにたどり着くまでの足がかりになってくれるだろう。 Think PythonはPDFなんでダウンロードするなり、あるいは手元で印刷しておいてバインドして本にしといてもいいだろう。 あと、「Pythonを学ぶ」のではなく「Pythonを使ってプログラミングを学ぶ」為の書籍を推挙しておく。 世界標準MIT教科書 Python言語によるプログラミングイントロダクション 第3版: https://www.kindaikagaku.co.jp/book_list/detail/9784764906464/ これは広いトピックを取り上げている良書だ。ちと値段が高めだけど、日本で書かれたヘンなPython本を複数買うよか結果安上がりだと思う。これ一冊でしばらくは他の本は買わなくてもいい。それよりこれを読みこなそう。 あと、他の人に付いた補足への事なんだけど、 > VB6しか経験ないので素人同然なんですが、Pythonってすごく約束事が多くてAIに書かせたサンプルコードみてもよくわからない理由がそもそも知識不足だったりすることが多いです。 そう?「約束事が多い」ってのは何の事だろう。僕はVB6の経験はないけど、むしろPythonの方が「自由度は高い」んじゃないかと思う。 その「約束事」が何を指してるのかちとピンと来ないんだけど、一般的に「プログラミング言語は高機能であればあるほど」自由度が高くなるのね。むしろ「お約束が減っていく」。 Pythonは確かに「現存する言語の中で一番高機能な言語」ではないんだけど、少なくともBASICやC言語よりは高機能で、その分「自由度」は高いんだ。BASICやCの方が「お約束」に雁字搦め、かな。 まぁ、具体例が無いんでなんとも言いようがないんだけど、でも言い換えると「VB6の経験は殆ど役立たない」とは言ってもいいと思う。もっと言っちゃうと「C言語の経験さえ」役に立たない、どころか「Pythonを学ぶ際には邪魔になる」んだ。 ある低機能の言語経験で高機能の言語を「知識を応用して」学ぶ、ってのは実際にはほぼ不可能、って言っていいんだよ。むしろ「低機能言語の経験」なんつーのは忘れた方がいい。そっちで学んだことがないような機能がてんこ盛り、だからね。 VB6の経験がある、って事はPythonを学ぶ際には「その経験を捨てて心機一転しろ」って事だな。まっさらで立ち向かった方がいい。「以前に習った低機能な言語」の事は一旦忘れるんだ。 次に勉強法、だ。 > chatGPTに書かせたものを読んだり書き換えてみたりして各部の働きを理解するという事をしています これはダメだ。止めた方がいい。 ちょっとChatGPTの背景を説明するけど、こーゆーのって実は「人工知能」と言うより、基本的には「統計処理」なんだよ。ChatGPTなんかはネットに点在する「いろんなPythonコード」を参照して自分の知識ベースにしている。 と言う事は、だ。 実はプログラムを書く人、ってのは「上手い人」もいれば「下手な人」ってのもいるわけね。そしてその数は同数じゃない。「下手な人」の方が圧倒的に多いんだ。これが事実。 つまり「統計処理がベースだ」と言う事は、「上手い人」のコードは埋もれてしまって、平坦化するんだわ。いや、数で言うと「平均的な人」より「下手な人の方が多い」って考えた方がいい。 結果、ChatGPTが生成するコードってのは「下手な人の方に寄せられていく」ってのが考えられる最悪のケースになるんだ。よってChatGPTが生成するコードは「参考にならない」より「参考にしちゃあいけない」んだ。 ChatGPTにも強みがあって、それはデバッグだよな。例えば「貴方が考えて書いたコードが上手く動かなくて」ChatGPTにミスを見つけてもらう、ってのは良い使い方だとは思うけど、ChatGPTが書いたコードをそのまま受け入れる、ってのはロクな結果にならない。それはやっちゃいけない、んだ。 やるなら上手い人のコードを探そう。まぁ、最初から「誰が上手いか」探せるなら苦労しないんだけど、例えばトップハッカーとして名高い(クラッカーじゃないよ?念の為)人たち、例えば、Eric Raymond、 Peter Norvig、 Dan Connolly、Erann Gat、と言う人たちのPythonコードを読んだ方が参考になると思う。 検索してご覧?彼らは本当にエキスパートだから。
お礼
ご回答ありがとうございます。本は通り一編の説明なのは百も承知で初めの一冊だけは必要だろうなと思って買いました。で、@ITの記事は読んでて驚きました。通り一遍の説明では絶対に目がいかないところを重点的に解説していて、なんてありがたい連載なんだと。実はちょうどPythonチュートリアル:を読み始めたところです。 良書を数周読むつもりでいます。そもそも1周でおぼえられるわけがない。ThinkPythonは少しチラ見してみました。これもいいですね。ダウンロードして読めるので出張の移動時間に読もうと思います。多分、どれかを数周読めば他は復習になるので楽だろうと思います。 また「世界標準MIT教科書」のご推薦ありがとうございます。まずは図書館で予約しておきました。 約束事が多い、はおっしゃる通りピンとずれてました。できることが多い、ですね。その分覚えることが多いだけの事。単に高級言語の恒久の度合いが高いというだけのことだとは思います。
- agehage
- ベストアンサー率22% (2752/12072)
上達方法なのかドキュメントを読みたいのか、どちらの質問かよくわかりませんが、それだけ読んでいれば十分です あとは読む以上に書く 何を読んだか、ではなくて、何を書いたか、が上達の道です プログラムを書かない人は一向に上達しないのです そして初心者は基本問題をやり終えた後に「何を作ればいいのだ?」と悩むのです 私はそういう時にオセロを作りなさいと言います
お礼
ご回答ありがとうございます。もちろん上達したいのですが、そのためにはドキュメント読んで意味が分からないとしょうがないと思うので、ドキュメントを読みこなせるようになりたいです。 VB6しか経験ないので素人同然なんですが、Pythonってすごく約束事が多くてAIに書かせたサンプルコードみてもよくわからない理由がそもそも知識不足だったりすることが多いです。 なので関数リファレンスとか抵抗なく読めるようになりたいです。
補足
とりあえず書く以前にまずはいろんなコードを読むところから入っています。やりたいことを各要素に分解して、ネット上でサンプル探したり、chatGPTに書かせたものを読んだり書き換えてみたりして各部の働きを理解するという事をしていますが、理解できないことがおそらく多く、多分何が分かっていないのかもわかっていないことが多そうです。なのでドキュメントを読めるようになりたいと思った次第です。
お礼
これ、ありがとうございます。 「・・・基本レシピ180+!」って逆引きというよりも文法の教科書的によさそうな気がします。これなら一度丸暗記するつもりでやってみてもイイかなぁと思いました。