学习python第十三天
昨天学习了函数,今天就着重练习函数
给出题目和代码,建议先自己尝试再对照
第一题
- 写一个实现生成指定长度的随机验证码(有数字和英文字母构成)的函数。
写好了之后,通过调用该函数,生成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))
第二题
- 写一个函数判断一个正整数是不是质数。
(自变量:正整数,因变量: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
第三题
- 用函数实现求两个数的最大公约数和最小公倍数。
设计函数最为重要的原则: 单一职责原则(一个函数只做好一件事情)----->高度内聚
写程序的终极原则:高内聚,低耦合
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))
这些之前都有写过,只是将它们转换为函数而已,就不过多解释了,毕竟代码内容都比较简单
第四题
- 设计一个函数,传入一个列表(列表中是一组样本数据),
计算样本数据的极差(最大值和最小值的差)。
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))
其他的就和之前的反转整数方法一样,就不过多讲解了