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来修改列名对应的值为‘新的值’
注意:要想操作员工信息表,必须先登录,登陆认证需要用装饰器完成
其他需求尽量用函数实现

查的实现方式:
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')
员工信息--查

 课后作业:

默写
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的股票有哪些
作业

课后作业解答

# 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)
作业

 

posted @ 2019-08-18 16:01  休由  阅读(209)  评论(0编辑  收藏  举报