2017-01-20 8 views
-1

ここで私の質問は、4つのURLを印刷して何が期待されているかを示していますが、whileをwhile url == True:に設定すると、1つのURLのみが印刷されるため、そうではありません!=なしは等しい==真== Trueと!= Noneの違いは何ですか?

+5

'偽!= NONE' –

+0

' >>>偽!= NONE' ---> 'true'を – miradulo

+0

あなたは文字列に' 'get_next_target(ページ)でURLを上書きしている、それはないですequal 'True' –

答えて

1

この種のセンチネルを返すのは、最初は非常に良いデザインとはみなされないことに注意してください。 get_next_targetは、ターゲットを返すべきであり、それ以外は何もしないでください(今のところ、次のターゲットを見つけるために必要な状態は無視されます)。エラーが発生した場合は、例外を発生させます。この場合、別のターゲットの不足は実際にはエラーではありませんが、わかるように、それは反復の終了を知らせます。すでに例外があります:StopIteration

def get_next_target(page): 
    start_link = page.find('<a href="') 

    if start_link == -1: 
     raise StopIteration 

    end_link = page.find('">', start_link) 
    url = page[start_link + 9 : end_link] 
    return url, end_link 

def print_all_links(page): 

    while True: 
     try: 
      url, endpos = get_next_target(page) 
      print url 
      page = page[endpos:] 
     except StopIteration: 
      break 

我々はページを解析するために必要な状態を公開しないこと、しかし、特定のページからのリンクを戻すために、より良いイテレータを書くことができます。

def get_targets(page): 
    while True: 
     start_link = page.find('<a href="') 
     if start_link == -1: 
      break 
     end_link = page.find('">', start_link) 
     yield page[start_link + 9:end_link] 

def print_all_links(page): 
    for url in get_targets(page): 
     print url 
0

どうすればurl == "http://stackoverflow.com"?その後、それはTrueと等しくないので、中断します。しかしNoneと等しくないなので、それをチェックするとループが続きます。

0

あなたの代わりに、必要に応じて、それがうまくいく

if url: 

または

if bool(url) == True: 

を言っている場合。 urlはTrueのみです。最初の反復後は文字列で、"anystring" != Trueですが、bool("anystring")で、 "anystring"は空の文字列ではなく、Trueです。

関連する問題