Python 第二十五节 常用练习问题(三)
前言
本文展示了多个Python编程练习案例,包括数字求和、循环打印、阶乘计算、完全平方数判断、斐波那契数列、九九乘法表和正方形打印等。主要涉及循环结构(for/while)、递归函数、数学运算等基础编程技巧。其中包含数字处理(如计算指定范围内数字总和和偶数和)、图形打印(实心和空心正方形)以及特殊数字判断(自恋数字)等多个实用案例,适合Python初学者练习基本语法和算法思维。所有代码示例都提供了完整实现和详细注释。
1、计算指定 数字之间的所有数字的和,以及所有偶数的和
# 比如:1- 50所有数字的和,并且计算出偶数的和def my_sum_o(minNum, maxNum):if minNum > maxNum:# 如果 传入的数字,大小颠倒,则重新对调赋值;minNum, maxNum = maxNum, minNumprint('====', minNum, maxNum)total_num = 0even_num = 0for it in range(minNum, maxNum+1):# 使用累积运算符total_num += it# 使用取模运算if it % 2 == 0:even_num += itprint(f"{minNum} - {maxNum}的总和为:{total_num}, 其中所有偶数的和为:{even_num}")return {'total_num': total_num, 'even_num': even_num}my_sum_o(10, 1) # 1 - 10的总和为:55, 其中所有偶数的和为:30
my_sum_o(1, 100) # 1 - 100的总和为:5050, 其中所有偶数的和为:2550
2、使用for 循环打印大于1 小于10的数据
list = [num for num in range(1, 10)]
print('==list==', list)# for i in range(1, 10):
# print('==i==', i)
3、使用while 打印小于10的数据
num = 1
while num < 10:print('=num==', num)num+=1
4、使用递归计算阶乘
# 阶乘:n! = n * (n - 1)
def sun_fa(n):if n ==0 or n == 1:return 1else:return n * sun_fa(n-1)print('=sun_fa==', sun_fa(4)) # 24
5、判断一个数是否为完全平方数,
# 即一个数字 是否为另外一个数字的 平方;
# 比如:4 是2的完全平方数,9 就不是完全平方数
# 利用 math.isqrt() 计算平方根
# import math
# def is_square(n):
# if n < 0:
# return False
# else:
# # 计算该数字的平方根,并取整
# sqt = int(math.isqrt(n))
# # 判断其乘积是否等于原数
# return sqt * sqt == n# print('==12=', f"{is_square(12)}") # False
# print('==25=', f"{is_square(25)}") # True
6、使用递归打印 斐波那契数列
循环打印方案
# 菲波那切数列 f(n) = f(n - 1) + f(n - 2)# 循环打印 前 n 位 斐波那契数列
def my_fa(n):if n == 2 or n == 1:return [0, 1]else:fa_list = [0, 1]for iy in range(2, n):print('==iy==', iy)nv = fa_list[iy - 1] + fa_list[iy - 2]fa_list.append(nv)return fa_list# 打印前5位 斐波那契数列print('==fa==', my_fa(5)) # [0, 1, 1, 2, 3]
递归打印
# 先计算第n项数字
def my_sum_fa(n):if n <=1:return nelse:return my_sum_fa(n-1) + my_sum_fa(n-2)
# 打印前n个斐波纳契数列def my_fa_list(n):my_list = []for ik in range(0, n):my_list.append(my_sum_fa(ik))return my_list
print('==my_fa_list==', my_fa_list(5))
7、打印九九乘法法则
循环打印方案
# 默认 是 9,
# 支持打印指定数字的 九九乘法法则
def my_mul(n=9):if n <= 9:for i in range(1, n+1):for j in range(1, i+1):print(f" {j} * {i} = {i * j} ", end=" ")print(end="\n")else:print('请输入小于等于9的数字')my_mul(19)
# my_mul(9)#
# 1 * 1 = 1
# 1 * 2 = 2 2 * 2 = 4
# 1 * 3 = 3 2 * 3 = 6 3 * 3 = 9
# 1 * 4 = 4 2 * 4 = 8 3 * 4 = 12 4 * 4 = 16
# 1 * 5 = 5 2 * 5 = 10 3 * 5 = 15 4 * 5 = 20 5 * 5 = 25
# 1 * 6 = 6 2 * 6 = 12 3 * 6 = 18 4 * 6 = 24 5 * 6 = 30 6 * 6 = 36
# 1 * 7 = 7 2 * 7 = 14 3 * 7 = 21 4 * 7 = 28 5 * 7 = 35 6 * 7 = 42 7 * 7 = 49
# 1 * 8 = 8 2 * 8 = 16 3 * 8 = 24 4 * 8 = 32 5 * 8 = 40 6 * 8 = 48 7 * 8 = 56 8 * 8 = 64
# 1 * 9 = 9 2 * 9 = 18 3 * 9 = 27 4 * 9 = 36 5 * 9 = 45 6 * 9 = 54 7 * 9 = 63 8 * 9 = 72 9 * 9 = 81
8、根据传入的边长以 * 号打印正方形
打印实心
def my_square(n):if n > 3:for i in range(0, n):for j in range(0, n):print('*', end=" ")print(end='\n')else:print('请输入大于3的数字')my_square(5)
# 打印 横竖 均为 5个 * 号的正方形# * * * * *
# * * * * *
# * * * * *
# * * * * *
# * * * * *
打印:空心正方形
def print_hollow_square(size):for i in range(size):if i == 0 or i == size - 1:print('* ' * size)else:print('* ' + ' ' * (size - 2) + '*')print_hollow_square(5)
通用正方形
print('------通用正方形----')# 通用形打印正方形# size: 正方形边长# char 以什么符号展示# hellow 是否为空心def my_com_square(size, char="*", hellow=False):if hellow:for i in range(size):if i == 0 or i == size -1 :print((char + ' ') * size)else:# 注意这里是 第一个是一个空格,第二是 两个 空格print(char + ' ' + ' ' * (size - 2) + char)else:for i in range(size):print((char + ' ') * size)
# 打印实心
# my_com_square(4)
# my_com_square(4, hellow=True)
my_com_square(3, char='&', hellow=True)# ...
# & & &
# & &
# & & &
# ...
9、判断一个数是否为自恋数字
# 自恋数,表示 一个数字长度为 n ,各个位上数字的 n 次方,刚好等于这个数字,称为自恋数
# 例如:153是一个3位数,且1^3 + 5^3 + 3^3 = 153,因此153是Armstrong数
使用转化为字符串 进行求和判断
# 方案1、使用转化为字符串 进行求和判断
def is_my_armstrong_number(num):"""判断一个数是否为 Armstrong 数"""# 将数字转换为字符串,便于处理每一位num_str = str(num)# 获取长度n = len(num_str)# 计算每位数字的 n 次方之和total = sum(int(digit) ** n for digit in num_str)return total == num
递归 方案
# 方案2、递归 方案
def is_armstrong_recursive(num, power=None, total=0, original_num=None):"""递归判断 Armstrong 数"""if original_num is None:original_num = num# 获取长度power = len(str(num))if num == 0:return total == original_num# 取模 即 余数digit = num % 10# 取整数return is_armstrong_recursive(num // 10, power, total + digit ** power, original_num)
#
print("\n递归方法:", 379 // 10)
print('==是否为 自恋数', )
print(f"{370}: {'是' if is_armstrong_recursive(370) else '不是'} Armstrong 数")
面向对象 方案
# 方案三、面向对象 方案
class MyArmstrongChecker:"""Armstrong 数检查器类"""def __init__(self, number):self.number = numberself.digits = [int(d) for d in str(number)]self.power = len(self.digits)def is_armstrong(self):"""判断是否为 Armstrong 数"""return sum(d ** self.power for d in self.digits) == self.numberdef get_calculation(self):"""获取计算过程"""calculation = " + ".join(f"{d}^{self.power}" for d in self.digits)total = sum(d ** self.power for d in self.digits)return f"{calculation} = {total}"def __str__(self):status = "是" if self.is_armstrong() else "不是"return f"{self.number} {status} Armstrong 数"
print('=面向对象方案==')
checker = MyArmstrongChecker(153)
print('====', checker.is_armstrong())
# 常见的 自恋数字
# 1 位:0, 1, 2, 3, 4, 5, 6, 7, 8, 9
# 3 位:153, 370, 371, 407
# 4 位:1634, 8208, 9474
# 5 位:54748, 92727, 93084
# 6 位:548834
10、break 跳出循环 和 continue 跳出本次循环
for ie in range(1, 20):if ie % 2 == 0:# 找到第一个能被 2 整除的数字print('==ie=', ie) # 2breakprint('==找到所有不能被 2 整除的数字=')
for iev in range(1, 20):if iev % 2 == 0:continue# 找到所有不能被 2 整除的数字print(iev, end=" ") # 1 3 5 7 9 11 13 15 17 19
11、找出一个数字的所有因子
# 可以被该数整除的数字,所有正整数;
推导式
# 方案1、推导式def find_factors_list_comprehension(n):"""使用列表推导式找出因子"""return [i for i in range(1, n + 1) if n % i == 0]
利用平方根
# 方案2、利用平方根
import math
def my_all_factors(n):"""找出一个数字的所有因子(优化版本)"""factors = []# 只遍历到平方根,提高效率for i in range(1, int(math.sqrt(n)) + 1):if n % i == 0:factors.append(i)# 如果i不是平方根,则添加对应的因子if i != n // i:factors.append(n // i)# 对因子进行排序factors.sort()return factorsprint('=因子==', my_all_factors(36)) # [1, 2, 3, 4, 6, 9, 12, 18, 36]
12、一个数字各个位上数的总和
利用 str 类型进行遍历
# 例如:156 =》 1+5+6 = 12def my_all_sum(n):# 将附属 转化为 其绝对值n = abs(n)total_num = 0for digit in str(n):total_num += int(digit)return total_num
推导式
# 推导式
def my_digit_sum_comprehension(n):"""使用列表推导式计算数字和"""return sum(int(digit) for digit in str(abs(n)))print('===', my_all_sum(156), my_digit_sum_comprehension(156))
