【数据分析基础】实验二 Python程序流程控制、函数设计与使用

实验目的

  1. 熟悉选择结构嵌套时代码的缩进与对齐。
  2. 理解带 else 子句的循环结构执行流程和条件表达式 value1 if condition else value2 的用法。
  3. 熟悉使用循环和异常处理机构对用户输入进行约束的用法。
  4. 掌握Python程序中进行选择、循环流程控制的语句、语法,熟练运用选择结构和循环结构解决实际问题。
  5. 掌握函数的定义与调用。
  6. 熟练掌握lambda表达式的使用,理解变量作用域的意义、各种函数参数类型的使用。

实验内容:

编写程序,输入一个大于 2 的自然数,然后输出小于该数字的所有素数组成的列表。 (所谓素数,是指除了1和其自身之外没有其他因数的自然数:2,3,5,7,11,13……)

参考代码:

程序代码:

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”就停止输入成绩。

参考代码:

程序代码:

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)运行结果(截图):

编写程序模拟猜数游戏。程序运行时,系统生成一个随机数,然后提示用户进行猜测,并根据用户输入进行必要的提示(猜对了、太大了、太小了),如果猜对则提前结束程序,如果次数用完仍没有猜对,提示游戏结束并给出正确答案。

参考代码:

程序代码:

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)运行结果(截图):

编写程序,输入一个字符串,输出该字符所为密码时的安全强度。

程序代码:

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。(使用两种不同的方法)

程序代码:

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)程序代码:

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代码,特别是那些开源项目和专业代码库,以学习更优秀的编程实践。

参与更多的编程练习和项目,以提高解决实际问题的能力。

最近更新

  1. TCP协议是安全的吗?

    2024-06-08 17:22:08       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-08 17:22:08       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-08 17:22:08       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-08 17:22:08       18 阅读

热门阅读

  1. 大模型备案语料来源安全要求

    2024-06-08 17:22:08       10 阅读
  2. 标题:深入探索Linux中的`ausyscall`

    2024-06-08 17:22:08       8 阅读
  3. HTML基础知识点

    2024-06-08 17:22:08       8 阅读
  4. Linux常用命令

    2024-06-08 17:22:08       8 阅读
  5. 音视频视频点播

    2024-06-08 17:22:08       7 阅读
  6. LeetCode 550, 380, 234

    2024-06-08 17:22:08       11 阅读
  7. KafkaStream Local Store和Global Store区别和用法

    2024-06-08 17:22:08       8 阅读
  8. Docker大学生看了都会系列(七、Dokcerfile详解)

    2024-06-08 17:22:08       9 阅读
  9. Windows系统中配置 Redis 监听特定的 IP 地址

    2024-06-08 17:22:08       10 阅读
  10. Android adb pull base.apk 方法介绍

    2024-06-08 17:22:08       8 阅读
  11. 【VVC】类和编码树了解

    2024-06-08 17:22:08       6 阅读
  12. golang优雅代码【lock实现】

    2024-06-08 17:22:08       7 阅读
  13. 堆排序---C语言

    2024-06-08 17:22:08       8 阅读
  14. [AIGC] 自定义Spring Boot中BigDecimal的序列化方式

    2024-06-08 17:22:08       8 阅读