重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

友人から今人気の言語を聞いたところパイソンだと聞きました。
なので調べてみたら面白そうだなと思いました。
私は、今46歳です。
プログラミング経験はあります。
20代のころゲームをC言語で作っていました。
C言語は当時としては最先端でした。
今でも使っている会社はあるようですが、パイソンが増えているようですね。
C言語の良さはスピードが速いことです。
今でも忘れてしまってもいますが、C言語のコードで簡単なプログラムは組めます。
パイソンのコードを見たのですが簡略化されて文法がさほど難しくないかなと思いました。
やってみようかどうか迷っているのですが、パイソンをやられている方、どうですか?

A 回答 (12件中1~10件)

> まだまだ勉強が必要そうです。



と言うか、だね。
第一回チューリング賞を受賞したコンピュータ科学者、アラン・パリスって人は次のように言ってたとの事。

「プログラミングに対する考え方に影響を与えないような言語は知る価値はない」

つまり、仮にCを学んでたとしても「Cを通してしかそのプログラミング言語を操れない」のなら「学ぶ意味はない」んだ。
今から学ぼうとする言語の「特性」をまずは知るべきだし、「今まで書いてきた書き方と別の書き方」ができるような言語じゃないと学ぶ価値はない。
例えばPythonに於いては、「Cのように書いて」Pythonic、とか言っても実のトコ誰も得をしない、んだよ。貴女を含めて、ね。
やるなら「全く新しいモノを学ぶ」つもりでやる事。繰り返すけど、Pythonを学ぶ際には「C言語で学んだ常識」なんて忘れた方がいい。
「C言語でのプログラミングの常識」なんて思ったより役に立たないんだ。

#9と被るけど、個人的に「これさえ分かればPythonの初心者卒業」と思ってるポイントを書いていく。

1. Pythonでは関数がファーストクラスオブジェクトだと言う事を良く理解する事

「Pythonでは関数がファーストクラスオブジェクトです」って諳んじる人が多いけど、「意味が分かってる人」は実は少ない。
「ファーストクラスオブジェクト」と言う意味は「データ」あるいは「値」であると言う事。関数自体が関数の返り値になり得るし、変数へ代入も可能だ。
例えば次のような問題を考える。数値(xとy)を2つ取る関数fooがあるとする。xがyより大きい時はx-yを返し、そうじゃない時はx+yを返すような関数を書け、と。
フツーなら恐らくこう書くだろう。

def foo(x, y):
 if x > y:
  return x - y
 else:
  return x + y

でも、「関数がファーストクラスオブジェクトだ」と言う事が「分かる」なら、Pythonではこう「書ける」って事を知っておくべきだ。

from operator import add, sub

def foo(x, y):
 return (sub if x > y else add)(x, y)

まぁ、実の事言うと「こういうスタイルで書け」って言ってるわけじゃない。ただ、「出来る」って事を知っておくべきで、「C言語での常識」で簡単に「難読」って判断しない事。少なくとも「関数がファーストクラスオブジェクトだ」と言う意味は「こういう書き方を許容する」って事なんだ。
当然だよな。
あるいは、「C言語の常識」で「こういう書き方が難読だ」って言う人って、実はC言語の「関数ポインタ」の意味が分かってないか、あるいは「あんま使ってない」って事がバレるだけ、なんだよな(笑)。
逆に言うと、こういう書き方って「C言語の本当のエキスパート」なら否定しない書き方なんだよ・・・いわゆるハッカーとか、何かあった時、こんなカンジで関数ポインタを使う事に躊躇しねぇ連中だからさ(笑)。
いずれにせよ、コードを短く書くのはどっちかっつーと「正義」で、「どう短く書いたろか」って挑戦する事は悪い事じゃないし、そのための武器の一つとして、Pythonでは「関数がファーストクラスオブジェクト」になっている。

2. リストを使いこなそう

