递归、堆栈练习
练习题
1. 发红包
sort
sort() 与 sorted() 区别:
sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
list 的 sort 方法返回的是对已经存在的列表进行操作,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。
示例:
>>> students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
>>> sorted(students, key=lambda s: s[2]) # 按年龄排序
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
>>> sorted(students, key=lambda s: s[2], reverse=True) # 按降序
[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
lambda 只返回5:
a = lambda :5
print(a())
print(a) 是函数的内存地址
相当于:
def func():
return 5
函数没有形参。
sum()
>>>sum([0,1,2])
3
>>> sum((2, 3, 4), 1) # 元组计算总和后再加 1
10
>>> sum([0,1,2,3,4], 2) # 列表计算总和后再加 2
12
发红包(生成器版本):
import random
def red_packet(money,num):
ret = random.sample(range(1,money*100),num)
ret.extend([0,money*100])
ret.sort()
for i in range(num):
yield (ret[i+1] - ret[i])/100
for i in red_packet(200,10):
print(i)
# print(red_packet(100,10).__next__())
# print(red_packet(100,10).__next__())
2. 计算文件夹大小---递归
到底在什么时候停止,返回值
每一层往下递,执行完成之后返回给调用他的地方,即归。
递归实现:
import os
def file_size(path):
ret = os.listdir(path)
total = 0
for name in ret:
abs_path = os.path.join(path,name)
if os.path.isdir(abs_path):
total += file_size(abs_path)
elif os.path.isfile(abs_path):
total += os.path.getsize(abs_path)
return total
ret = file_size(r'C:\Users\Administrator\PycharmProjects\oldboy\day09')
print(ret)
堆栈实现:
栈是一种计算机存储数据的思想,先进后出
import os
path = r'C:\Users\Administrator\PycharmProjects\oldboy\day09'
li = [path]
total = 0
while li:
path = li.pop()
for i in os.listdir(path):
abs_path = os.path.join(path,i)
if os.path.isdir(abs_path):
li.append(abs_path)
else:
total += os.path.getsize(abs_path)
print(total)
3. 三级菜单
menu = {
'北京': {
'海淀': {
'五道口': {
'soho': {},
'网易': {},
'google': {}
},
'中关村': {
'爱奇艺': {},
'汽车之家': {},
'youku': {},
},
'上地': {
'百度': {},
},
},
'昌平': {
'沙河': {
'老男孩': {},
'北航': {},
},
'天通苑': {},
'回龙观': {},
},
'朝阳': {},
'东城': {},
},
'上海': {
'闵行': {
"人民广场": {
'炸鸡店': {}
}
},
'闸北': {
'火车战': {
'携程': {}
}
},
'浦东': {},
},
'山东': {},
}
递归实现
def func(dic):
while True:
for i in dic.keys():
print(i)
choose = input(">>>")
if choose in dic.keys():
ret = func(dic[choose])
if ret == 'q': return 'q'
elif choose == 'b':
return 'b'
elif choose == 'q':
return 'q'
func(menu)
print('函数执行完成!~!')
堆栈实现
l = [menu]
while l:
for key in l[-1]:print(key)
k = input('input>>').strip() # 北京
if k in l[-1].keys() and l[-1][k]:l.append(l[-1][k])
elif k == 'b':l.pop()
elif k == 'q':break
My name is 侯冰雷
~~欢迎转载
~~欢迎关注
~~欢迎留言