-1

以下に示すのは、リストから値を読み取り、それぞれを二乗した後にすべての値の合計を取得することになっている Python コードです。

def squareEach(nums):
    for i in nums[:-1]:
        s=nums[i]*nums[i]
        nums[i]=s


def sums(num):
    sum1=1
    for i in num[:-1]:
        sum1=sum1+num[i]
    return sum1


def toNumbers(strlist):
    for i in range(len(strlist)):
        strlist[i]=int(strlist[i])

file=raw_input("enter a filename: ")
openf=open(file,'w')
openf.write("1 2 3 4 5 6 7 8 9 10")
openf=open(file,'r')


s=''
for i in openf:
    s=i
s=string.split(s)

for i in range(len(s)):
    s[i]=int(i)
squareEach(s)
s=sums(s)
print s

これはプログラムであり、エラーが発生しています。なんで?

4

2 に答える 2

2

Python for ループは、リストの要素 (インデックスではない) を反復処理します。

for i in [1, 2, 4]:
   print i

# Prints 1, 2 and 4

各要素のインデックスを操作して、既存のものを変更する必要があります。

def squareEach(nums):
    for i in range(len(nums)):
        nums[i] = nums[i]*nums[i]

代わりに新しいリストを作成する関数を作成しますが:

def squareEach(nums):
    return [n**2 for n in nums]
于 2013-04-05T01:40:26.010 に答える
0

コードには多くの問題があります。基本を確実に理解するために、さらにいくつかの Python チュートリアルを読むことをお勧めします。

file=raw_input("enter a filename: ")

fileはビルトインであり、ビルトインを再定義することは悪い習慣と見なされています。標準的な規則では、名前の末尾にアンダースコアを付けます (例: ) file_

s=''
for i in openf:
    s=i

これは単に s をファイルの最後の行に割り当てます。あなたが意図したのはs = openf.read()、ファイルの内容全体を提供する です。

for i in range(len(s)):
    s[i]=int(i)

これにより、s の内容が一連の整数に割り当てられ、ファイルから読み取ったものはすべて完全に破棄されます。あなたがおそらく意味していたのはs = map(int, s). mapmap の使用はやや物議をかもしていることに注意してください。この場合、バージョンが短くて簡単であるにもかかわらず、リスト内包表記を好む人もいます。

for i in nums[:-1]:

これは、リストの最後の番号を除くすべてを繰り返します。

for i in nums[:-1]:
    s=nums[i]*nums[i]
    nums[i]=s

前述のスライスの問題に加えて、インデックスではなく、リスト内の値を反復処理しています。あなたがやろうとしていることを書く最も慣用的な方法は、

nums[:] = [x*x for x in nums]

PS スタック オーバーフローに質問を投稿するには、ガイドラインをお読みください。

于 2013-04-05T01:45:58.093 に答える