Python 初心者がよく犯すいくつかの間違いのまとめ

Y2J
リリース: 2017-04-20 09:11:02
オリジナル
1811 人が閲覧しました

Python 言語にはいくつかの小さな落とし穴があり、初心者が注意しないと特に混乱して間違いを犯しやすくなります。以下にそのいくつかについて詳しく説明します。初心者に役立つことを願っています。必要な場合は、以下を参照してください。

はじめに

この記事では、主に Python を学習している初心者が犯しやすいいくつかの間違いをまとめています。以下で詳しく紹介します。

1. i+=1 は ++i と等しくありません

初心者が Python 言語についてあまり知識がなく、C++ と Java の言語背景を持っている場合、混同しやすいです + +i と i+=1

まず小さな例を見てみましょう:


i=0
mylist=[1,2,3,4,5,6]
while i <len(mylist):
 print(mylist[i])
 ++i
ログイン後にコピー

このコードはループ出力であり、i は +1 を維持します。実際には、そうではありません。Python インタープリターは ++i を +(+i) として操作するため、コードは常に 1 を出力します。その中で、+ は正の数の記号を意味し、-i も同様です+(+i) .其中+表示是正数符号,对于--i也是类似的.


print(+1)
>>>1
print(++1)
>>>1
print(+++1)
>>>1
ログイン後にコピー

这下明白了++i虽然在Python语法是合法的,但是并不是我们理解的自增的操作.

二、分清楚==和is的用法

在判断字符串是否相等的时候,初学者特别会弄混is和==,这样的结果是程序在不同的情况下表现不同:

比如先看一个简单的例子:


a=&#39;Hi&#39;
b=&#39;Hi&#39;
print(a is b)
>>>True
print(a==b)
>>>True #看起来is和==好像是一样的
ログイン後にコピー

我们再看第二个例子:


str1=&#39;Wo shi yi ge chi huo&#39;
str2=&#39;Wo shi yi ge chi huo&#39;
print(str1 is str2)
>>>False#is的结果是False
print(str1==str2)
>>>True #==的结果为True,看二者不一样了吧
ログイン後にコピー

第三个例子


str3=&#39;string&#39;
str4=&#39;&#39;.join([&#39;s&#39;,&#39;t&#39;,&#39;r&#39;,&#39;i&#39;,&#39;n&#39;,&#39;g&#39;])
print(str3)
>>>string
print(str3 is str4)
>>>False #is的结果是False
print(str3==str4)
>>>True #==的结果为True,看二者不一样了吧
ログイン後にコピー

这就是很容易混淆初学者的地方,感觉很奇怪,为什么有的时候is和==输出相同,有的时候不同呢.好我们来一探究竟:

我们用内置的id()

str1,str2,str3=&#39;test&#39;,&#39;string&#39;,&#39;connection&#39;
print(str1+str2+str3)
>>>test string connection
ログイン後にコピー

これで、++i は Python 構文では正当ですが、私たちが理解しているように

incrementPython 初心者がよく犯すいくつかの間違いのまとめ の演算ではないことがわかりました。 .

2. == と is の使用法を明確に区別する 文字列が等しいかどうかを判断するとき、特に初心者は is と == を混同し、その結果、プログラムは状況によって異なる動作をします。たとえば、最初に簡単な例を見てみましょう:

str1,str2,str3=&#39;test &#39;,&#39;string &#39;,&#39;connection&#39;
print(&#39;&#39;.join([str1,str2,str3]))
>>>test string connection
ログイン後にコピー
2 番目の例を見てみましょう:

long_str_list=[&#39;This is a long string&#39; for n in range(1,100000)]
ログイン後にコピー

3 番目の例


for i in range(3):
 print(&#39;Loop %d&#39;%i)
else:
 print(&#39;Else block&#39;)
>>>Loop 0
>>>Loop 1
>>>Loop 2
>>>Else block
ログイン後にコピー

混乱させる初心者の皆さん、奇妙に感じますが、なぜ is と == の出力が同じである場合もあれば、異なる場合もあります。調べてみましょう: 組み込みの id() 関数を使用します。はオブジェクトのメモリを返すために使用されます。アドレスは確認後に明らかになります。


は、2 つのオブジェクトの

メモリ空間

が同じであるかどうかを比較するために使用されます。
==

は 2 つのオブジェクト

の内容が等しいかどうかの比較です。

3. 文字列、特に大規模な文字列を接続するには、+ の代わりに join を使用するのが最善です。

Python の文字列は他の言語とは少し異なり、一度作成すると変更できません。この機能は Python の文字列連結の効率に直接影響します。 .文字列を連結するには + を使用します:


rrreee

    文字列を接続するには join を使用します
  • rrreee
  • ただし、大規模な文字列を接続する場合、たとえば、約100,000 個の文字列がある場合、結合方法ははるかに効率的になります (100 倍も異なります)。たとえば、次の 100,000 個の文字列接続です。
  • rrreee
  • その理由は、文字列を接続するためです: S1+S2+S3+... .+SN では、文字列は不変オブジェクトであるため、実行後に新しいメモリを申請する必要があります。この場合、N 個の文字列を接続する過程で、中間結果が生成されるたびに、N-1 個の中間結果が生成されます。生成されると、新しいメモリを適用する必要があります。これは実行効率に重大な影響を及ぼします。

    結合はメモリ全体に一度に適用され、文字列内の各要素がメモリにコピーされます。
したがって、文字列の連結、

特に大規模な文字列処理の場合は、joinを使用するのが最善です

🎜🎜4. forループとwhileループの後にelseブロックを書かないでください🎜🎜🎜🎜Pythonには、次の機能があります。多くのプログラミング言語はサポートしていません。つまり、ループ内で記述できます。else ブロックはステートメント ブロックの直後に記述します。例: 🎜🎜🎜🎜rrreee🎜🎜🎜この else ブロックは、ループ全体が実行された🎜直後に実行されます。もしそうなら、なぜそれが else と呼ばれるのでしょうか?と呼んでみませんか? if/else ステートメントの else は、前の if ブロックが実行されない場合は、else ブロックが実行されることを意味します。 🎜🎜🎜🎜この構造の else の意味は、前の try ブロックが失敗しなかった場合に else ブロックを実行することです。 🎜🎜🎜🎜try/finally も非常に直感的です。つまり、前の try ブロックを実行した後は、何があっても、finally ブロックが常に実行されます。 🎜🎜🎜🎜ここで、Python を初めて使用するプログラマは、for/else 構造の else ブロックを次のように理解するかもしれません: 🎜ループが正常に実行されない場合は、else ブロックを実行します🎜。 🎜

実際には、その逆です。 ループ内で Break ステートメントを使用して早期に抜け出すと、プログラムは else ブロックを実行しなくなります。これは、for/else に慣れていない人にとっては少し混乱します。コードを読む人は非常に混乱してしまいます。

概要

以上がPython 初心者がよく犯すいくつかの間違いのまとめの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート