Day16 of learning python--部分内置函数和匿名函数
1.重点掌握的四个内置函数,zip,filter,map,sorted
(1)zip,连接不同的列表,组成元组,返回的是一个可迭代的内存地址
l= [1,2,3] l2 = ['a','b','c'] for i in zip(l,l2): print(i) 结果: (1, 'a') (2, 'b') (3, 'c')
(2)filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。
#从一个list[1,2,3,4,5,6,7]中删除偶数,保留奇数 def is_odd(x): return x%2 == 1 # return type(x) == str 判断是不是字符串 ret = filter(is_odd,[1,2,3,4,5,6,7]) print(ret) for i in ret: print(i) # ret = [i for i in [1,2,3,4,5,6,7] if i%2 == 1] # print(ret) 结果为: [1,3,5,7]
def is_str(s): return s and str(s).strip() # 去掉空字符串,删除None ret = filter(is_str,[1,'hello','',' ',None,[],'hello world',12,13]) for i in ret: print(i)
请利用filter()过滤出1~100中平方根是整数的数,即结果应该是: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] import math def is_sqr(x): return math.sqrt(x) % 1 == 0 print(list(filter(is_sqr, range(1, 101))))
(3)map,Python中的map函数应用于每一个可迭代的项,返回的是一个结果list。如果有其他的可迭代参数传进来,map函数则会把每一个参数都以相应的处理函数进行迭代处理。map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。
ret = map(abs,[1,2,3,-8]) print(ret) for i in ret: print(i) 结果为: 1 2 3 8
filter 执行了filter之后的结果集合 <=执行之前的个数,filter只管筛选,不会改变原来的值
map 执行前后元素个数不变,但是值可能改变了
(4)sorted,对List、Dict进行排序,Python提供了两个方法
方法1.用List的成员函数sort进行排序,在本地进行排序,不返回副本
方法2.用built-in函数sorted进行排序(从2.4开始),返回副本,原始输入不变
l = [1,-5,6,7,-10] l.sort(key=abs) # 在原列表的基础上进行排序 print(l) 结果:[1, -5, 6, 7, -10] print(sorted(l,key=abs,reverse=True)) # 直接创建新的列表,但是要慎用,因为会占内存,不改变原有的列表 print(l) 结果:[-10, 7, 6, -5, 1],[1, -5, 6, 7, -10],[[1, 2], ' ', 'hello world'] l = [' ',[1,2],'hello world'] # 按照长度排序 new_l = sorted(l,key=len) # len也是一个函数名 以什么进行排序 print(new_l)
结构为:sorted(iterable, key=None, reverse=False)
参数说明:
iterable:是可迭代类型;
key:传入一个函数名,函数的参数是可迭代类型中的每一项,根据函数的返回值大小排序;
reverse:排序规则. reverse = True 降序 或者 reverse = False 升序,False默认值。
返回值:有序列表
2.其他的内置函数
(1)reversed(),反转,返回的是一个可迭代的
# reversed() l = [1,2,3,4,5] # l.reverse() # print(l) l2 = reversed(l) # 保留原列表,返回一个反向迭代器 print(l2)
(2)slice,切片规则
print(format('test','<20')) # 开20的空间,左对齐 print(format('test','>20')) # 开20的空间,右对齐 print(format('test','^20')) # 开20的空间,居中
(3)bytes,转换成bytes类型
在内存的存储方式都是unicode,文件存储都是gbk或者utf-8等。我拿到的是gbk编码,我想转换成utf-8编码。注意:网络编程,只能传二进制,照片和视频也是以二进制存储,html网页爬取到的也是bytes编码
print(bytes('你好',encoding='gbk').decode('gbk')) # unicode转换成GBK的bytes,再以'gbk'解码成unicode print(bytes('你好',encoding='utf-8')) # unicode转换成utf-8的bytes 结果: 你好 b'\xe4\xbd\xa0\xe5\xa5\xbd'
(4)bytearray,转换成bytes的组合,可以通过修改其中的数值,来改变原来编码之前的字符串
b_array = bytearray('你好',encoding='utf-8') print(b_array) print(b_array[0]) 结果: bytearray(b'\xe4\xbd\xa0\xe5\xa5\xbd') 228
(5)ord,字符按照unicode转数字。chr 数字按照unicode转字符。ascii,只要是ascii码中的内用就打印出来,不是就是转换成\u
print(ascii('你好')) name = 'egg' print('你好%r'%name) 结果: '\u4f60\u597d' 你好'egg'
(6)repr,全打印
print(repr('1')) print(repr(1)) print('1') 结果: '1' 1 1
(7)all 判断是否有bool值为False的值,any 判断是否有bool值为True的值
print(all['a','',123]) print(any['a','',123]) 结果: True True
3.匿名函数

