1、对于一些数字组合方案,可以利用 for 循环,结合简单的算法来实现:比如
"""
200块钱买洗发水15元/瓶,香皂2元/块,牙刷5元/支,
有多少中组合购买方案
"""
money = 200
x = money//15
for i in range(0,x+1):
y = (money-15*i)//2
for j in range(0,y+1):
z = (money-15*i-2*j)//5
for k in range(0,z+1):
if 15*i+2*j+5*k == money:
print(f"可买洗发水{i}瓶,香皂{j}块,牙刷{k}支。")
2、当需要把列表中的字符串类型的数值转化为数字类型时,可以用到内置map函数,返回一个map对象,再用list将其转换为列表。格式:map(函数名 , 一个或多个序列)。
"""
栗子:随便输入一组数字并用空格隔开,返回该组数中的最大值、最小值和平均数。
"""
x = input("输入一组数字并用空格隔开")
def func(x):
lis = x.split(" ")
n = lis.count("") # 统计列表里的 "" 个数
while n != 0:
lis.remove("") # 利用循环全部移除 "",解决多空格报错问题
n = lis.count("")
li = list(map(int,lis)) # map函数转化
Max = max(li)
Min = min(li)
Avg = sum(li)/len(li)
return f"该组数字中的最大值为{Max},最小值为{Min},平均值为{Avg}"
print(func(x))
3、递归函数的一些思路:递归函数就是函数自己调用自己,必须要设置一个递归出口,否则无限死循环。出口条件可以理解成一个最小单元的值,递归就是将一个大的事物分解为一个个小的基本单元,一旦分解到最小单元即终止递归,然后计算最终结果。
知乎大神链接参考:https://zhuanlan.zhihu.com/p/158300209?utm_id=0
自己整理的代码例子:
# 栗子一:用递归处理数字累加问题
def fun(x):
if x == 1: # 最小单元
return x
res = fun(x-1)+x # 递归分解
return res
# 递推思维:1+2+3
# 递归思维:3+2+1
# fun(2)+3
# fun(1)+2+3
# 1+2+3=6
# fun(1)+2 X
# fun(0)+1+2 X
# fun(-1)+0+1+2 X
# fun(-2)+-1+0+1+2 X
print("计算结果:{}".format(fun(3)))
print(f"计算结果:{fun(3)}")
"""
栗子二:
养鸭人每过一个村庄卖出手上鸭子数量的一半又一只,一共卖了7个村,最后还剩2只鸭子,
问原来共有几只鸭子?(递归方法解决)
"""
def isplu(k, m):
if k < 0 or m < 0: # 函数作用是判断村子和鸭子不能为负
print("查询参数不能为负数,请重新输入==》") # 负数则提示重新输入
else:
print("初始共有{}只鸭子".format(sums(k, m))) # 正数则继续执行sums函数
def sums(k, m):
if k == 0: # 无交易的话剩余即是总数
return m
else:
res = sums(k-1, m)*2+2
return res
# 递推思维:510/2-1....n/2-1=2 总数卖到最后剩2只
# 递归思维:2*2+2....n*2+2=510 累计卖的数量得到总数
# f(0,2) = 2
# f(7,2) = f(6,2)*2+2
# f(7,2) = (f(5,2)*2+2)*2+2
# ...
while 1:
try: # 捕获输入除数字外的所有异常
k = int(input("一共在几个村卖鸭子?==》"))
m = int(input("最后卖完还剩几只鸭?==》"))
isplu(k, m) # 调用isplu函数
print("****" * 10)
except Exception as e: # 打印异常提示重新输入
print("!!!wrong,请重新输入!!!")
print(e)
4、知识点:字符串、列表、字典方法的使用,利用字符替换、字符串是否为数字、字符个数统计、字符串分割、列表特定数值移除、根据下标值查询等方法,处理输入的文本,根据条件逻辑查询结果。
"""
题目:输入某年某月某日,判断这一天是这一年的第几天?
"""
def formatDate(date):
dateInfo = date.replace(" ", "") # 去除字符串里的所有空格,字符串方法
if dateInfo.isdigit(): # 判断去除空格后的文本是否全为数字,字符串方法
# print(dateInfo, date)
dateInfos = date.split(" ") # 如果全为数字则以空格分割输出列表,字符串方法
n = dateInfos.count("") # 统计列表里的 "" 个数,列表方法
while n != 0:
dateInfos.remove("") # 利用循环全部移除 "",列表方法
n = dateInfos.count("")
dateInfos = list(map(int, dateInfos)) # str转化int
# print(dateInfos, len(dateInfos))
if len(dateInfos) != 3: # 判断是否年月日格式
print("日期格式不规范,请重新输入==》")
elif dateInfos[1] <= 0 or dateInfos[1] > 13: # 判断月份是否符合逻辑
print("输入月份不存在,请重新输入==》")
else:
whatDay(dateInfos) # 调用函数
else:
print("只能输入正整数,请重新输入==》")
def whatDay(dateInfos):
year = dateInfos[0]
month = dateInfos[1]
day = dateInfos[2]
sums = months[str(month)] # 本月前的天数总和,字典根据key查询value
sums += day # 加上本月的天数即为结果
leap = 0 # 如果闰年则二月份后天数加一天
if year % 4 == 0 or year % 400 == 0 and year % 100 != 0:
leap = 1
if leap == 1 and month > 2:
sums += 1
print(f"这天是今年的第{sums}天")
months = {
"1": 0,
"2": 31,
"3": 59,
"4": 90,
"5": 120,
"6": 151,
"7": 181,
"8": 212,
"9": 243,
"10": 273,
"11": 304,
"12": 334,
}
while 1:
date = input("请输入年 月 日并用空格隔开(按”0“退出)")
if date == "0":
exit()
formatDate(date)
5、内置模块random的相关使用,while循环。常用的random模块方法有:
# 方法一:random.random():随机产生一个[0,1)的数字
n = random.random()
print(n)
# 方法二:random.shuffle():打乱序列
n = [1, 2, 3, 4, 5]
random.shuffle(n)
print(n)
# 方法三:
# random.getstate():获取当前随机状态
# random.setstate():设置当前随机状态
# 通常用于当前的随机状态,两个函数搭配使用
a = [1, 2, 3, 4, 5]
b = ["one", "two", "three", "four", "five"]
state = random.getstate() # 提前保存随机状态(顺序)
random.shuffle(a) # 先将a序列顺序随机打乱
random.setstate(state) # 讲当前随机状态(顺序)设置为之前保存的随机状态
random.shuffle(b) # 再将b序列顺序随机打乱
print(a) # [2, 1, 3, 5, 4]
print(b) # ['two', 'one', 'three', 'five', 'four']
# 根据两者的输出结果,发现随机顺序(下标)位置都是一一对应
# 方法四:random.uniform(m,n):返回一个在m,n之间的数
n = random.uniform(0, 10)
print(n)
# 方法五:random.randint(m,n):返回一个在m,n之间的整数
n = random.randint(0, 10)
print(n)
# 方法六:random.randrange(start,end,step):从start到end但不包括end,步长位step的随机数
n = random.randrange(0, 10, 2) # [0,2,4,6,8] 就是从序列的切片结果中随机获取一个数
print(n)
# 方法七:random.choice(n):随机返回n中的一个随机元素(可能重复),一般n为一个有序序列
n = "abcd1234"
print(random.choice(n)) # b
# 方法八:random.sample(有序序列, 取样次数):随机取样,以列表的形式返回,不会选到重复的元素,如果取样次数超过元素个数会报错
n = "abcd1234"
print(random.sample(n, 3)) # ['3', 'a', '1']
print(random.sample(n, 9)) # ValueError: Sample larger than population or is negative
-
举个例子:利用随机数模块知识,写一个彩票随机35选7的代码
import random
temp = [i + 1 for i in range(35)] # 先生成一个包含数字1~35的列表
random.shuffle(temp) # 打乱列表
# print(temp)
lis = []
n = 0 # 取数次数
while n < 7:
d = random.randint(0, 34) # 随机生成一个0~34范围的下标值
while temp[d] in lis:
# print(temp, temp[d])
d = random.randint(0, 34)
lis.append(temp[d])
n += 1
# print(lis)
lis.sort() # 列表里数值升序
print(*lis) # 4 7 13 17 23 25 26