学习python第十三天

学习python第十三天

昨天学习了函数,今天就着重练习函数

给出题目和代码,建议先自己尝试再对照

第一题

  1. 写一个实现生成指定长度的随机验证码(有数字和英文字母构成)的函数。
    写好了之后,通过调用该函数,生成10组随机验证码
import random
import string


def get_captcha_code(nums: int = 4):
    # 这里的int = 4 表示输入的为整形,默认为4
    """
    生成随机验证码
    :param nums:
    :param n: 验证码长度
    :return: 随机验证码字符串
    """
    list1 = string.digits + string.ascii_letters
    # 生成验证码的取值范围
    numbers = random.sample(list1, n)
    return numbers


def display(numbers):
    """
    设定验证码输出格式
    :param numbers: 生成的验证码
    :return: 输出验证码的格式
    """
    for number in numbers:
        print(number, end='')
    print()


n = int(input('多长的验证码'))
m = int(input('需要多少组'))
for _ in range(1, m):
    display(get_captcha_code(n))

第二题

  1. 写一个函数判断一个正整数是不是质数。
    (自变量:正整数,因变量:True / False)写好之后,通过这个调用这个函数,输出2-100范围内的质数。
def prime_number(n):
    """
    判断一个数是不是质数
    :param n: 正整数
    :return: 如果是质数返回True,如果不是质数返回False
    """
    judge = True
    for i in range(2, n):
        if n % i != 0:
            judge = True
        else:
            return False
# 传统的判断质数方法
    return True if judge == True and n != 1 else False


def chose_range(nim_m=0, max_n=100):
    """
    查找一定范围内的质
    :param nim_m: 查找范围的小的那个值
    :param max_n: 查找范围的大的那个值
    :return: 输出范围内的质数
    """
    for n in range(nim_m, max_n + 1):
        if prime_number(n):
            print(n, end=' ')
做到这里就结束了,但是又发现了之前那个欧吉米德,还是欧拉基德还是啥的算法判断质数更牛逼,

def is_prime(num: int) -> bool:
    for i in range(2, int(num ** 0.5) + 1):
        if num % i == 0:
            return False
        return num != 1

第三题

  1. 用函数实现求两个数的最大公约数和最小公倍数。
    设计函数最为重要的原则: 单一职责原则(一个函数只做好一件事情)----->高度内聚
    写程序的终极原则:高内聚,低耦合
def max_divisor(num1, num2):
    """
    寻找两个数在最大公约数
    :param num1:第一个数
    :param num2:第二个数
    :return: 最大公约数
    """
    if num1 > num2:
        num1, num2 = num2, num1
    for i in range(num1 + 1, 1, -1):
        if num2 % i == 0 and num1 % i == 0:
            return i


def min_lcm(x, y):
    """
    求最小公倍数
    :param x:
    :param y:
    :return:
    """
    return x * y // max_divisor(x, y)# 公倍数的神仙求法


m = int(input('请输入范围的左边m='))
n = int(input('请输入范围的右边n='))
print(max_divisor(m, n))


这些之前都有写过,只是将它们转换为函数而已,就不过多解释了,毕竟代码内容都比较简单

第四题

  1. 设计一个函数,传入一个列表(列表中是一组样本数据),
    计算样本数据的极差(最大值和最小值的差)。
import random


def num_range(nums):
    return max(nums) - min(nums)


n = int(input('几个元素的列表'))
print(num_range(n))


def ptp(data):
    return max(data) - min(data)


def average(nums):
    return sum(nums) / len(nums)

都很简单不是吗😀

第五题

传入一个列表(列表中是一组样本数据),设计计算方差、 中位数和标准差的函数。

def variance(data):
    """求方差"""
    x_bar = average(data)
    temp = [(num - x_bar) ** 2 for num in data]
    return sum(temp) / (len(temp) - 1)


def standard_deviation(data):
    """求标准差"""
    return math.sqrt(variance(data))

