75555


途中で`break`文を2つ使っており、1つ目のbreak文は問題がないと思うのですが、2つ目のbreak文はfor文を抜けるだけのために使っています。

賢いfor文の抜け方はないでしょうか?

> **問題**
>
> Nが1以上9以下の2つの整数の積で表すことができるか判定を判定せよ。
[code]

    N = 15;
    canDevide = False;
    
    for i in range(10):
      for m in range(10):
        result = i * m
    
        if (N == result):
          canDevide = True
          print(str(i) + " " + str(m))
          break
    
      if (canDevide):
        break
    
    print(canDevide)
    
[/code]


CC BY-SA 4.0
2021-04-28T07:03:04.550
75553
2021-04-28T09:52:40.350
2021-04-28T07:59:37.527
3060
40856
question
python
for文を抜けるだけのbreak文の使い方は合っていますか?


> Nが1以上9以下の2つの整数の積で表すことができるか判定せよ。

以下は「賢いfor文の抜け方」ではなく、二重の for loop を一つにしています。  
※ Walrus operator を使用していますので Python 3.8 以降で動作します

[code]

    N = 15
    canDivide = False
    for i in range(1, 10):
      if N%i == 0 and 0 < (m := N//i) < 10:
        print(f'{i} {m}')
        canDivide = True
        break
    
    print(canDivide)
    
[/code]


CC BY-SA 4.0
2021-04-28T08:05:56.897
75555
2021-04-28T08:16:49.967
2021-04-28T08:16:49.967
75553
answer


> 賢いfor文の抜け方はないでしょうか?

break にフラグを使用したくないという意図であれば for else を使用して

[code]

      #if (canDevide):
      #  break
      else: continue
      break
    
[/code]

とする方法はあります。  
が、わかりやすいかは微妙ですね。


CC BY-SA 4.0
2021-04-28T08:31:41.627
75556
2021-04-28T08:31:41.627
41756
75553
answer


元のままのフラグと `break` でも十分だと思いますが、意味的に無理がなければ関数にして`return`するという手もあります。

[code]

    def canDevide(N):
        for i in range(10):
            for m in range(10):
                result = i * m
    
                if (N == result):
                    canDevide = True
                    print(str(i) + " " + str(m))
                    return True
    
        return False
    
    print(canDevide(15))
    
[/code]


CC BY-SA 4.0
2021-04-28T09:52:40.350
75558
2021-04-28T09:52:40.350
241
75553
answer