• 締切済み

やや長めのpythonのコードの読み方・作り方につ

 pythonではループでもプログラム単位(?)でもその終端を明示しないという決まりになっているようです。インデントがそれを示すということなので。 としますと、このループの先端はどこかとか、このプログラム単位の先頭と終端はどこかについてどのようにして明確に判断できるでしょうか。長いプログラムだと印刷して検討するにしてもかなり長く、ここかな?推測したりしますが、プログラム開発とか変更は推測で作業するのとなじまないように思うのですが。インデントの間違いは5行しかないプログラムでも発生しますが、100行、1000行、10000行となっていくとどうなるのかなと思います。  他の言語も多かれ少なかれそういう面がはありますが、カッコとかreturnとか独特の囲い込みのためエディタで検索することができます。pythonはどのようになっているでしょうか。例えば印刷してみて左端から始まるものはその上から切断されているとみなすのでしょうか。 よろしくお願いします。

  • Python
  • 回答数2
  • ありがとう数2

みんなの回答

noname#259146
noname#259146
回答No.2

>紙に印刷したもので検討する場合で改ページがあると非常につらいものになりそうなのですが。いかがでしょうか。 印刷で改行されると非常につらいものになるのでしたら、A3横やフォントサイズを小さくするなどの工夫で一行の印刷文字数を増やのがよいでしょう。

skmsk1941093
質問者

お礼

回答ありがとうございます。やはりPythonは長いコードにしないようにする、というカルチャなのかなと思います。細かいことはライブラリとかモジュールが全部やってくれるので呼び出して変数を渡すところがしっかりしていればあとはお任せです、が基本ってことなのかなと思います。

noname#259146
noname#259146
回答No.1

すでに行っておられるかもしれませんが、コードを読みやすくするにはコメントをうまく使う。 長い処理は下記を参考にして読みやすくする。 https://note.nkmk.me/python-long-string/ 文法チェックを行う方法が複数ありまので環境にあったものを選び使うのもよいかと思います。

skmsk1941093
質問者

お礼

回答ありがとうございます。紙に印刷したもので検討する場合で改ページがあると非常につらいものになりそうなのですが。いかがでしょうか。

skmsk1941093
質問者

補足

回答ありがとうございます。コメントを使うということですかね。でもコメントは制御の能力がないから最終的な担保になりませんよね。”ここで終わり”と書いてから実は継続していたとかなのですが。

