2017-10-02 23 views
-1

プログラムを書くときに何か問題があり、誰かが助けてくれるのだろうと思っていました。これまでのコードはこれまでのところです:他の関数のForループ内で関数を呼び出す際の問題

def parseExtension(filename): 

    periodPosition = filename.find(".") 
    extension = (filename[periodPosition + 1:]) 
    return extension 


def fileExtensionExists(fileList, fileExtension): 
    for fileName in fileList: 
     return(parseExtension(fileList)) 
    return 

print(fileExtensionExists(["python.exe", "assignment5.docx", 
"assignment4.py", "shortcuts.docx", "geographyhw1.txt"], "py")) 

プログラムは2つの機能で構成されています。最初に表示される関数は、各ファイルをファイルリストから取り出し、ピリオドを見つけて、その後に来るもの、別名拡張子を返します。

第2の関数(main関数)は、どこに問題があるのですか? 2番目の関数は、forループの最初の関数を呼び出して、リスト内のすべてのファイルの拡張子を受け取り、返されたすべての拡張子を関数内の2番目のハードコーディングされたパラメータ "py"または "fileExtension"と比較すると仮定します。リストに「py」ファイルがある場合、関数はtrueを返す必要があります。そうでない場合はfalseを返します。

+0

何が問題なのですか? – Harry

+0

最初に返された拡張子を2番目のハードコードされたパラメータと比較します。 – Goyo

答えて

0

まず、parseExtension関数呼び出しでfileNameを指定する必要があります。しかし、あなたはもう少し問題があります。私はあなたが欲しいと思うのはこれです。

def parseExtension(filename): 
    periodPosition = filename.find(".") 
    extension = (filename[periodPosition + 1:]) 
    return extension 


def fileExtensionExists(fileList, fileExtension): 
    for fileName in fileList: 
     if parseExtension(fileName) == fileExtension: 
      return True 
    return False 

my_files = ["python.exe", "assignment5.docx", "assignment4.py", 
      "shortcuts.docx", "geographyhw1.txt"] 

print(fileExtensionExists(my_files, "py")) 
+0

編集:リスト内の最初の要素に対してのみparseExtensionが実行されるため、falseが返され続けます。ファイルを.pyに変更するとtrueを返します。 trueまたはfalseを返す前に、リストのすべての要素をforループで実行するにはどうすればよいでしょうか?それとも真実を受け取るまで実行していますか? – Millzy

+0

これは起こりません。 'fileExtensionExists'に与えた最初の引数がリストであれば、そのリストのすべての要素に対して' parseExtension'を呼び出します。 'parseExtension'の出力は' fileExtension'と比較され、同じ場合、 'fileExtensionExists'関数は直ちに' True'を返します。最後の要素の後に返されていない場合、関数は 'False'を返します。ところで、ダンカンが分割についての答えで指摘したことは正しいです。そのようにしてコードを改善してみてください –

0

あなたのforループは何もしません:それは最初returnのリストから最初の要素fileExtensionExists終了は、関数を終了return

1

に会った後、それはreturn文の後の機能の実行を継続しません返します。

リストにあなたの結果を構築し、その後forループの終了後にそれらを返すか、一度に一つそれらを返すためyieldを使用します(しかし、あなたはループを使用するか、またはからlistを構築する必要があるのどちらか結果)。

def fileExtensionExists(fileList, fileExtension): 
    extensions = [] 
    for fileName in fileList: 
     extensions.append(parseExtension(fileList)) 
    return extensions 

または

def fileExtensionExists(fileList, fileExtension): 
    for fileName in fileList: 
     yield parseExtension(fileList) 

print(list(fileExtensionExists(["python.exe", "assignment5.docx", 
    "assignment4.py", "shortcuts.docx", "geographyhw1.txt"], "py"))) 

ところで、これは学校の運動でない限り、自分を支持を行うと、拡張をオフに分割するために使用os.path.splitext()を使用し、ここで再発明ホイールに必要は、本当にありませんPythonには多くのホイールが付属しています。 splitext()には延長の前にピリオドが含まれていますので、".py"を渡したいと思いますが、いずれの場合でも通常はコードをきれいにします。

+0

は、私のコードが完全ではなかったという質問に指定しておくべきです、私はちょうど立ち往生していて、2番目の機能をどこに置くべきかを知りませんでした。はい、これは学校の仕事のためです。 – Millzy

関連する問題