You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python使用turtle绘制素数矩形报NoneType不可迭代错误如何解决

错误定位

报错指向if number in twinPrimes:行,核心原因是twinPrimes的值为None,无法执行in成员判断,根本问题出在count_twinprime函数的实现逻辑和返回值问题:

  • 首先count_twinprime函数没有写return语句,Python函数默认返回None,所以赋值给twinPrimes的就是None
  • 其次该函数当前只做了孪生素数对的计数,你实际需要的是所有属于孪生素数对的整数集合,而不是对数的计数
  • 额外还存在多处语法、逻辑、变量名错误会导致后续运行报错:
    • 没有实现is_prime素数判断函数
    • count_twinprime函数缩进错误,内部代码没有正确缩进
    • 变量名拼写错误:后续判断用的是twinPrimes,但你有一行赋值给了twinPrime
    • drawRectangle函数参数接收的是text,但内部写数字用了未在函数内定义的number变量
    • 代码里混了无意义的Question 6:这类非注释文本,会直接报语法错误

修复步骤

1. 先实现基础的素数判断函数

def is_prime(n):
    if n <= 1:
        return False
    if n == 2:
        return True
    if n % 2 == 0:
        return False
    for i in range(3, int(n**0.5) + 1, 2):
        if n % i == 0:
            return False
    return True

2. 重写孪生素数获取函数,返回所有符合要求的数的集合

def get_twin_primes(UL, max_number):
    twin_set = set()
    for a in range(UL, max_number + 1):
        b = a + 2
        if is_prime(a) and is_prime(b):
            # 两个数都属于孪生素数对,加入集合
            twin_set.add(a)
            twin_set.add(b)
    print("Number of twin primes are: ", len(twin_set))
    print('Q2')
    return twin_set

3. 修复drawRectangle函数的变量引用问题

def drawRectangle(tObj, size, text, color):
   tObj.penup()
   tObj.forward(size//2)
   tObj.color(color)
   # 用传入的text参数,不要用外部的number
   tObj.write(text, align='center', font=("Arial", 8, "normal"))
   tObj.forward(-size//2)
   tObj.pendown()
   tObj.color('black')
   for side in range(4):
       tObj.forward(size)
       tObj.left(90)

4. 修正主逻辑里的变量名、缩进、无效文本问题

  • 删掉代码中非注释的Question 6:文本,改成注释# Question 6:
  • 统一变量名,调用get_twin_primes赋值给twinPrimes
  • 修正所有函数的缩进错误,调整单元格大小适配屏幕显示范围

修复后完整可运行代码

import turtle

def is_prime(n):
    if n <= 1:
        return False
    if n == 2:
        return True
    if n % 2 == 0:
        return False
    for i in range(3, int(n**0.5) + 1, 2):
        if n % i == 0:
            return False
    return True

def get_twin_primes(UL, max_number):
    twin_set = set()
    for a in range(UL, max_number + 1):
        b = a + 2
        if is_prime(a) and is_prime(b):
            twin_set.add(a)
            twin_set.add(b)
    print("Number of twin primes are: ", len(twin_set))
    print('Q2')
    return twin_set

def drawRectangle(tObj, size, text, color):
   tObj.penup()
   tObj.forward(size//2)
   tObj.color(color)
   tObj.write(text, align='center', font=("Arial", 8, "normal"))
   tObj.forward(-size//2)
   tObj.pendown()
   tObj.color('black')
   for side in range(4):
       tObj.forward(size)
       tObj.left(90)

# 基础参数配置
UL = 4686 
numRows = 33
numCols = 51
max_number = UL + numRows*numCols - 1
numbers = [ list(range(UL + (row *numCols), UL + (row*numCols) + numCols)) for row in range(numRows)]

turtle.tracer(0,0)
t = turtle.Turtle()

## Question 2:
twinPrimes = get_twin_primes(UL, max_number)

## Question 6:
print("Q6:\tSee rectangle of ints showing primes & twin primes\n")

size = 15
number = UL

for row in range(numRows):
   for col in range(numCols):
      if number in twinPrimes:
         color = 'red'
      elif is_prime(number):
            color = 'blue'
      else:
         color = 'black'
      drawRectangle(t, size, number, color)
      t.forward(size)
      number += 1
   t.penup()
   t.setx(0)
   t.right(90)
   t.forward(size)
   t.left(90)
   t.pendown()

t.hideturtle()
turtle.update()
turtle.done()

内容的提问来源于stack exchange,提问作者Betty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 20:06:00