関連するQ&A

  • Pythonプログラムのエラー

    こんにちは。pythonプログラムを勉強しはじめたばかりのものです。 次のプログラムが最後の行の#のところでエラーになってなかなか 解決ができません。アドバイスいただけませんでしょうか。 #! /python30/python # coding:shift_jis import sys, os, urllib, gzip def GetAndGzip(url, out): ''' urlを読み込み、gzipで圧縮してファイルoutに出力 ''' remote = urllib.urlopen(url).read() gzfile = gzip.GzipFile(filename='', mode='web', fileobj=out) gzfile.write(remote) gzfile.colse() #パラメータを抽出 if len(sys.argv) <> 2: print '使い方:python wgetgz.py url' else: url = sys.argv[1] GetAndGzip(url, sys.stdout) #ここでエラーin<module> #ここで投稿すると、インデントがなくなってしまうようです。

  • pythonの編集仕様のいろいろ

    pythonのプログラミングを少し始めているのですが、以下のような問題に直面しました。一番最初にhello world! を表示するものです。 hello.pyを作ってpython hello.py とすると実行するようです。 hello.pyの内容ですが、あるサイト(以下の画像)では、 print "Hello, Wordl!" とありますが、私の環境では動かず、さらにサイトを検索して、 print ( "Hello, Wordl!" ) が正しいとのことで、こちらは問題なく動作しました。 また、このprintコマンドですが、編集画面で左詰めでないとダメで、コマンドの前の空白(インデント)があったら正しく動作しないとのことです。 このようなささいな違い、またプログラム編集上の作法の問題とかを見ると、この言語の習得は難しいように感じてしまいます。アルゴリズムの完全性とか、文法上の問題が完全にクリアになってもなぜが動作しない、という問題に直面しそうなのですが。自分の知らない何かのしきたりに違反しているという状態で、しかもそれが本質的でないように見える言語仕様(先のインデントがダメという問題)というのであれば、後からいろいろ出てきそうなのですが。例えば、”コマンドは第一文字が大文字でなければならない”とかです。数百、数千行のコードを書いたりすると、間違いの可能性のあるところが目に見えないところにいっぱいという感じがするのですが。バグフィックスというのは絶対に絶対に間違いない、と断言してそれでいてうっかりミスが見つかるわけです。”間違っているかもしれないな”じゃバグフィックスできません。 それでいて割と巷間ではpython人気という感じがしているのですが。 pythonのどこがいい、ということなのでしょうか。私が考えている困難を補う効用があるのでしょうか。 私の環境はanaconda 3.5です。バージョン毎にかなり違うのでしょうか。

  • サクラエディタ HOMEで行頭に移動

    サクラエディタにおいて、HOMEは「行頭に移動(折り返し単位)」とあり、HOMEを押しても行頭には移動せずインデント先頭になります。 これをHOMEを押して行頭移動にすることはできないでしょうか。

  • Pythonのコードself多すぎ読み書きしにくい

    Pythonのクラスには通常class:宣言行直下で作成する「クラス変数」と、__init__()メソッド内で作成するかインスタンス作成後にインスタンス名.変数名で追加作成する「インスタンス変数」があります。 Pythonのクラス変数はJavaのクラスでstatic修飾子を付けて宣言したクラス変数と同じで、そのクラスから作成されたインスタンス全てに同じメモリーを割り当てます。 Pythonのインスタンス変数はインスタンスごとにメモリーが割り当てられるので、Javaの普通の変数(フィールド)のように同一クラス内のすべてのメソッドから参照できますが、参照するたびにいちいち「self.」を付けないといけません。 (例 かなり恣意的ですが。。。インデントはOKWAVEが取ってしまうかもしれせん) class Sample: def __init__(self): self.L = [] # Lは数値のリスト def setList(self, L): self.L = L def exe(self, i1, i2): # L[i1]>0かつL[i2]>0のとき、大きい方から小さい方を引いた # 値に、大きい方を小さい方で累乗した値を加える if self.L[i1] > 0 and self.L[i2]: if self.L[i1] > self.L[i2]: return (self.L[i1] - self.L[i2]) + self.L[i1] ** self.L[i2] else: return (self.L[i2] - self.L[i1]) + self.L[i2] ** self.L[i1] イテレーターを使て同じ処理をループする場合はいいのですが、ループで処理できない複雑な処理が続く場合はこのように「self」だらけになり、コーディングミスが多発し、コードが読みにくいものになります。 「self」を省略してインスタンス変数をメソッドから参照し、コードを読みやすいものにする手段はないのでしょうか? どうぞよろしくお願いします。

  • Pythonプログラミングでエラー

    Pythonのプログラムを教科書をみながら勉強しはじめました。 バージョンは3.0.1です。 下記の初歩的なプログラムで#の行でエラーがでて対応方法が わかりません。 アドバイスいただけませんでしょうか。 #! /python30/python # coding:shift_jis ''' 簡単な電卓です。 Usage: mycalc.py n (+-*/) m ''' import sys, operator OP={'+':operator.__add__,\ '-':operator.__sub__,\ '*':operator.__mul__,\ '/':operator.__truediv__,\ } def calc(ls): assert len(ls)==3 #ここでエラー try: op=OP(ls.pop(1)) # 真ん中の文字列をpop,数字のみ残る。 x,y=[float(u) for u in ls] # 残った文字列をfloatに変換 except: print('Err:数字 演算子(+-*/) 数字 の順に引数をセットしてください。') sys.exit() return op(x,y) if __name__=='__main__': print(calc(sys.argv[1:])) #ここでエラー (ここで質問するとTABのインデントがなくなってしまうようです。)

  • 条件を満たすテキストエディタを探しています

    多くの「文章の折り返し機能」を持つテキストエディタは、折り返された文が行の先頭から始まってしまうのが一般的ですよね。 そうではなくて、折り返された文の一部の左端を、文の先頭がインデントされた位置(文の先頭の位置)に補正して表示してくれるようなテキストエディタを探しています。 できれば様々なプログラミング言語の色分けに対応できるとうれしいです。 Microsoftのwordやpowerpointのようなインデント機能や箇条書きに似ている機能ですが、word等のように特殊な文章形式で保存するものを求めているわけではなく、表示する際にこのように表示してくれる純粋なテキストエディタを求めています。

  • Solaris8 でのテキスト印刷について

    Solaris8でテキスト印刷処理を行いたいのですが、以下の処理をコマンドオプションでできないでしょうか? 使用コマンド:lpまたはlpr(実現可能であればどちらでも構いません) 行いたい処理:先頭行を2~3行スキップ,左のカラム半角4文字のインデント できるだけ印刷テキストを編集せずに行いたいと考えています。 よろしくお願いいたします。

  • フリーのテキストエディタ

    C言語によるプログラムを書くための、 Windows98SEで動作するフリーのテキストエディタを探しています。 しばらくnotepad(メモ帳)を使っていたのですが、もう限界です。 コンパイラがエラーを出してくれて、折角行数まで教えてくれているのに、 その行を自動的に探すことが出来ないのです…(^^;; インデントもスペースで整えなきゃいけないですし…。 出来れば、UNIXのMuleみたいな、TABだけでインデントを整えてくれる ようなヤツがあったら嬉しいのですが。 という訳で、良いものが在ったら教えて下さい。

  • readLine()の動作(改行と終端)

    readLine()についてですが。 readLine()が終端時にnullを返すということは、 一行の文字列や、最終行はそのままでは 文字列を読み込めない、と理解していいのでしょうか (書き出すほうで、printlnや改行\nなどを付け足す必要あり)。 また、チャットなどで、サーバーが発言を待つ場合、 while(true){ string=buf.readLine(); mychat.sendall(string); } としますが、 これだと、行の終わりと、発言の終わりが、 区別できなくなってしまいます。 できたら、発言の終わり(終端)を待って、文字列 を作成し、行単位でなく、発言単位で、送信した いのですが。 (nullになるまでループさせ、その間、文字列を +で足して行き、nullを受けたら、送信する、 という方法もありそうですが、もっと簡単に できないでしょうか)。 お願いします。

    • ベストアンサー
    • Java
  • テキストファイルの行数を指定してとばす方法

    Java初心者です。 テキストファイルの中のある1行を読み込むプログラムを作成したいと思っています。その際、毎回先頭から読み込むのでは効率が悪いので指定した行に直接アクセスしたいのですが、その方法がよく分からないので教えていただけませんか? BufferedReaderやLineNumberReaderをループで回すのではなく、ランダムアクセスをすればよいというところまでは分かっているのですが、ランダムアクセスの方法が今ひとつ分かりません。

    • ベストアンサー
    • Java

専門家に質問してみよう