内容正文:
实战:红包模拟
1、 单项选择题
1. Python中生成指定区间随机浮点数,用于拼手气红包的函数是( )
A. random.uniform()
B. random.randint()
C. random.random()
D. random.shuffle()
2. 将可迭代对象转换为迭代器的Python内置函数是( )
A. range()
B. yield
C. next()
D. iter()
3. 迭代器中所有元素读取完毕后,再次调用next()会抛出的异常是( )
A. IndexError
B. ValueError
C. StopIteration
D. TypeError
4. 定义生成器函数必须使用的标志性关键字是( )
A. return
B. break
C. yield
D. continue
5. 下列关于生成器执行机制描述正确的是( )
A. 一次性将所有数据加载到内存
B. 惰性计算,调用next时才生成单个值
C. 迭代结束后可以重复遍历
D. 不需要遵循迭代器协议
6. 拼手气红包总金额10元、共5份,单份金额不可能出现的是( )
A. 0.01
B. 1.25
C. 10.00
D. 10.01
7. 下列选项中属于可迭代对象,但本身不是迭代器的是( )
A. list列表
B. iter([1,2])
C. generator生成器
D. 迭代器对象
8. 均分红包核心代码single = money / count 属于哪类程序结构( )
A. 循环结构
B. 顺序结构
C. 递归结构
D. 迭代器结构
9. 自定义类要成为合法迭代器,必须实现的两个魔术方法是( )
A. __init__、__str__
B. append、pop
C. yield、next
D. __iter__、__next__
10. 生成器表达式(x for x in range(10))与列表推导[x for x in range(10)]最核心的区别是( )
A. 生成器惰性生成,列表一次性加载全部数据
B. 仅列表支持for循环遍历
C. 生成器仅支持数字类型
D. 生成器长度固定不可修改
二、简答题
1. 简述普通均分红包与拼手气红包在Python代码实现上的核心差异。
2. 说明iter()与next()函数的功能,以及二者的执行顺序。
3. 简述yield关键字在生成器函数中的运行机制。
4. 写出迭代器的任意两条核心特性。
5. 简述for循环遍历列表时,底层自动执行的迭代流程。
6. 拼手气红包分配时,最后一份金额直接取剩余总额的原因是什么?
三、材料题
1. 财务发放固定福利均分红包,编写程序实现:输入红包总金额、红包人数,自动计算人均金额,保留两位小数,输出最终的红包金额列表。
2. 模拟微信拼手气红包:导入random模块,输入红包总额与个数,随机分配每份金额,要求每份最低0.01元,最后一份兜底剩余金额,输出所有红包明细。
3. 自定义迭代器类NumIter,遵循迭代器协议,实现依次输出1~n的所有整数,使用for循环完成遍历测试。
4. 编写生成器函数money_gen,传入红包总额与份数,通过yield惰性逐个产出拼手气红包金额,使用next()依次取出每一份红包。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$
实战:红包模拟
1、 单项选择题
1. Python中生成指定区间随机浮点数,用于拼手气红包的函数是( )
A. random.uniform()
B. random.randint()
C. random.random()
D. random.shuffle()
【答案】A
【解析】uniform(a,b)生成[a,b]区间的均匀随机浮点数,是实现随机红包金额的核心函数;randint仅生成整数,random生成0-1随机数,shuffle用于打乱列表。
2. 将可迭代对象转换为迭代器的Python内置函数是( )
A. range()
B. yield
C. next()
D. iter()
【答案】D
【解析】iter(可迭代对象)用于创建对应迭代器实例;next用于从迭代器中取出元素,yield是生成器定义关键字。
3. 迭代器中所有元素读取完毕后,再次调用next()会抛出的异常是( )
A. IndexError
B. ValueError
C. StopIteration
D. TypeError
【答案】C
【解析】迭代器元素耗尽时,next()固定抛出StopIteration异常,作为迭代终止的标志,for循环会自动捕获该异常结束遍历。
4. 定义生成器函数必须使用的标志性关键字是( )
A. return
B. break
C. yield
D. continue
【答案】C
【解析】yield是生成器特有关键字,实现函数暂停与现场保存;return直接终止函数运行,无法实现惰性迭代。
5. 下列关于生成器执行机制描述正确的是( )
A. 一次性将所有数据加载到内存
B. 惰性计算,调用next时才生成单个值
C. 迭代结束后可以重复遍历
D. 不需要遵循迭代器协议
【答案】B
【解析】生成器核心特性是惰性按需计算,仅在迭代时生成单个值,内存占用极低;迭代器是一次性单向遍历,必须遵循迭代器协议。
6. 拼手气红包总金额10元、共5份,单份金额不可能出现的是( )
A. 0.01
B. 1.25
C. 10.00
D. 10.01
【答案】D
【解析】random.uniform生成的随机金额不会超过总金额边界,10.01大于红包总额,无法在分配中出现。
7. 下列选项中属于可迭代对象,但本身不是迭代器的是( )
A. list列表
B. iter([1,2])
C. generator生成器
D. 迭代器对象
【答案】A
【解析】列表是可迭代对象,必须调用iter()转换后才能成为迭代器;生成器本身就是迭代器,可直接使用next()取值。
8. 均分红包核心代码single = money / count 属于哪类程序结构( )
A. 循环结构
B. 顺序结构
C. 递归结构
D. 迭代器结构
【答案】B
【解析】该语句是单纯的算术赋值,无判断、无循环,按书写顺序依次执行,属于基础顺序结构。
9. 自定义类要成为合法迭代器,必须实现的两个魔术方法是( )
A. __init__、__str__
B. append、pop
C. yield、next
D. __iter__、__next__
【答案】D
【解析】Python迭代器协议规定:__iter__返回迭代器自身,__next__返回下一个元素或抛出StopIteration异常。
10. 生成器表达式(x for x in range(10))与列表推导[x for x in range(10)]最核心的区别是( )
A. 生成器惰性生成,列表一次性加载全部数据
B. 仅列表支持for循环遍历
C. 生成器仅支持数字类型
D. 生成器长度固定不可修改
【答案】A
【解析】列表推导会一次性生成完整列表并将所有数据存入内存;生成器仅保存运算逻辑,迭代时逐个生成数据,大幅降低内存占用,适合大数据场景。
二、简答题
1. 简述普通均分红包与拼手气红包在Python代码实现上的核心差异。
【答案】普通均分红包仅使用算术除法计算单份金额,所有人金额完全相等,不需要随机函数;拼手气红包通过循环调用random.uniform生成随机金额,最后一份直接取剩余金额保证总额正确,每份金额随机不相等。
2. 说明iter()与next()函数的功能,以及二者的执行顺序。
【答案】iter()接收可迭代对象,生成对应的迭代器实例;next()接收迭代器,取出下一个元素。执行顺序为先调用iter()创建迭代器,再反复调用next()逐个取值,元素耗尽后抛出StopIteration。
3. 简述yield关键字在生成器函数中的运行机制。
【答案】代码执行到yield时会暂停函数运行,返回yield后的值,同时保存当前所有变量与执行位置;下一次调用next()唤醒函数时,从暂停位置继续向下执行。
4. 写出迭代器的任意两条核心特性。
【答案】①单向遍历,只能向前取值,无法回退到之前的元素;②一次性遍历,所有元素取出后无法重复使用,需要重新创建迭代器实例;③惰性加载,不会一次性把所有数据读入内存,内存占用低。
5. 简述for循环遍历列表时,底层自动执行的迭代流程。
【答案】1. 隐式调用iter()将列表转换为迭代器;2. 循环调用next()取出元素并赋值给循环变量;3. 元素耗尽时触发StopIteration异常;4. for循环自动捕获该异常,结束遍历。
6. 拼手气红包分配时,最后一份金额直接取剩余总额的原因是什么?
【答案】多次随机浮点数相加会产生精度误差,最后一份直接取剩余金额,可以保证所有红包金额相加严格等于输入总金额,避免出现总额对不上的问题。
三、材料题
1. 财务发放固定福利均分红包,编写程序实现:输入红包总金额、红包人数,自动计算人均金额,保留两位小数,输出最终的红包金额列表。
【答案】参考代码:
money = eval(input("请输入红包总金额:"))
count = eval(input("请输入红包人数:"))
single = round(money / count, 2)
red_pack = [single] * count
print("均分红包列表:", red_pack)
【解析】纯顺序结构实现,通过算术除法完成均分,round控制人民币两位小数精度,考察输入输出、列表基础操作与顺序结构知识点。
2. 模拟微信拼手气红包:导入random模块,输入红包总额与个数,随机分配每份金额,要求每份最低0.01元,最后一份兜底剩余金额,输出所有红包明细。
【答案】参考代码:
import random
total = eval(input("输入红包总额:"))
num = eval(input("输入红包个数:"))
pack = []
remain = total
for i in range(num - 1):
# 保证后续剩余红包每份至少0.01元
m = round(random.uniform(0.01, remain - 0.01*(num-i-1)), 2)
pack.append(m)
remain -= m
pack.append(round(remain, 2))
print("拼手气红包:", pack)
【解析】综合考察random.uniform随机函数、for循环、浮点数精度兜底逻辑,是本节课红包实战的核心代码,覆盖循环与随机数综合应用。
3. 自定义迭代器类NumIter,遵循迭代器协议,实现依次输出1~n的所有整数,使用for循环完成遍历测试。
【答案】参考代码:
class NumIter:
def __init__(self, n):
self.max = n
self.current = 1
def __iter__(self):
return self
def __next__(self):
if self.current > self.max:
raise StopIteration
res = self.current
self.current += 1
return res
# 测试代码
obj = NumIter(5)
for i in obj:
print(i)
【解析】手动实现迭代器协议的两个魔术方法,理解迭代器底层工作原理,区分类实现迭代器与可迭代对象的差异,覆盖迭代器核心知识点。
4. 编写生成器函数money_gen,传入红包总额与份数,通过yield惰性逐个产出拼手气红包金额,使用next()依次取出每一份红包。
【答案】参考代码:
import random
def money_gen(total, count):
remain = total
for i in range(count - 1):
m = round(random.uniform(0.01, remain - 0.01*(count-i-1)), 2)
yield m
remain -= m
yield round(remain, 2)
# 测试调用
g = money_gen(50, 3)
print(next(g))
print(next(g))
print(next(g))
【解析】结合红包业务场景考察yield生成器,通过惰性计算逐个产出红包金额,体现生成器节省内存的优势,覆盖生成器与红包实战两大核心知识点。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$