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
相关产品推荐
相关产品推荐

