4

csvファイルを読み取り、そこから最初の列を抽出する簡単な関数があります。

import csv 

def pass_username():
    with open('test.csv', 'r') as csvfile:
        spamreader = csv.reader(csvfile, delimiter=',')
        for row in spamreader:
            return row[0]

この関数を次のように呼び出すと:

a = pass_username()
print a 

これは最初の要素のみを印刷します。returnただし、 wordをprintasに置き換えprint row[0]て関数を呼び出すと、pass_username()すべての要素が出力されます。その関数を変数に割り当てたいので、returnを使用します。それを修正する方法は?

test.csvの内容:

"test@gmail.com","rockon"
"hello@gmail.com","hey"
"hithere@gmail.com","ok"
"hellosir@gmail.com","password"
4

3 に答える 3

5

他の回答者の方もおっしゃっていましたが、結果をリストにまとめて返すことができます。ただし、別の方法として、 which を置き換えるreturnyield、関数が反復可能な型オブジェクトを返します。このオブジェクトは、後で反復処理することを決定したときに生成するアイテムを生成します (おそらく for ループを使用)。

参照: Python で "yield" キーワードは何をしますか?

コードでそれを使用する方法は次のとおりです。

import csv 

def pass_username():
    with open('test.csv', 'r') as csvfile:
        spamreader = csv.reader(csvfile, delimiter=',')
        for row in spamreader:
            yield row[0]

username_generator = pass_username()

# iterate through the usernames with a for loop
for name in username_generator:
    print name
# call the list constructor which causes it to produce all of the names
print list(pass_username())

ユーザー名は必要に応じて作成されることに注意してください。たとえば、username_generator.next()すべてのユーザー名を作成しなくても、次のユーザー名を作成することができます。

于 2013-01-03T03:48:16.883 に答える
2

を呼び出すと、関数は自動的に終了するため、ステートメントreturnに到達した後は何も処理しません。return

append結果をリストにしてからリストにしたいかもしれませんreturn

あなたの場合、 a を使用したい場合もあるlist comprehensionので、 for ループの代わりにこれを使用します。

return [row[0] for row in spamreader]
于 2013-01-03T03:45:41.773 に答える
1

関数から戻ることができるのは 1 回だけです。戻ってきたら終わりです。関数が初めて戻ったときに終了するため、1 つの値のみが返されます。

すべての値を返したい場合は、それらをリストに累積してリストを返します。

于 2013-01-03T03:44:39.843 に答える