实验目的
- 熟悉选择结构嵌套时代码的缩进与对齐。
- 理解带 else 子句的循环结构执行流程和条件表达式 value1 if condition else value2 的用法。
- 熟悉使用循环和异常处理机构对用户输入进行约束的用法。
- 掌握Python程序中进行选择、循环流程控制的语句、语法,熟练运用选择结构和循环结构解决实际问题。
- 掌握函数的定义与调用。
- 熟练掌握lambda表达式的使用,理解变量作用域的意义、各种函数参数类型的使用。
实验内容:
编写程序,输入一个大于 2 的自然数,然后输出小于该数字的所有素数组成的列表。 (所谓素数,是指除了1和其自身之外没有其他因数的自然数:2,3,5,7,11,13......)
参考代码:
程序代码:
python
maxNumber = int(input('请输入一个大于2的自然数:'))
lst = list(range(2, maxNumber))
m = int(maxNumber ** 0.5)
for index, value in enumerate(lst):
if value > m:
break
lst[index+1:] = filter(lambda x: x % value != 0, lst[index+1:])
print(lst)
(2)运行结果(截图):
编写程序,输入若干个成绩,求所有成绩的平均分。每输入一个成绩后询问是否继续输入下一个成绩,回答"yes"就继续输入下一个成绩,回答"no"就停止输入成绩。
参考代码:
程序代码:
python
numbers = [] # 使用列表存放成绩数据
while True:
x = input("请输入一个成绩:")
try:
numbers.append(float(x)) # 将输入的成绩转换为浮点数并添加到列表
except ValueError:
print("不是合法成绩,请输入一个数值。")
continue # 继续下一次循环,不添加非法成绩
while True:
flag = input("继续输入吗?(yes/no):") # 询问用户是否继续输入
# 限定用户输入内容必须为yes或no
if flag.lower() not in ('yes', 'no'):
print("只能输入yes或no")
else:
break
if flag.lower() == 'no': # 如果用户选择'no',则结束循环
break
if numbers: # 如果列表不为空,计算平均分
average = sum(numbers) / len(numbers)
print(f"所有成绩的平均分是:{average:.2f}")
else:
print("没有输入任何成绩。")
(2)运行结果(截图):
编写程序模拟猜数游戏。程序运行时,系统生成一个随机数,然后提示用户进行猜测,并根据用户输入进行必要的提示(猜对了、太大了、太小了),如果猜对则提前结束程序,如果次数用完仍没有猜对,提示游戏结束并给出正确答案。
参考代码:
程序代码:
python
from random import randint
def guessNumber(maxValue=10, maxTimes=3):
value = randint(1, maxValue) # 随机生成一个1到10之间的整数
for i in range(maxTimes):
prompt = 'Start to GUESS:' if i == 0 else 'Guess again:'
try:
x = int(input(prompt))
except:
print('Must input an integer between 1 and', maxValue)
else:
if x == value:
print('Congratulations!')
break
elif x < value:
print('Too little.')
else:
print('Too big.')
else: # 检查是否用完了所有的猜测次数
print('Game Over. FAIL.')
print(f'The value was {value}.')
guessNumber()
(2)运行结果(截图):
编写程序,输入一个字符串,输出该字符所为密码时的安全强度。
程序代码:
python
import string
def check(pwd):
if not isinstance(pwd, str) or len(pwd) < 8:
return "not suitable for password"
# 初始化密码强度等级与包含字符种类的对应关系
d = {1: 'weak', 2: 'below middle', 3: 'above middle', 4: 'strong'}
# 初始化一个列表,用来标记密码是否含有数字、小写字母、大写字母和标点符号
r = [False] * 4
for ch in pwd:
# 是否包含数字
if not r[0] and ch in string.digits:
r[0]=True
# 是否包含小写字母
if not r[1] and ch in string.ascii_lowercase:
r[1]=True
# 是否包含大写字母
if not r[2] and ch in string.ascii_uppercase:
r[2]=True
# 是否包含指定的标点符号
if not r[3] and ch in ',.!:?<>':
r[3]=True
# 统计包含的字符种类, 返回密码强度
return d.get(r.count(True), 'error')
# 测试函数
print(check("a26%Cd."))
(2)运行结果(截图):
编程实现:查找字符串中每个字符的首次出现。给定一个任意字符串,要求得到一个新字符串,重复字符只保留一个,并且新字符串中的字符保持在原字符串中首次出现的先后顺序。例如,abcdaaabe处理后应得到abcde。(使用两种不同的方法)
程序代码:
python
from random import choice
from string import digits
def func1(text):
# 转换为集合,去重
result = set(text)
# 按其在原字符串中的先后顺序,把集合里的字符连接为字符串
result =''.join(sorted(result, key=text.index))
return result
def func2(text):
result=[]
for ch in text:
if ch not in result:
result.append(ch)
return ''.join(result)
text = ''.join(choice(digits) for _ in range(30)) # 随机字符串
print(text)
print(func1(text))
print(func2(text))
(2)运行结果(截图):
实验任务
学习教材第1章、第2章内容,根据实验内容练习相关编程知识。
独立完成如下编程任务并提交实验报告。(报告撰写要求详见模板文档)
编写程序,输入一个包含若干整数的列表,输出列表中所有整数连乘的结果。
(1)程序代码:
python
from functools import reduce
import operator
def multiply_list_numbers(numbers):
# 使用reduce和operator.mul来计算列表中所有整数的连乘结果
result = reduce(operator.mul, numbers, 1)
return result
# 输入一个包含若干整数的列表
input_numbers = list(map(int, input("请输入一个包含若干整数的列表,以空格分隔:").split()))
# 输出列表中所有整数连乘的结果
print(multiply_list_numbers(input_numbers))
(2)运行结果(截图):
实验总结:
在本次实验中,我深入地学习了Python中的流程控制、函数设计和使用,以及异常处理和输入验证等重要概念。通过编写不同的程序,我不仅巩固了理论知识,而且提高了解决实际问题的能力。
知识点小结:
我熟悉了选择结构嵌套时的代码缩进与对齐,这对于保持代码的可读性至关重要。
我理解了带else子句的循环结构执行流程。
我掌握了如何使用循环和异常处理对用户输入进行约束,确保程序能够处理不合法的输入。
我学习了如何定义和调用函数,这有助于我创建模块化的代码,提高了代码的复用性。
我熟练掌握了lambda表达式的使用,并对变量作用域和函数参数类型有了更深刻的理解。
实验体会:
通过本次实验,我体会到了编程不仅仅是写代码,更重要的是如何设计出清晰、高效、可维护的程序。我学会了如何通过编写函数来简化复杂的问题,并通过合理的输入验证来提高程序的健壮性。
未解决的问题:
尽管我在实验中取得了进步,但在处理大型程序和复杂逻辑时,我仍然感到有些挑战。我还需要进一步学习如何组织代码结构,以及如何更有效地使用高级Python特性,如列表推导式、生成器表达式和装饰器。
改进的方法:
阅读更多的Python代码,特别是那些开源项目和专业代码库,以学习更优秀的编程实践。
参与更多的编程练习和项目,以提高解决实际问题的能力。