まぁ、どの言語でも配列系のデータ構造は重要だ。そしてPythonでは可変長配列的にリストが実装されている。これを徹底的に使おう。
ただし、原則、リストのメソッドの存在は90%くらいは忘れてて構わない。これもC言語的なんだけど、彼らは「リストの破壊的変更」とか躊躇しねぇんだわ。そしてリスト付随のメソッドの殆どは「破壊的変更」の為にある。データを破壊するのは止めよう。それは「モダンなプログラミングの方針」ではないんだ。
元々、リストの破壊的変更用メソッド、ってのは、「プログラムを最適化」する為にある。「最初から使うモンじゃない」って事だな。「早すぎる最適化は諸悪の根源」ってヤツだ。
そしてリストを非破壊的に扱っても必ずしも「効率の悪い」プログラムになるたぁ限らない。また「今書いてるプログラムが非効率かも・・・」とか頭を悩ます必要もないんだ。
そんな事に頭を悩ます必要があったらプロファイラの使い方を覚える事。

Python プロファイラ:
https://docs.python.org/ja/3/library/profile.html

プログラムを書き上げて、「非効率な部分」をこれで探す。大体「貴女が当初見当を付けてた」部分じゃないトコが「非効率」だと言われるだろう(笑)。
繰り返すが「早すぎる最適化は諸悪の根源」だ。
なお、破壊的変更なメソッドを使わなくても、リストのスライスで大方のトコは書けるハズだ。

3. 辞書型を使いこなそう

いわゆる「連想配列」だ。Pythonではこれにお世話になる事が多いし、これが使いこなせれば初心者卒業、っつって良い。
1. の絡みもあるけど、「関数がファーストクラスオブジェクト」って事は辞書の「値」に関数が設定可能だ、って事だ。
と言う事は、例えば関数を書いてて、場合によっては「条件分岐」自体を辞書型で消す事さえ出来る。
1. の例で言うと、例えば

from operator import add, sub

def foo(x, y):
 d = {True: sub ,False: add}
 return d[x > y](x, y)

みたいにして「使える」と言う事だ。
これも何も「突飛なコーディング」ではなく、「データ駆動型プログラミング」と言うテクニックの一種だ。
いずれにせよ、何か条件分岐を見かけた時に「辞書型を使ったトリックに落とし込めないか?」って自問するのは良い訓練になるだろう。

4. Pythonでの最重要構文はリスト内包表記

とにかくリスト内包表記を使いこなそう。いわゆる「反復」の70%~80%はリスト内包表記で解決可能だ。しかもメリットもある。最適化が施されてる為「フツーの反復より速い」。
リスト内包表記を使わないPythonコードなんて「クリープが無いコーヒー」のようなモノだ。
「リスト内包表記が分かりづらい」とか言う意見には耳を貸さない事。大体、「C言語に無い機能だから」言われてるに過ぎない(実際、この機能はHaskellと言う尖った言語から借りてきた機能だ)。
リスト内包表記一本で、コンパウンドデータ(合成データ)への関数のマッピング、及びフィルタリングが出来る。これほど強力な機能を「使わない」のは損だ。
是非とも使いこなそう。

5. Pythonでの最重要関数はfunctools.reduce

functools.reduce:
https://docs.python.org/ja/3/library/functools.h …

これがPythonビルトインの最強関数だ。汎化性能は群を抜いてる。
どういう意味か、っつーとPython組み込みのユーティリティを結構な確率で「書けてしまう」って程強力なんだ。

# reduceでmaxを書く例
from functools import reduce
from operator import gt

def my_max(arg1, arg2, *args, key = None):
 return reduce(lambda y, x: x if (gt if key == None else key)(x, y) \
        else y, (arg2, *args), arg1)

Pythonの大体の「反復」の70~80%はリスト内包表記で書け、残りの20%弱はfunctools.reduceで書けてしまう。どーしても、いわゆる「反復構文」(forとかwhile)が必要になるのは5%前後、ってトコだろう。
それくらい強力なビルトイン構文及び関数をPythonは提供してるんだ。
「使わないと勿体ない」ってわけだな。

