1. ホーム
  2. Python

Pythonの学習における問題点

2022-02-18 19:08:04

<スパン 1. タプルのタプルは不変である

2. print文は自動的に改行を追加する

3. writeとwritelinesの違い:writeは文字列を引数にとり、writelinesは文字列の列を引数にとる

4. 2次元のリストを生成するには?

>>> lst1 = [[0]*5]*5
>>> lst1


>>> lst2 = [[0 for i in range(5)] for j in range(5)
>>> lst2

<スパン 生成された2つの効果は一致しているのでしょうか?一見、整合性があるように見えますが、そうではありません。

>>> lst1[0][0]=1
>>> lst1
[[1, 0, 0, 0, 0, 0], [ 1 , 0, 0, 0, 0], [ 1 , 0, 0, 0, 0], [ <スパン 1
, 0, 0, 0, 0, 0], [ 1 , 0, 0, 0, 0, 0]]


>>> lst2[0][0]=1
>>> lst2
[[1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]

<スパン と見ることができます。 lst1 = [[0]*5]*5 は実際にはメモリを要求する1行だけで、他の4行はその行を参照しているので、代入が行われると各行が変更されます。


<スパン 5. KeyError: 0

一般に、dict_[key]を直接使用し、キーがdict_辞書にない場合です。


6.IOError。[Errno 29] 不正なシーク

fd = open("somefile")

fd.seek(0) # OK

sys.stdin.seek(0) # エラーです。 IOError: [Errno 29] 不正なシーク


7.UnboundLocalError: 代入前にローカル変数 'x' が参照されました。

#! /usr/bin/python

x = 1

def main():
# global x
    x += 1
    print x

if __name__ == "__main__":
    main()

上記のコードでは、ブロック内のグローバル変数に直接 "write reference" (グローバル変数を参照して値を書き込む)ことができないため、タイトルにあるようなエラーが発生します。 <スパン グローバル変数の参照を書きたい場合は、ブロック内でグローバル変数をglobalで宣言する必要があります。 . この理由は、グローバル宣言 x = 1 で、コンパイラが自動的に x の型を int とラベル付けし、それが immutable 型である ( 不変クラス ); で、main() 関数の中で x += 1 とすると値 2 のオブジェクトが再生成されますが、x は main() スコープで宣言されていないので、エラーが報告されることになります。この記事は、Pythonのグローバル変数についてのより詳細な説明です。 http://stackoverflow.com/questions/21456739/unboundlocalerror-local-variable-l-referenced-before-assignment-python .


8.IOError。[Errno 32] 壊れたパイプ

このエラーは、通常、Linuxでパイプ操作を使用した場合に発生します。パイプのもう一方の端の出力セクションが早期に閉じられ、パイプの入力セクションの内容が完全に出力されず、入力セクションが大きく、デフォルトバッファサイズを超えている場合に爆発的に増加します。

例えば、cat test.txt | python test.py | head のようにします。

ここではheadが早く閉じていることが主な原因です。解決策は

<スパン

import signal
signal.signal(signal.SIGPIPE, signal.SIG_DFL)





このエラーは、Hadoop Streaming を書いてローカルでテストした後に報告されたもので、エラーが報告されても、Hadoop で正しく実行することができた。


<スパン 9. 9.辞書の累積カウントを素早く使う: dic[key] = dic.get(key,default) + 1; この方法の利点は、キーがdicの中にあるかどうかを手動で判断する必要がないことです

10. ValueErrorです。(75, '定義されたデータ型に対して値が大きすぎる')

値が表現範囲から外れている、など。

>>> time.gmtime(2**55)
time.struct_time(tm_year=1141709097, tm_mon=6, tm_mday=13, tm_hour=6, 
tm_min=26, tm_sec=8, tm_wday=6, tm_yday=164, tm_isdst=0)

>>> time.gmtime(2**56)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: (75, 'Value too large for defined data type')


例えば、平均値を計算する場合、avg = (x1+x2+... +xn)/n は次のように変換されます。
avg = x1/n + x2/n +... + xn/n

10.AttributeError: 'module' オブジェクトには 'urlparse' という属性がありません。

ファイル "urlanalysis_nb.py", 行 46, in <module>
    ドメイン = urlparse.urlparse(url)[1].
AttributeError: 'module' オブジェクトには 'urlparse' という属性がありません。

インタラクティブなコマンドラインで単独で実行してもエラーにならず、長い間チェックしても問題が見つかりませんでした そこで、新しいコマンドラインを http://lovesoo.org/python-script-error-attributeerror-module-object-has-no-attribute-solve-method.html   ここで問題が発覚したのですが、結局、私の urlanalysis_nb.py スクリプトは、私が書いた urlparse.py ファイルとコンパイルされた urlparse.pyc ファイルがあるディレクトリにあるのです! そこで、この2つのファイルを削除するとOKでした


<スパン 11. Pythonで文字で分割する場合、シングルクォートを使用する方がよい。文字列がユニコードでエンコードされている場合、ダブルクォートを使用するとうまくいかないからである。


<スパン 12. 今日の文章 <スパン スパークプログラム Sparkのプログラムで、文字列を'^A'文字で分割したところ、分割は失敗しましたが、Pythonのプログラムだけでは分割が成功し、午後からチューニングしても原因が分かりませんでした 夕方になってようやく解決策が見つかりました。'^A'と'ⅹx01'は等価なので、'ⅹx01'で成功しましたが、'^A'で失敗した理由がまだ分かっていないのです! (2015/01/20 21:43)


13.UnicodeEncodeError: 'ascii' コーデックは位置 157-163 の文字をエンコードできません: 序数が範囲内ではありません...

この問題はspark-Pythonで発生し、エラーになるコードはstr(val)を呼び出し、Baiduはそれを持っている

インポートシステム

再読み込み(sys)

sys.setdefaultencoding('utf8')

しかし、効果がないまま試したところ、やはりエラーが出たので、代わりに "%s" % val を使ってみたところ、プログラムが正しく実行されました。


<スパン 14. TypeError: 'dict' オブジェクトは呼び出し可能ではありません。

このエラーは、Pythonで、辞書のフェッチ操作をd(key)と書いたときに、実際にはd[key]である場合によく報告されます。

また、spark-Pythonでは、あるキーが辞書に属しているかどうかを判断するために、if key in d : ... と書くとこれもエラーとなり、if key in d.keys() : ... と書くとエラーとならない。

15. 変数の初期化宣言は、特にリストのようなデータ構造でも作らないようにしよう

arr_score = arr_label = [], arr_score と arr_label は同じ場所を指す, 上記の#4と多少似ている!

一行で初期化するには、次のようにします。 var1, var2 = [0] * 2


<スパン 16. <スパン 文字列の値を変更しようとした(結果は "TypeError: 'str' object does not support item assignment" となる)。

文字列は不変のデータ型です

<スパン

>>> s = "abcdef"
>>> s[3]
'd'
>>> s[3] = 'q'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment





<スパン 17. reduce とラムダ式を組み合わせた場合の問題点

a = [1, 6, 2]

reduce(lambda x,y: x+y, a)

<スパン

b = [[1,3], [2,6], [2, 5]]

reduce(lambda x,y:x[1]*x[0]+y[1]*y[0], b)

ここでは、aは正常に実行されますが、bはエラーを報告します。

トレースバック (最も最近の呼び出し):

  ファイル "<stdin>", 行 1, in <module>

  ファイル "<stdin>", 行 1, in <lambda>

TypeError: 'int' オブジェクトには '__getitem__' という属性がありません。

このエラーは、reduce操作で入力と出力が同じ型であることが要求されるためです!


18.printユニコード中国語エラー

UnicodeEncodeError: 'ascii' codec can't encode characters in position 17-22: ordinal not in range(128)

The solution is.

print ch #fails
print ch.encode('ascii', 'ignore')
It is empirically proven that using

print ch.encode('utf8', 'ignore')
Also works! Note that setting utf8 in python does not use utf-8

print ch #fails
print ch.encode('ascii', 'ignore')

It is empirically proven that using

print ch.encode('utf8', 'ignore')

Also works! Note that setting utf8 in python does not use utf-8


http://stackoverflow.com/questions/5141559/unicodeencodeerror-ascii-codec-cant-encode-character-u-xef-in-position-0









標準出力への直接出力は正しく、ファイルへのリダイレクトはエラーが報告されます。

トレースバック (最も最近の呼び出し):
  ファイル "bin/select_ad_item_info.py", 行 36, in <module>
    アイテムID、販売者ID、アイテム名、価格、販売数を表示します。
UnicodeEncodeError: 'ascii' コーデックはポジション 0-5 の文字をエンコードできません: ordinal not in range(128)

<スパン これを追加する

再読み込み(sys)
sys.setdefaultencoding('utf8')

を実行すると、ファイルに正しくリダイレクトできるようになります。


<スパン 19 . pythonの関数の引数は、immutableオブジェクトであれば値で渡され、どうしても参照渡しをしたい場合は、引数を返します。