def median(data):
    """找中位数"""
    temp, size = sorted(data), len(data)
    if size % 2 != 0:
        return temp[size // 2]
    else:
        return average(temp[size // 2 - 1: size // 2 + 1])


使用模块

使用自己写过的模块

同一个窗口的导入方法

# 和python中的函数使用方法一样,如果它在其他的文件夹里
from demo.homework04 import average as avg, median, variance as var, standard_deviation as std

#如果在一个文件夹里则不需要demo,我这里是因为将它放在了‘demo’这个文件夹里了,我将这些函数都放入了一个界面里,
import math
import random


def ptp(data):
    """求极差(全距)"""
    return max(data) - min(data)


def average(data):
    """求均值"""
    return sum(data) / len(data)


def variance(data):
    """求方差"""
    x_bar = average(data)
    temp = [(num - x_bar) ** 2 for num in data]
    return sum(temp) / (len(temp) - 1)


def standard_deviation(data):
    """求标准差"""
    return math.sqrt(variance(data))


def median(data):
    """找中位数"""
    temp, size = sorted(data), len(data)
    if size % 2 != 0:
        return temp[size // 2]
    else:
        return average(temp[size // 2 - 1: size // 2 + 1])


if __name__ == '__mian__':# 这个是使用这些函数的条件,规范以后都带入这串代码再使用函数
    nums = [random.randrange(1, 100) for _ in range(8)]
    print(nums)
    print(f'均值: {average(nums)}')
    print(f'中位数: {median(nums)}')
    print(f'极差: {ptp(nums)}')
    print(f'方差: {variance(nums)}')
    print(f'标准差: {standard_deviation(nums)}')

继续来练习

之前我们写过两个班的成绩问题,现在我们来显示两个班级成绩的中位数,方差,标准差,平均数

import random
from demo.homework04 import average as avg, median, variance as var, standard_deviation as std

class_a_score = [random.randrange(50, 101) for _ in range(1, 51)]
class_b_score = [random.randrange(50, 101) for _ in range(1, 51)]
print('A班考试统计信息')
# print(f'平均分{homework04.average(class_a_score)}')
print(f'平均分{avg(class_a_score)}')
print(f'中位数:{median(class_a_score)}')
print(f'方差{var(class_a_score)}')
print(f'标准差{std(class_b_score)}')
print('B班考试统计信息')
# print(f'平均分{homework04.average(class_a_score)}')
print(f'平均分{avg(class_b_score)}')
print(f'中位数:{median(class_b_score)}')
print(f'方差{var(class_b_score)}')
print(f'标准差{std(class_b_score)}')


作业

  • 作业1:编写一个函数判断一个正整数是不是“快乐数”。

    对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程,如果数字变成了1,这个数就是快乐数,如果无限循环始终变不到1,这个数就不是快乐数。

    讲解: 如果循环变成1,那么就是快乐数,循环一直不变为1,那么必定出现数字变换的死循环,也就是出现重复的数字比如,一个数字转换为54,过一段时间又回到54,那么久必定死循环,然后当即结束循环

    def happy_num(nums):
        count = [nums]
        num_sum = 0 # 先设定一会要用到的变量
        temp = str(nums)# 将数字转换为字符串然后求出数字的位数
        num = nums # 将原数赋值给其他变量,一会比较形成的返回值是否重样
        while True:
            for i in range(len(temp)):
                num_sum += (num % 10) ** 2# 分解数字进行平方
                num = (num - num % 10) // 10
            num = num_sum # 更新新新形成的num值
            temp = str(num_sum)
            if num_sum in count:
                # 三种情况,第一种是在不在曾经出现过的形成数列表里,如果出现过说明陷入循环,就不可能是快乐数
                return '不是快乐数'
            if num_sum not in count and num_sum != 1:
                # 第二种,既没有出现过,又不等于一,那么就加进去咯
                count.append(num_sum)
            if num_sum == 1:
                # 第三种就是快乐数的情况
                return '是快乐数'
    
            num_sum = 0
    
    
    print(happy_num())
    
    
  • 第二题,整数反转,将负数也考虑进去

这里主要就是多考虑到一个负数的情况,其他就和之前我们所作的那个反转数字一样的

def Integer_inversion(number):
    algebra = number
    # 将初始值赋给一个变量
    if number < 0:
        # 判断是否为负数,如果是负数就变为正数来用
        algebra *= -1
    temp = str(algebra)
    total = 0
    for _ in range(len(temp)):
        algebra, total = algebra // 10, total * 10 + algebra % 10
    if number < 0:
        # 如果是负数,就把符号搞回去,因为需要初始值判断,所以这里就体现出来什么,将初始值赋值给变量的重要性
        total = total * (-1)
        return total
    else:
        return total


print(Integer_inversion(-2345))

其他的就和之前的反转整数方法一样,就不过多讲解了

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值