Python 学习笔记 16 内置函数3,匿名函数 ,员工信息作业
一、内置函数3
# reversed()
# l = [1,2,3,4,5]
# l.reverse()
# print(l)
# l = [1,2,3,4,5]
# l2 = reversed(l)
# print(l,l2)
# for i in l2:
# print(i)
# 保留原来列表,返回一个反向的迭代器
# l = (1,2,23,213,5612,342,43)
# sli = slice(1,5,2)
# print(sli)
# print(l[sli])
# print(l[1:5:2])
#
# print(format('test','<20'))
# print(format('test','>20'))
# print(format('test','^20'))
# bytes: 转换成bytes类型
# 我拿到的是gbk编码的,我想转成utf-8编码
# print(bytes('你好',encoding='gbk')) # unicode转换成GBK的bytes
# print(bytes('你好',encoding='utf-8')) # unicode转换成GBK的bytes
# 网络编程 只能传二进制
# 照片和视频也是以二进制存储
# html网页爬虫取到的也是编码
# b_array = bytearray('你好',encoding='utf-8')
# print(b_array)
# print(b_array[0],len(b_array))
# '\xe4\xbd\xa0\xe5\xa5\xbd'
# s1 = 'alexa'
# s2 = 'alexb'
# l = 'ahfjskjlyhtgeoahwkvnadlnv'
# l2 = l[:10]
# 切片 —— 字节类型 不占内存
# 字节 —— 字符串 占内存
# print(ord('好'))
# print(ord('1'))
# print(chr(97))
#
# print(ascii(1))
# print(ascii('你好'))
# print(ascii('a'))
# print(repr('1'))
# print(repr(1))
# name = 'egg'
# print('你好%r'%name)
# all有一个为False,就会返回一个False
# print(all(['a','',123]))
# print(all(['a',123]))
# print(all([0,123]))
# any有一个为True,就会返回一个True
# print(any(['',True,0,[]]))
# zip
# l = [1,2,3,4,5]
# l2 = ['a','b','c','d']
# l3 = ('*','**',[1,2])
# d = {'k1':1,'k2':2}
# for i in zip(l,l2,l3,d):
# print(i)
# filter返回的是个可迭代的序列
# def is_odd(x):
# return x % 2 == 1
#
# ret = filter(is_odd,[1,6,7,12,17])
# 上面可以简写成
## ret = [i for i in [1,4,6,7,9,12,17] if i % 2 == 1]
# print(ret)
# def is_str(s):
# return s and str(s).strip()
#
# ret = filter(is_str,[1,'hello','',' ',None,[],6,7,'world',12,17])
# print(ret)
# for i in ret:
# print(i)
# 例题
# 求100以内的立方根是整数的
# from math import sqrt
# def func(num):
# ret = sqrt(num)
# return ret % 1 == 0
#
# ret = filter(func,range(1,101))
# for i in ret:
# print(i)
# ret = map(abs,[1,-4,6,-8])
# print(ret)
# for i in ret:
# print(i)
# filter 执行了filter之后的结果集合 <=执行之前的个数
#filter只管筛选,不会改变原来的值
# map 执行前后元素个数不变
# 值可能发生改变
# l = [1,-4,6,5,-10]
# l.sort(key=abs) #在原列表的基础上进行排序
# # l.sort()
# print(l)
# print(sorted(l,key=abs,reverse=True)) # 生成了一个新列表,不改变原列表,占内存
# print(l)
# 例题
# l = [' ',[1,2],'hello world']
# new_1 = sorted(l,key=len)
# print(new_1)
二、匿名函数 lambda
# def add(x,y):
# return x+y
# 上面可以写成:
# add = lambda x,y:x+y
# 有lambda就是匿名函数
# print(add(1,2))
# 找出value值最大的key值
# dic = {'k1':10,'k2':100,'k3':30}
# def func(key):
# return dic[key]
# print(max(dic,key=func)) #根据返回值判断最大的,返回值最大的那个参数是结果
# 可以简写成
# print(max(dic,key=lambda key:dic[key])) #达到匿名效果
# print(max([1,2,3,4,5,-6,-7],key=abs))
# 求数的绝对值
# ret = map(abs,[-1,-2,-3,4])
# for i in ret:
# print(i)
# 求数的平方
# def func(x):
# return x**2
# ret = map(func,[-1,2,-3,4])
# for i in ret:
# print(i)
# ret = map(lambda x:x**2,[-1,2,-3,4])
# for i in ret:
# print(i)
# def func(x):
# return x>10
#
# ret = filter(func,[5,8,11,9,15])
# for i in ret:
# print(i)
# ret = filter(lambda x:x>10,[5,8,11,9,15])
# for i in ret:
# print(i)
# min max filter map sorted -----(参数里都有key关键字)-----lambda
# 例题
# 现有两元组(('a'),('b')),(('c'),('d')),请使用python中匿名函数生成列表[{'a':'c'},{'b':'d'}]
# ret = zip((('a'),('b')),(('c'),('d')))
# def func(tup):
# return {tup[0]:tup[1]}
# l = map(func,ret)
# print(list(l))
# 简写成:
# print(list(map(lambda tup:{tup[0]:tup[1]},zip((('a'),('b')),(('c'),('d'))))))
# 例题
# 以下代码的输出是什么?请给出答案并解释
# def multipliers():
# return [lambda x:i*x for i in range(4)] # 这个时候for循环执行完了,i = 3
#
# print([m(2) for m in multipliers()]) #m是地址
# 改成生成器
# def multipliers():
# return (lambda x:i*x for i in range(4)) # 这个时候for循环执行完了,i = 3
#
# print([m(2) for m in multipliers()])
三、员工信息作业:
实现员工信息表
文件存储格式如下
id,name,age,phone,job
1,Alex,22,13651054608,IT
2,Egon,23,13304780488,Tearcher
3,nezha,25,13334567890,IT
现在需要对这个员工信息文件进行增删改查。
不允许一次性将文件中的行都读入内存。
基础必做:
a.可以进行查询,支持三种语法:
select 列名1,列名2,...where列名条件
支持:大于小于等于,还要支持模糊查找
示例:
select name,age where age>22
select * where job = IT
select * where phone like 133
进阶选做:
b.可创建新员工记录,id要顺序增加
c.可删除指定记录,直接输入员工id即可
d.修改员工信息
语法:set 列名=‘新的值’ where 条件
#先用where查找对应人的信息,再使用set来修改列名对应的值为‘新的值’
注意:要想操作员工信息表,必须先登录,登陆认证需要用装饰器完成
其他需求尽量用函数实现
查的实现方式:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
dic = {'id':0,'name':1,'age':2,'phone':3,'job':4} # 定义一个字典以对应标题 def file_line(filename): with open(filename,encoding='utf-8') as f: for line in f: line = line.strip() line_lst = line.split(',') yield line_lst def content_tiaojian(content,filename): """条件查询""" if '>' in content: col,val = content.split('>') col = col.strip() val = val.strip() for line in file_line(filename): if int(line[dic[col]]) > int(val): yield line elif '<' in content: col,val = content.split('<') col = col.strip() val = val.strip() for line in file_line(filename): if int(line[dic[col]]) < int(val): yield line elif '=' in content: col, val = content.split('=') col = col.strip() val = val.strip() for line in file_line(filename): if line[dic[col]] == val: yield line elif 'like' in content: col,val = content.split('like') col = col.strip() val = val.strip() for line in file_line(filename): if val in line[dic[col]]: yield line def views(content,view_lst,filename): """显示函数,把需要的内容返回给用户""" if '*' in view_lst: view_lst = dic.keys() for line in content_tiaojian(content,filename): # print(line) for k in view_lst: print(line[dic[k]],end='\t') print('') # user_c = input('>>>') # user_c = 'select name,age,job where age<25' # user_c = 'select * where age>22' # user_c = 'select * where job = IT' user_c = 'select * where phone lik 133' view,content = user_c.split('where') view = view.replace('select','').strip() view_lst = view.split(',') views(content,view_lst,'userinfo')
课后作业:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
默写 L = [1,2,3,4] def pow2(x): return x*x print(list(map(pow2,l))) 结果: [1,4,9,16] def is_odd(x): return x % 2 == 1 print(list(filter(is_odd,[1,4,6,7,9,12,17]))) 结果: [1,7,9,17] 员工信息表的作业之前没做完的继续完善,不会做的,作业讲解视频跟一遍 1,整理内置函数的思维导图和博客,周一检查 2,所有标注红色、黄色的方法务必会用,每个方法的用法敲一遍 3,用map来处理字符列表,把列表中所有人都变成sb,比方alex_sb name = ['alex','wupeiqi','yuanhao','nezha'] 4,用filter函数处理数字列表,将例表中所有的偶数筛选出来 num = [1,3,5,6,7,8] 5,随意定一个20行以上的文件 运行程序,先将内容读到内存中,用列表存储。 接收用户输入页码,每页5条,仅输出当页的内容 6,如下每个小字典的name对应股票名字,shares对应多少股,price对应股票的价格 portfolio = [ {'name':'IBM','shares':100,'price':91.1} {'name':'AAPL','shares':50,'price':543.22} {'name':'FB','shares':200,'price':21.09} {'name':'HPQ','shares':35,'price':31.75} {'name':'THOO','shares':45,'price':16.35} {'name':'ACME','shares':75,'price':115.65} ] 6.1,计算购买每支股票的总价 6.2,用filter过滤出单价大于100的股票有哪些
课后作业解答
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# print(list(map(lambda x:x*x,[1,2,3,4]))) # 3,用map来处理字符列表,把列表中所有人都变成sb,比方alex_sb # name = ['alex','wupeiqi','yuanhao','nezha'] # # def func(x): # # return x+'_sb' # # ret = map(func,name) # ret = map(lambda x:x+'_sb',name) # print(list(ret)) # 4,用filter函数处理数字列表,将例表中所有的偶数筛选出来 # num = [1,3,5,6,7,8] # # ret = filter(lambda x:x%2==0,num) # ret = filter(lambda x:True if x%2==0 else False,num) # print(list(ret)) # 5,随意定一个20行以上的文件 # 运行程序,先将内容读到内存中,用列表存储。 # 接收用户输入页码,每页5条,仅输出当页的内容 """ def file_open(filename): with open(filename,encoding='utf-8') as f: l = f.readlines() return l l = file_open('userinfo') pages,mod = divmod(len(l),5) if mod: pages += 1 pages_raw = int(input('请输入页码:')) # 1 if pages_raw == pages and mod !=0: for i in range(mod): print(l[(pages_raw-1)*5+i].strip()) elif pages_raw < pages and pages_raw > 0: for i in range(5): print(l[(pages_raw-1)*5+i].strip()) else:print('你输入的页码有误') """ # 6,如下每个小字典的name对应股票名字,shares对应多少股,price对应股票的价格 # portfolio = [ # {'name':'IBM','shares':100,'price':91.1}, # {'name':'AAPL','shares':50,'price':543.22}, # {'name':'FB','shares':200,'price':21.09}, # {'name':'HPQ','shares':35,'price':31.75}, # {'name':'THOO','shares':45,'price':16.35}, # {'name':'ACME','shares':75,'price':115.65} # ] # # 6.1,计算购买每支股票的总价 # 6.2,用filter过滤出单价大于100的股票有哪些 # 定义函数方式: # def func(x): # return {x['name']:round(x['price']*x['shares'],4)} # ret = map(func,portfolio) # 匿名函数方式: # ret = map(lambda x:{x['name']:round(x['price']*x['shares'],4)},portfolio) # print(list(ret)) # 定义函数方式: # def func(x): # return x['price']>100 # g = filter(func,portfolio) # 匿名函数方式: # g = filter(lambda x:x['price']>100,portfolio) # for i in g: # print(i)