函数名 = lambda 参数 :返回值 #参数可以有多个,用逗号隔开 #匿名函数不管逻辑多复杂,只能写一行,且逻辑执行结束后的内容就是返回值 #返回值和正常的函数一样可以是任意数据类型
#这段代码 def calc(n): return n**n print(calc(10)) #换成匿名函数 calc = lambda n:n**n print(calc(10))
dic = {'k1':10,'k2':100,'k3':30}
print(max(dic,key=lambda k:dic[k])) #根据返回值判断最大值,返回值最大的那个参数是结果
lambda经常和min,max,filter,map,sorted搭配使用
res = map(lambda x:x**2,[1,5,7,4,9]) for i in res: print(i) res = filter(lambda x:x>10,[5,6,10,9,15]) for i in res: print(i) 结果为: 1 25 49 16 81 15
# 现有两元组(('a'),('b')),(('c'),('d')),请使用python中匿名函数生成列表{'a': 'c', 'b': 'd'},[{'a':'c'},{'b':'d'}] # res = lambda x,y:zip(x,y) # print(dict((res((('a'),('b')),(('c'),('d')))))) res = list(map(lambda t:{t[0]:t[1]},zip((('a'),('b')),(('c'),('d'))))) #zip 出来的是一个迭代器 print(res) res = lambda t1,t2:[{i:j} for i,j in zip(t1,t2)] print(res((('a'),('b')),(('c'),('d'))))
面试题,比较绕
def multipliers(): return [lambda x:i*x for i in range(4)] print([m(2) for m in multipliers()]) 结果是: [6, 6, 6, 6] 正确使用: def multipliers(): return (lambda x:i*x for i in range(4)) #修改为返回一个生成器,这个是一个生成器表达式,含有for print([m(2) for m in multipliers()]) 结果为: [0, 2, 4, 6]
4.作业讲解,处理一个文件,返回所需要返回的内容
dic = {'name':1,'id':0,'age':2,'phone':3,'job':4}
# 读取文件 -- 将文件中的内容整理到内存里
def get_line(filename):
with open(filename,encoding='gbk') as f:
for line in f:
line = line.strip()
line_lst = line.split(',')
yield line_lst
# 处理得到的信息
def condiction_filter(condiction):
condiction = condiction.strip()
if '>' in condiction:
col,val= condiction.split('>')
g = get_line('F:\hello.txt')
for line_lst in g:
if int(line_lst[dic[col]]) > int(val): # 由于分割的是一个字符串
yield line_lst
elif '<' in condiction:
col,val = condiction.split('<')
g = get_line('F:\hello.txt')
for line_lst in g:
if int(line_lst[dic[col]]) < int(val): # 由于分割的是一个字符串
yield line_lst
else:
col, val = condiction.split('=')
g = get_line('F:\hello.txt')
for line_lst in g:
if int(line_lst[dic[col]]) == int(val): # 由于分割的是一个字符串
yield line_lst
# 展示符合条件的员工信息
def views(view_lst,employe):
l = [] # 符合条件的空列表
for i in employe:
for k in view_list:
l.append(i[dic[k]])
print(l)
# 接收用户的信息 --分析信息
# ret = input('>>>')
ret = 'select name,age where age=22'
view,condiction = ret.split('where')
view = view.replace('select','').strip()
view_list = view.split(',')
# print(view_list,condiction)
employe = condiction_filter(condiction)
views(view_list,employe)
浙公网安备 33010602011771号