一、生成器练习:
1、自定义函数模拟range(1,7,2)
def my_range(start,stop,step=1):
while start<stop:
yield start
start+=step
obj=my_range(1,7,2)
print(next(obj))
print(next(obj))
print(next(obj))
print(next(obj)) #StopIteration 为什么不能在函数里面加异常处理的原因是,只有在取值的时候才会有异常,函数中没涉及取值
2、模拟管道,实现功能:tail -f access.log | grep '404'
def tail(file):
import time
with open(file,'rb') as f:
f.seek(0,2)
while True:
line = f.readline()
if line:
# print(line)
yield line
else:
# continue 不要直接continue,会变成死循环 消耗资源
time.sleep(0.05)
def grep(lines,pattern):
for line in lines:
line = line.decode('utf-8')
if pattern in line:
yield line
for line in grep( tail('access.log'),'404'):
print(line, end='')
附加:另一个向access.log文件里面输入字符的py程序
with open('access.log','a',encoding='utf-8') as f:
f.write('出错啦404\n')
f.flush()
3、编写装饰器,实现初始化协程函数的功能
4、实现功能:grep -rl 'python' /etc
二、声明式编程练习题
1、将names=['egon','alex_sb','wupeiqi','yuanhao']中的名字全部变大写
names=['egon','alex_sb','wupeiqi','yuanhao']
names=[name.upper() for name in names]
print(names)
2、将names=['egon','alex_sb','wupeiqi','yuanhao']中以sb结尾的名字过滤掉,然后保存剩下的名字长度
names=['egon','alex_sb','wupeiqi','yuanhao']
names=[name for name in names if name.endswith('sb') ]
print(names)
3、求文件a.txt中最长的行的长度(长度按字符个数算,需要使用max函数)
with open('a.txt','r',encoding='utf-8') as f:
print(max(len(line) for line in f))
4、求文件a.txt中总共包含的字符个数?思考为何在第一次之后的n次sum求和得到的结果为0?(需要使用sum函数)
with open('a.txt', 'r', encoding='utf-8') as f:
print(sum(len(line) for line in f))
print(sum(len(line) for line in f)) #求包换换行符在内的文件所有的字符数,为何得到的值为0?
5、思考题
with open('a.txt') as f:
g=(len(line) for line in f)
print(sum(g)) #为何报错?
6、文件shopping.txt内容如下
mac,20000,3
lenovo,3000,10
tesla,1000000,10
chicken,200,1
求总共花了多少钱?
打印出所有商品的信息,格式为[{'name':'xxx','price':333,'count':3},...]
求单价大于10000的商品信息,格式同上
#每次必须重新打开文件或seek到文件开头,因为迭代完一次就结束了
with open('a.txt',encoding='utf-8') as f:
info=[line.split() for line in f]
cost=sum(float(unit_price)*int(count) for _,unit_price,count in info)
print(cost)
with open('a.txt',encoding='utf-8') as f:
info=[{
'name': line.split()[0],
'price': float(line.split()[1]),
'count': int(line.split()[2]),
} for line in f]
print(info)
with open('a.txt',encoding='utf-8') as f:
info=[{
'name': line.split()[0],
'price': float(line.split()[1]),
'count': int(line.split()[2]),
} for line in f if float(line.split()[1]) > 10000]
print(info)
三、阶段性练习
1、文件内容如下,标题为:姓名,性别,年纪,薪资
egon male 18 3000
alex male 38 30000
wupeiqi female 28 20000
yuanhao female 28 10000
要求:
从文件中取出每一条记录放入列表中,
列表的每个元素都是{'name':'egon','sex':'male','age':18,'salary':3000}的形式
2、根据1得到的列表,取出薪资最高的人的信息
3、根据1得到的列表,取出最年轻的人的信息
4、根据1得到的列表,将每个人的信息中的名字映射成首字母大写的形式
5、根据1得到的列表,过滤掉名字以a开头的人的信息
6、使用递归打印斐波那契数列(前两个数的和得到第三个数,如:0 1 1 2 3 4 7...)
7、一个嵌套很多层的列表,如l=[1,2,[3,[4,5,6,[7,8,[9,10,[11,12,13,[14,15]]]]]]],用递归取出所有的值
#1
with open('db.txt') as f:
items=(line.split() for line in f)
info=[{'name':name,'sex':sex,'age':age,'salary':salary} \
for name,sex,age,salary in items]
print(info)
#2
print(max(info,key=lambda dic:dic['salary']))
#3
print(min(info,key=lambda dic:dic['age']))
# 4
info_new=map(lambda item:{'name':item['name'].capitalize(),
'sex':item['sex'],
'age':item['age'],
'salary':item['salary']},info)
print(list(info_new))
#5
g=filter(lambda item:item['name'].startswith('a'),info)
print(list(g))
#6
#非递归
def fib(n):
a,b=0,1
while a < n:
print(a,end=' ')
a,b=b,a+b
print()
fib(10)
#递归
def fib(a,b,stop):
if a > stop:
return
print(a,end=' ')
fib(b,a+b,stop)
fib(0,1,10)
#7
l=[1,2,[3,[4,5,6,[7,8,[9,10,[11,12,13,[14,15]]]]]]]
def get(seq):
for item in seq:
if type(item) is list:
get(item)
else:
print(item)
get(l)