2017-11-16 17 views
0

私は関数の学習を始めたばかりですが、基本的なことは理解していますが、より複雑なスクリプト(以下など)で呼び出す方法はわかりません。Python - 複数の関数を呼び出す(未解決の参照)。グローバル変数を使用する場合

以下のスクリプト例は、MySQLデータベースからフットボール結果を取り出し、CSVに抽出し、CSVからインポートしてHTMLテーブルに配置し、電子メールで送信しようとしています。レポートのテーブルに私が午前問題私は、各関数の出力(例えば、プレミアリーグ、リーグ1、リーグ2)をコンパイルする必要があるということです - 私が使用して達成「レポート」:

参加している
report = "" 
report += htmlpremleague 
report += "<br><br>" 
report += htmlleagueone 
report += "<br><br>" 
return report 

私はHTMLテーブルとして1つの電子メールですべての結果を送信することができます。私が抱えている問題は、「レポート」がHTMLの場所を特定できないということです。 'htmlpremleague'は関数内にあるためです。しかし、それだけでなく、その機能に他のものがあるので、単にそれを"report += premier_league()"に置き換えることはできません。理想的には、(a)それを学ぶのは楽しいから機能を働かせたいのですが! (b)それぞれのリーグをそれぞれ単独で運営することができるのはクールだ。プレミアリーグでのみレポートを生成する。以下のサンプルスクリプトはうまく動作しますが、これはレポートのHTML部分がグローバルで機能の外にあるためです。理想的には私はそれらを内側にしたいので、私は上記を達成することができます。

私はここに来て、ガイドラインに固執しようとしましたが、何か間違ったことがあった場合は教えてください。繰り返すには、所望の出力は、すべてがコール可能な関数内にあることである。代わりに、私は 'レポート' /各テーブルをグローバル変数として配置しますか?

def league_one(): 

    query = "SELECT footballteam as ftt, goals, points FROM 
    footballdbl_league_one plfdb ORDER BY point desc" 
    leagueonecursor.execute(query) 
    leagueonerows = leagueonecursor.fetchall() 


    with open('league_one.csv', 'wb') as file2: 
     wr = csv.writer(file2, quoting=csv.QUOTE_ALL) 
     wr.writerow(["Team", "Goals", "Points"]) 
     wr.writerows(leagueonerows) 
     print ("csv2 created") 

     textleagueone = """ 
     """ 
     htmlleagueone = """ 
     <html><body><p><u><h3><b>Highest Run Time</b></h3></u></p> 
     {table2} 
     <br><br> 
     </body></html> 
     """ 

     with open('league_one.csv') as input_file2: 
      reader = csv.reader(input_file2) 
      leagueonereader = list(reader) 

      textleagueone = 
      textleagueone.format(table2=tabulate(leagueonereader, 
      headers="firstrow", tablefmt="grid")) 
      htmlleagueone = 
      htmlleagueone.format(table2=tabulate(leagueonereader, 
      headers="firstrow", tablefmt="html")) 

/メイン例サッカースクリプト:

con = pymysql.connect(user='',password='',host='',database='') 
cursor = con.cursor() 

# probably not necessary 
premleaguecursor = con.cursor() 
leagueonecursor = con.cursor() 

def premier_league(): 
    query = "SELECT footballteam as ftt, goals, points FROM footballdbl_prem_league plfdb ORDER BY point desc" 
    premleaguecursor.execute(query) 
    premleaguerows = premleaguecursor.fetchall() 

    with open('prem_league.csv', 'wb') as file1: 
     wr = csv.writer(file1, quoting=csv.QUOTE_ALL) 
     wr.writerow(["Team", "Goals", "Points"]) 
     wr.writerows(premleaguerows) 
     print ("premier league csv created") 

textpremleague = """ 
""" 

htmlpremleague = """ 
<html><body><p><font size="+1"><u><h3><b>Premier League</b></h3></u></font></p> 
{table1} 
</body></html> 
    """ 

with open('prem_league.csv') as input_file1: 
    reader = csv.reader(input_file1) 
    premleaguereader = list(reader) 

textpremleague = textpremleague.format(table1=tabulate(premleaguereader, headers="firstrow", tablefmt="grid")) 
htmlpremleague = htmlpremleague.format(table1=tabulate(premleaguereader, headers="firstrow", tablefmt="html")) 

def league_one(): 

    query = "SELECT footballteam as ftt, goals, points FROM footballdbl_league_one plfdb ORDER BY point desc" 
    leagueonecursor.execute(query) 
    leagueonerows = leagueonecursor.fetchall() 


    with open('league_one.csv', 'wb') as file2: 
     wr = csv.writer(file2, quoting=csv.QUOTE_ALL) 
     wr.writerow(["Team", "Goals", "Points"]) 
     wr.writerows(leagueonerows) 
     print ("csv2 created") 

textleagueone = """ 
""" 

htmlleagueone = """ 
<html><body><p><u><h3><b>Highest Run Time</b></h3></u></p> 
{table2} 
<br><br> 
</body></html> 
""" 

with open('league_one.csv') as input_file2: 
    reader = csv.reader(input_file2) 
    leagueonereader = list(reader) 

textleagueone = textleagueone.format(table2=tabulate(leagueonereader, headers="firstrow", tablefmt="grid")) 
htmlleagueone = htmlleagueone.format(table2=tabulate(leagueonereader, headers="firstrow", tablefmt="html")) 

# def league_two(): 

# def league_three(): 

def report(): 
    report = "" 
    report += htmlpremleague 
    report += "<br><br>" 
    report += htmlleagueone 
    report += "<br><br>" 
    return report 


def send_email(): 

    report() 
    me = '' 
    password = '' 
    server = '' 
    you = '' 

    message = MIMEMultipart(
     "alternative", None, [MIMEText(report, 'html')]) 

    message['Subject'] = "FOOTBALL REPORT" 
    message['From'] = me 
    message['To'] = you 
    server = smtplib.SMTP(server) 
    server.ehlo() 
    server.starttls() 
    server.login(me, password) 
    server.sendmail(me, you, message.as_string()) 
    server.quit() 

def main(): 
    premier_league() 
    league_one() 
    report() 
    send_email() 
+0

質問 - 少し長いけれども - 多分代わりにすべてのコードを貼り付けるの小さなexapleを構築 - 、最小完全、かつ検証例を作成する[方法を参照してください](https://stackoverflow.com/help/mcve) –

答えて

0

単にそれにあなたのdefに必要なデータを提供する - 私はリストとしてそれを行うことを選択し、あなたもseraratelyこのdef report2(myOne, myTwo): ...ようにそれを渡すことができ、それをreport2(one,two)と呼びましょう。それにはグローバルを使う必要はありません。

def leageOne(): 
    # do stuff 
    stuff = "MyLeageOneResult" 
    return stuff 

def leageTwo(): 
    # do otherstuff 
    otherstuff = "MyOtherResult" 
    return otherstuff 

def report(myInputList): 
    return '<br/>'.join(myInputList) 


one = leageOne() 
two = leageTwo() 

email = report([one , two]) 

print email 

出力:詳細の多くが付いて

MyLeageOneResult<br/>MyOtherResult 
関連する問題