とまぁ、「Python初心者脱却の為」の5つのポイントを挙げてみた。
参考にして欲しい。
    • good
    • 1

う~ん、Cのfor文にあたるものがpythonにはなくて


ループ回すのにいきなり 「for ~ in イ夕ラブル」の
お世話になることに、c使いは面食らうかもしれませんね。

for(i=0; i<n; i++) は for i in range(n) :と等価なんだととりあえず写経するか
地道にwhileでループでも出来るけど(^^;

それ以外の制御構文はだいたいCに似てるし、
cの知識では始められないという
ことはないでしょうね。
    • good
    • 0

パイセンたちが何か言ってますが...


C である程度のことが書けるなら、
Python を C とはちょっと文法の違うけど
それでもともかく手続き型言語のひとつ
として使うことはできると思います。

ライブラリを使いこなすには、ある程度
リストやイタレータに慣れなければならないけれど、
No.8 にも書いてあるとおり、諸先輩に
「それは Python じゃねえ」と言われながら、
C もどきで一応動くものは書けるはずです。

そんなことして、いじって遊んでるうちに、
リスト内包表記もたまには使ってみたりして、
便利だと思うようなら Python へ移行してみればいい。
Python とか LISP とかの人って、思想強めな人が
多いものですが、手続き型言語に違いはないのだから
気軽にいじってみれば?
    • good
    • 1

まとめるとこんな感じかな。


① イ夕ラブルまみれのpythonに早くなれた方が良いです。イ夕レー夕のなんたるかを早めに習得するとpythonの理解が早まります。
② cの配列は忘れ、動的配列、辞書、集合等を学び、その使い方を積極的に学ぶべきです。他にもキューとかスタックとか、いろんなデー夕構造が豪華に用意されてます。
③ 例外はC以外ではほぼ当たり前の機能だけど、使い方を意識して習得した方がよいです。Cで定番の戻り値でエラーを判断し分岐というのはC以外の殆どの言語で悪手。早く忘れて下さい(^^;
④オブジェクト指向はゆっくりとやればよいと思います。先ずは出来合いのクラスを使ってその便利さを満喫して欲しい。デー夕構造は全部クラスだし、整数や文字列さえクラスでメソッドが使えることに驚くと思います。

オブジェクトの自作は結構センスと年期が必要で、アプリのオブジェクト指向設計ができるようになるのには数年必要です。いきなりは無理なのでゆっくり試行錯誤を楽しみましょう。
    • good
    • 0

> う~ん、イ夕レー夕はそんなに難しいかな?



いや、個人的には特に難しいとは思ってません。
ただ、例えばPython入門書とかだと「後回し」になってんだよな。
あれだけ広範囲にイテレータが使われていて、もはや「基礎」となってるのに、書籍類で後回しになってる、とか言うのはぶっちゃけ、「頭がおかしい」としか思えない。
要はね・・・そもそも「教科書を書く」前提で、K&Rをモデルにして書くのを「そろそろ止めた方がいい」って話なんです。現行のPythonの実装と「教科書モデル」があからさまに食い違ってる。
結果、あくまで「プログラミング初心者に向けて」だとどうにもおかしな「教育環境」になってる、って話。

> 特にc++ではその有用性を叩きこまれたし

ちなみに、CユーザーとC++ユーザーだとかなりメンタリティが違う、って思ってます。
実は一緒くたにして「C/C++」ってまとめられない。
ぶっちゃけ、Cユーザーは「仕様書さえ読んだことがない」人が多いのにビックリすっけど、C++ユーザーは最新仕様にキャッチアップしよう、って人が多いんで、かなりアティテュードは違うかな。

> まあ、データ構造として、構造体と配列しかないcからの
> 飛躍は大きいと思うけど、python3が沢山のデータ構造のサポートに
> 積極的なのは良いことだと思ってます。積極的に
> アタックして欲しい。

同意。
ただ、「C言語しか知らない」人だとそういう「豊富なデータ型」の使い方を知らんっつーか・・・。
いや、モダンな言語だと「データをとにかく生成して返す」ってのが「プログラミングの基礎だ」って知らんヤツがあまりにも多いのよね。
言い換えると、C言語だとあまりにもデータ型弄るのが面倒くさいんで、そういう言語に慣れてると「データを生成する」ってのが不得手なのよ。
で、やることと言ったら「とにかくprintしろ」となる。マジで。
多分信じられない、って思うだろうけど、例えば某書で、「リストを表示する」ってぇんで次のようなコードが書かれててぶったまげたことがあるんだ。

lst = list(range(10))
for i in lst:
 print(f'{i} ')

いや、ホントだよ(笑)?これは「C言語だと是」なんだけど、Pythonじゃあねぇ・・・・・・(苦笑)。
ホント、こういう「あんまPythonを知らない人に書かれた」入門書ってのが多いんだ。
全部「C言語に於いての手癖」で書かれてる。

> スコープル―ルに関しては、私は特に不満はないです。
> 他の言語がきっちりやりすぎなきがします(特にc#とか)。
> ブロックレベルのスコープが役に立つことは滅多にないので
> 要らないというのが私の持論です。

多分forとかでしょ?
まぁ、通例、いわゆる「スクリプト言語」だと確かにブロックレベルのスコープはない。
ただ、Pythonのglobalとかnonlocalとかの宣言、とかすげぇad-hocだな、とか思って(笑)。なんでローカルで宣言してない変数を「自動で」外側に探しに行く、とかしねぇんだ、と(笑)。
これもPython2.x時代に追加された機能だったと記憶してんだけど、元々、nonlocalとか宣言したいケースとかだと、「どういうわけか」リストやタプルだけはレキシカルスコープが効くんで、そういうデータ型使って「探しに行かせた」りしてたのね。
もうメチャクチャ汚い。宣言も本来Pythonに要らないじゃん、と。
マトモなレキシカルスコープを持たせろよ、と(笑)。
その辺の「基礎設計」とか、ぶっちゃけ、JavaScriptの方が優秀だよな、とか言うのが個人的な感想です。

※: ちなみにCもレキシカルスコープは「きっちり」されてると思う。

for (size_t i = 0; ...)

とか書くと、forループを抜ければiにはアクセス不可となる。
まぁ、好みはあるけど、割に個人的には納得する「動作」かな。

> publicとかprivateとかのアクセス制御が無い点もpythonの
よい所だと思ってます。

同意。っつーか珍しい。
どうしても古典的なOOPから離れられない人だとこの辺嫌うからさ。
    • good
    • 1
この回答へのお礼

回答ありがとうございます。
詳しく書いてありますね。
まだまだ勉強が必要そうです。

お礼日時:2025/02/28 14:57

今気づいたけど


イタレータ→イテレータ
英語の発音はイ夕レータなんだけど、日本でのカナ表記は
伝統的にイテレータなんだよね。そう発音するとnativeに通じないけど(^^;
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

お礼日時:2025/02/28 09:26

う~ん、イ夕レー夕はそんなに難しいかな?


私はcからc++、Lisp、delphi、Java、c#を経由してるので
イ夕レ一夕にはとてもよくなじんでました。
特にc++ではその有用性を叩きこまれたし、
多くの言語がイタレー夕専用構文を取り込んでゆくのを
目のあたりにしてとても便利なものだと思いました。
python3もその自然な流れに乗ったのだと思いました。

まあ、データ構造として、構造体と配列しかないcからの
飛躍は大きいと思うけど、python3が沢山のデータ構造のサポートに
積極的なのは良いことだと思ってます。積極的に
アタックして欲しい。

スコープル―ルに関しては、私は特に不満はないです。
他の言語がきっちりやりすぎなきがします(特にc#とか)。
ブロックレベルのスコープが役に立つことは滅多にないので
要らないというのが私の持論です。
publicとかprivateとかのアクセス制御が無い点もpythonの
よい所だと思ってます。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

お礼日時:2025/02/28 09:25

あんま薦めない。


Windows版はまだ違うみたいだけど、Linux版とかだと最近、要仮想環境になっちまって、簡易性って意味では全然劣った環境になっちまった。
もう、「気楽に扱える」処理系ではなくなってるね。
ニュアンスとしてはJavaに近いプログラミング言語化してる。
「仕事で使うプログラミング言語」になってるわけだ。
まぁ、そういうのがいい、って人もいるだろうけど。

加えると、元来、「C言語しか知らない」人が使いこなせるようなプログラミング言語じゃないんだ。C言語が持ってない概念だらけ、だ。
例えば、Python3.xになってから、設計がイテラブルだらけ、になっている。
しかし、イテラブルっつーのは「遅延評価」って概念が分からないと使えない。しかし、C言語には遅延評価がない。従って「分からない」って人が多い。
結果、「C言語の文法を利用してその簡易版としてPythonを扱う」人が多いわけだけど、それは望ましいスタイルじゃないんだよ。「C言語はプログラミングの基礎」って益体もない事を言ってる人が多いんだけど、実際は「抽象度の高い言語はそれよりも抽象度の低い言語の書き方を全て受け入れる」ってのがホントのトコでさ。そして「使いこなせない」事を最近ではPythonicとか表現してるわけ。
結果、「C言語しか知らん」のに下手な本書いて出版してる例も多い。読むに値しない、っつーか・・・・・・。学習用教材もサイテーなモンばっか、ってなってる。
ぶっちゃけ、「C言語の知識を使ってPythonを使おう」とか言うのなら「止めた方がいい」と思う。素直にJava辺り使ってた方がマシだろ、と言う・・・・・・。
仮に貴女が書いてるように「(C言語に付いては)今でも忘れてしまってもいます」とか言うのがホントとして、「一からプログラミングを学び始めるつもり」ならいいけどね。繰り返すけど「C言語での知識を応用して」とか思うんだったら止めた方がいい。ハッキリ言うけど、「C言語みたいに書いた」Pythonコードってのはとかく冗長で醜いんだ。汚い。そして「C言語しか知らん層は」如何に自分が汚いコードを書く事に慣れてるのか、全く自覚がないし、そういう人が増えている。

それから意外とPythonは学習効率が悪い。一貫してないんだ。マトモなレキシカル・スコープもないし(そこはC言語の方がマシ)、拡張もかなりad-hocだ。要は継ぎ接ぎだ。
「Pythonはシンプルで覚えやすい」って言う人が多いけど、大体こういう事を言う人って「昔の、自分が学んだ時点での」Pythonのイメージで言ってるんだよ。1.xとか2.xの頃のイメージだな。こういう人って3.xになっても「差分」だけ学べばいいんで、まっさらな状態で「今から」Python3.xを学ぶ、って事に関しては想定してない、っつーか・・・・・・。
Python3.xになってから、先程にも書いたけど、イテラブルだらけで、むしろ初見だと「なんでやねん?」とか思う挙動の方が多いんじゃない(笑)?
例えば、リストを生成するrangeってブツがある。2.xの頃は、

>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

ってなカンジで10個の要素があるリストを返してくれた。まぁ、想定の範囲内だよな。
一方、3.xになってからは

>>> range(10)
range(0, 10)

とかなる。「え?」って結果だ。
リスト化するには次のようにしないとならない。

>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

んで、「実装上で・・・」って言い訳がついて回るようになったんだよ(笑)。あるいは「効率を考えて・・・」とか。
こういうのって初心者向け言語、って考えるとあまり良くねぇんだよな。常に「言い訳がついて回る」とかさ(笑)。「実装上・・・」とか言い出す言語は宜しくない。
つまり、Pythonって「分かってる人にはいい」んだけど、一方、プログラミング初心者にも「優しい」のか、と言われると・・・・・・実のトコ、現時点じゃ「そうでもない」としか言えないんだよね。
そういうドラスティックな変化が2.x->3.xの際に起きたわけ。
その辺耐えられるか否か、ってのは「個人の資質による」わけだけれども、少なくとも万人向けじゃないよね。明らかに「人を選ぶ」ワケだからさ。
また、それこそC言語と違って「キチンとした仕様がない」。つまり、ある「おかしく見える」動作があっても、それに対する「キチンとした」根拠がないんだ。大体のケースで、やっぱ「実装上で・・・」って言い訳がついて回るんだ。
例えば、

>>> [i() for i in [lambda: x for x in [1, 2, 3]]]
[3, 3, 3]

果たして、この挙動は「正しい」のか否か。これってドキュメンテーション見ても分かんないんだよ。ぶっちゃけ、リスト内包表記の「最適化」のせいでこうなってるんだけど、直感的には[1, 2, 3]が返ってくるのが「正しそう」なんだけど、いずれにせよ、動作の「根拠」がない。「実装上の選択で・・・」とか言われちゃあ、ユーザーとしてはお手上げだ(笑)。
Pythonってそういう「落とし穴」が結構あるんだよな。

とまぁ、注意点を述べた。個人的には「止めたほうがエエんちゃう?」とか、最近のPythonブームに逆らって思ってるわけなんだけど、別に本気で止めたいわけでもない。
Webを使って学びたい、とか言うのなら、下手な本を買うよか、次の連載記事で学んだ方がいいだろう。ホント、Python入門書ってクソばっかなんで、それならこっちで学んだ方がマシだと思ってる。

Python入門:
https://atmarkit.itmedia.co.jp/ait/subtop/featur …

人に紹介してもらったんだけど、ちと冗長なトコもあるけど、かなり微に入り細に入り書かれてる。また、筆者には「C言語ユーザー」的な偏見がない(ホント「C言語な思い込み」って邪魔なんだ)。非常によく出来た記事になってると思う。
あるいは、本で学びたい、って言う場合、唯一推薦出来る書籍は次の本だけ、だ。

世界標準MIT教科書 Python言語によるプログラミングイントロダクション 第3版:
https://www.kindaikagaku.co.jp/book_list/detail/ …

ちと値段が高めだけど、それだけの価値はあると思う。他の本は要らない、って程だ。

そんなカンジかな。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
長文読ませていただきました。
参考にします。

お礼日時:2025/02/28 07:40

cとpythonの大きな違いは、辞書やリストや集合といった


多くの言語がライブラリとしてサポートしているデー夕構造を
pythonはその文法レベルで直接サポートしている点ですね。

最初はその強力さに眩惑されると思いますが、慣れると複雑なデータ構造を短いコードで表現できかつ操れるようになります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

お礼日時:2025/02/28 07:38

Cは文法もライブラリも原始的なので、今はハードウェアを直接操作する、いわゆる組み込み系という分野で主に活躍しています。



pythonは主に科学技術計算や機械学習のライブラリが充実しているので、その分野でも使われていますが、付属ライブラリやコミュニティ提供のライブラリの出来が良いので、応用範囲は広いです。ゲームやデスクトップアプリ、Webアプリなどが割と手軽に組めます。cに比べ、とても短いコード素早く書けるのが魅力ですね。
また数学関係のライブラリが豊富なんで、数学に親しみたい人にとって天国のような言語です。

文法は取っつきやすいので気軽に始められますが、奥は深くて
パッケージ管理とか結構沼にはまりますね(^^;

pythonは一見インタプリ夕ですが、実はスクリプトを起動すると必要に応じてコンパイラが裏で走ってから実行されるコンパイラ言語です。
なのでイン夕プリ夕言語よりはそこそこ速いです。

anacondaを勧める人は前は多かったですが、今は昔と比べ環境構築が楽になり、環境構築の資料も豊富になったので、構築済み環境のAnacondaを選ぶより、公式のpythonインストーラでインストールして遊ぶことをおすすめします。

最初は付属のREPLで一行単位で動かすことから始めて、
慣れてきたらvscodeとかに移ることをおすすめします。

また、jupyterをインストールして、jupyterLabで
pythonの学習や数学に親しむのも一興かと。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
順序を追ってやってみようと思います。

お礼日時:2025/02/28 07:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A