首页   注册   登录
 ropon 最近的时间轴更新

ropon

V2EX 第 185993 号会员,加入于 2016-08-08 15:18:15 +08:00
请求 Python 相关的小知识点
问与答  •  ropon  •  18 天前  •  最后回复来自 ClutchBear
1
微信发红包算法,求助
Python  •  ropon  •  56 天前  •  最后回复来自 ropon
5
入手千兆路由器疑问
路由器  •  ropon  •  251 天前  •  最后回复来自 zts1993
9
ropon 最近回复了
56 天前
回复了 ropon 创建的主题 Python 微信发红包算法,求助
整理思路如下:

#算法一
#################################################################
def hongbao(amount=5, count=3):
s = []
min = 1 #分
amount = amount * 100 #单位分
max = amount - (count-1) #单位分
for i in range(count-1):
# num = random.randint(0, amount)
num = random.uniform(0, int(amount))
while num < min or num > max:
num = random.uniform(0, int(amount))
amount -= num
s.append(round((num / 100), 2))
s.append(round((amount / 100), 2))
random.shuffle(s)
return s
print(hongbao(1, 6))
##############################################################

算法二
#############################################################
# 0--|----|--------|-----------|-------20
# 0 2 4 10 16 20

def hongbao(amount=10, count=5):
ret = random.sample(range(1, amount * 100), count - 1) #分为单位
ret.extend([0, amount * 100]) #追加多个值 0 amount * 100
ret.sort() #排序
# return [((ret[i+1] - ret[i]) / 100 for i in range(num))] # 列表生产式
for i in range(count):
yield (ret[i+1] - ret[i]) / 100

res = hongbao(10, 6)
for i in res:
print(i)
@ruoxin123
a[1]=a
第一次 a=[1, [1, 2] ] 第二次 a=[1, [1, [1, 2] ] ] 第三次 a=[1, [1, [1, [1, 2] ] ] ]
这样理解对吗
a = [1, 2]
a[1] = a
print(a[1])
补门一个问题
为啥结果是:
[1, [...]]
@xyxc0673 整理如下,看理解对吗?

#总结:推导式有,列表推导式、字典推导式、集合推导式,没有元组推导式
#生成器表达式:(结果 for 变量 in 可迭代对象 if 条件) 生成器表达式可直接获取其对象,对象可直接使用 for 循环,生成器具有惰性机制

def add(a, b):
return a + b

def test():
for r_i in range(4):
yield r_i

g = test()
#0 1 2 3

# g = (add(2, i) for i in g)

#g 的值是
# (
# add(2, 0),
# add(2, 1),
# add(2, 2),
# add(2, 3)
# )

# g = (add(10, i) for i in g)

#g 的值是
# (
# add(10, add(2, 0)),
# add(10, add(2, 1)),
# add(10, add(2, 2)),
# add(10, add(2, 3))
# )
#遍历生成器开始运算输出结果
# print(list(g))
#输出[12, 13, 14, 15]

for n in [2, 10]:
# g = [add(n, i) for i in g] #列表生成式会一次性进行所有的运算
# 第一次循环 n=2,i 第一次循环 0 相加结果 2 3 4 5
# 第二次循环 n=10,i 第一次循环 2 相加结果 12 13 14 15

g = (add(n, i) for i in g) # 生成器表达式只有在被遍历时才会进行运算
#第一次循环 n=2,i 从 0 1 2 3 循环,因生成器具有惰性机制,n 并没有取对应值,只是指向对应内存地址,g 的值是
# (
# add(n, 0),
# add(n, 1),
# add(n, 2),
# add(n, 3)
# )
#第二次循环 n=10,i 从 add(2, 0) add(2, 1) add(2, 2) add(2, 3)循环,同理,g 的值是
# (
# add(n, add(n, 0)),
# add(n, add(n, 1)),
# add(n, add(n, 2)),
# add(n, add(n, 3))
# )
#for 循环完,系统会释放 n,释放之前 n 先取值,g 的值是
# (
# add(10, add(10, 0)),
# add(10, add(10, 1)),
# add(10, add(10, 2)),
# add(10, add(10, 3))
# )
#遍历生成器开始运算输出结果
print(list(g))
#输出[20, 21, 22, 23]
@xyxc0673 原来如此,明白了,感谢
@goofool 10+10+i 是怎么来的呢
@xyxc0673 逐级遍历吧
比如一开始 g 是 0 1 2 3,第一次循环 的第一次遍历
2 1 2 3
2 3 2 3
2 3 4 3
2 3 4 5

这样理解对么
如果遍历一次生成器表达式,那么 g 就没值了,生成器表达式 g = (add(n, i) for i in g) for i in g 不会遍历 g 么
换成列表生产式 g = [add(n, i) for i in g],for 和单独传值结果一致[12, 13, 14, 15],不明白是怎么推算出[20, 21, 22, 23],for 第二次循环会覆盖上次循环的值吧。
251 天前
回复了 ropon 创建的主题 路由器 入手千兆路由器疑问
@Telegram feixun ?
关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2797 人在线   最高记录 4019   ·  
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.1 · 17ms · UTC 11:35 · PVG 19:35 · LAX 03:35 · JFK 06:35
♥ Do have faith in what you're doing.
沪ICP备16043287号-1