1,大作业,yield 返回之后可以对数据进行处理了就,注意函数的解耦,每一个小功能写成一个函数,增强可读性,写之前自己要先把整体功能分块,先做什么,在做什么

  1. # 现在需要对这个员工信息文件进行增删改查。
  2.  
  3. # 可以进行查询,支持三种语法:
  4. # 支持:大于小于等于,还要支持模糊查找。
  5. # 示例:
  6. # select name, age where age>22
  7. # select * where job=IT
  8. # select * where phone like 133
  9.  
  10. # 用户信息处理-分析信息
  11. # user_msg = input('>>>')
  12. user_msg = 'select * where age>22' # 规律都有where
  13. view,condition= user_msg.split('where') # 查询内容,查询条件,拆包
  14.  
  15. # view = view.split('select').pop().strip() # strip不可以去掉完整的字符串,split前面字典必然有个空值,因为是从头开始切得
  16. view = view.replace('select','').strip() # 和上一句效果一样的
  17. view_list = view.split(',')
  18.  
  19. # 读取文件 ---将文件内容整理
  20. def get_line(filename):
  21. '''
  22. 返回员工的列表
  23. :param filename:
  24. :return:
  25. '''
  26. with open(filename,encoding='utf-8') as f1:
  27. for line in f1:
  28. line = line.strip()
  29. list_line = line.split(',')
  30. yield list_line # 这一句是关键,信息可以拿出去处理了
  31.  
  32. dic = {'name':1,'id':0, 'age':2,'phone':3,'job':4}
  33.  
  34. def condition_filter(condition):
  35. '''条件筛选'''
  36. print(condition)
  37. condition = condition.strip()
  38. if '>' in condition:
  39. col,value = condition.split('>')
  40. print(col,value)
  41. g_line = get_line('employ_list.txt')
  42. for line in g_line:
  43. if int(line[dic.get(col)]) > int(value):
  44. yield line
  45.  
  46. # 尽量做到程序的解耦,就是把它拆分成几个函数去完成
  47. def view(view_list,staff_g):
  48. '''展示符合条件的员工信息'''
  49.  
  50. for staff in staff_g:
  51. if '*' in view_list:
  52. view_list = dic.keys()
  53.  
  54. for i in view_list:
  55. print(staff[dic[i]],end=' ')
  56. print('\r')
  57.  
  58. staff_g = condition_filter(condition)
  59. view(view_list,staff_g)

2,凡是参数里面带key的要特别记忆一下,因为可能会在面试题里面考试,目前就是min和max函数,另外,min和max可以接受多个参数,sum只可以接收iterable和start并且只能是数字

3,数据结构相关的24个,先说序列,list和tuple 函数,这两个只有在数据类型强制转换的时候才会用

4,数据类型:int,bool,和其他的很多;数据结构:指的是容器相关的,list,tuple,set,str,dic,tuple和dict是Python独有的,别的语言没有,所以这两个一定不要忘了

5,reversed 函数

  1. # 这个的话,原来的函数就不存在了
  2. l = [1,2,3,4,5]
  3. l.reverse()
  4. print(l)
  5.  
  6. l = [1,2,3,4,5]
  7. l2 = reversed(l)
  8. print(l) # 首先原来的列表没变
  9. print(l2) # 第二给出了迭代器,不改变原列表,返回反序的迭代器
  10.  
  11. 运行结果:
  12. [5, 4, 3, 2, 1]
  13. [1, 2, 3, 4, 5]
  14. <list_reverseiterator object at 0x10b1397b8>

6,slice切片函数,注意内置函数是不需要用点来调用的,都可以直接用的

  1. l = [145,221,45,67,56,789,222,334,556,54]
  2. sli = slice(1,6,2) # 只是给出一个切片规则
  3. print(l[sli]) #这两句效果是一样的
  4. print(l[1:6:2])# 其实内部流程是一样的,也是一种语法糖
  5.  
  6. 运行结果:
  7. [221, 67, 789]
  8. [221, 67, 789]

7,字符串相关的函数,首先format函数

  1. str.format() # 这个是字符串的format格式化输出
  2. format() # 内置函数的format非常的强大,有很多的功能,这里简单写几个

8,和小数相关的,数学相关的,非常强大,有兴趣可以去专门研究

  1. print(format('test','<20')) # 20个空间,左对齐
  2. print(format('test','>20')) # 20个空间,右对齐
  3. print(format('test','^20')) # 20个空间,居中

9,bytes函数,转换成bytes类型,其实读到内存里面都是Unicode的,我们想把它转成UTF-8,我们是把他转换成了bytes类型的utf-8,为何要转换成bytes?主要原因:

  1. # bytes()函数就是把unicode转换成GBK或者是utf-8,哪些情况需要转呢,比方说我拿到了GBK想转换为UTF8
  2. # 就需要先decode 成Unicode,在encode成utf-8
  3. print(bytes('你好',encoding='GBK')) # unicode 转换成GBK的bytes
  4. print(bytes('你好',encoding='utf-8')) # Unicode转换成utf-8的bytes
  5. print(bytes('你好',encoding='GBK').decode('GBK'))
  6. # 文件里面存的是GBK,我想存储UTF-8格式的,读到内存里,内存转换成Unicode,这个转换的过程是decode的,然后从内存里面拿出来
  7. # 转换成utf-8的,这个过程是encode的过程,编码,bytes过程
  8.  
  9. # 网络编程,网络传输的角度,两个机器想要进行通信,只能传递二进制
  10. # 照片和视频也只能是二进制传输
  11. # 文件存储,平时写进去,读出来,已经指定编码了,二进制,就是bytes
  12. # HTML 爬取到的也是二进制编码
  13. # 工作的时候,编码是个大工程,一定要学好
  14. # 2.7里面编码是混乱的,Python3记住这几个就好,
  15.  
  16. 运行结果:
  17. b'\xc4\xe3\xba\xc3'
  18. b'\xe4\xbd\xa0\xe5\xa5\xbd'

10,bytearray函数,用的不多,byte类型的一个数组,好处是修改字符串的时候可以节省内存,不好的地方麻烦,只能通过字符编码来改,例如把你改成您

  1. # 发现规律了吗?
  2. b_array = bytearray('你好',encoding="utf-8")
  3. print(b_array)
  4. # bytearray(b'\xe4\xbd\xa0\xe5\xa5\xbd')
  5. print(b_array[0])
  6. print(hex(b_array[0]))
  7. print(hex(b_array[1]))
  8.  
  9. s1 = 'lisa'
  10. s2 = 'lisa2' # 当然我们可以按照自己改,但是比较麻烦,还要查编码,用的不多,了解一下就行
  11.  
  12. 运行结果:
  13. bytearray(b'\xe4\xbd\xa0\xe5\xa5\xbd')
  14. 228
  15. 0xe4
  16. 0xbd

11,memoryview这个用的也不多,但要知道的,更鸡肋的功能,memoryview是一个字节类型的切片,你能看到的只是字节,不占用内存,只是给你看看,但是转成字符串又开始占内存了

memoryview切的时候就不占了,不给你,只给你看看,只是从原来的内存里拿一部分给你看,根据字节也不好操作,不用太研究

  1. s ='jdshfiuascidjhueughiqlbi'
  2. s2 = s[:10] #不用memoryview 每切一次都会创建一个新的

12,字符按照Unicode转换成数字ord函数

  1. # 参数必须是字符类型
  2. print(ord('a'))
  3. print(ord(''))
  4. print(ord('好')) # 中文也可以检测,是按照Unicode来转换的
  5. 运行结果:
  6. 97
  7. 49
    22909

13,数字按照Unicode转成字符,和上一个刚好相反

  1. print(chr(68))
  2. print(chr(98))
  3.  
  4. #没有的结果为空
  5. 运行结果:
  6. D
  7. b

14,ASCII函数,如果是ASCII中的,就打印ASCII码,不是就打印出\u...这个方法了解一下就行,用的不多

  1. print(ascii('你'))
  2. print(ascii("a"))
  3.  
  4. 运行结果:
  5. '\u4f60'
  6. 'a'

15,下面这个方法用的比较多repr方法

  1. name = 'lisa'
  2. print("你好%s"%name) # %s str
  3. print("你好%r"%name) # %r repr,其实内部就是调用了repr方法
  4.  
  5. # 带着符号就打出字符串了,后面面向对象还会讲,其实是一个很神奇的函数
  6. # 原封不动的输出某个变变量
  7. print(repr(1))
  8. print(repr(''))
  9. # 所有的字符串在这里都会原形毕露,防止你忘了是字符串类型,这里了解一下就好,
  10.  
  11. 运行结果:
  12. 你好lisa
  13. 你好'lisa'
  14. 1
  15. ''

16,下面讲解数据集合,set,frozenset和dict方法,有没有发现,只要是大括号括起来的,都是无序的,set类似于字典的key,就是没有value的字典,可哈希,不重复,和字典要求一样,frozenset之后就不可以变了,frozen之后就可以做字典的key了

17,比较重要的,len,enumerate这个不写了,由于很熟悉了。

18,两个需要了解一下的函数,注意参数必须是iterabal的,不然后报错

  1. # 判断是否有bool值是false的值,也就是全为真值,最后结果才为真,有一个false整体就是false
  2. print(all(range(10)))
  3. print(all([1,'',9]))
  4. print(all([1,' ',9])) # 控制也代表有值,就代表这个字符串不为空
  5. print(bool('')) # 注意空串和空值的区别,只有是空串的时候才为false
  6. print(bool(' '))
  7. print('***************************')
  8.  
  9. # 判断是否有bool值为true的值,有一个false,整体就是false
  10. print(any([1,'',2]))
  11. print(any([1,' ',2]))
  12. print(any([0,'',()]))
  13.  
  14. 运行结果:
  15. False
  16. False
  17. True
  18. False
  19. True
  20. ***************************
  21. True
  22. True
  23. False

19,zip,filter,sored,map非常重要的四个函数,zip 有拉链的意思,

  1. # 拉链方法
  2. list1=[1,2,3]
  3. list2=['a','b','c']
  4. list3 =['*','**',[],'pp']
  5. dict1 = {'k1':1,'k2':2}
  6. z1= zip(list1,list2)
  7.  
  8. print(z1) # <zip object at 0x10cf51388>,这个地方一看是个内存地址,就要猜测是个迭代器了,
  9. # 因为我们知道他是有多个值的,有时候迭代器不会明确说自己是迭代器的,我们要去猜,只要可迭代,就可以循环
  10. print("__next__" in dir(zip))
  11. for i in z1:
  12. print(i)
  13.  
  14. # 可以拉上不同类型的可迭代对象,不同数量,拉最少的数量,字典只是拉上key,字典很多时候都只是key,返回元祖,因为字典无序,所以有时候,顺序会颠倒的
  15. print('**************************')
  16. z2 = zip(list1,list2,list3,dict1)
  17. for i in z2:
  18. print(i)
  19.  
  20. 运行结果:
  21. <zip object at 0x10258e408>
  22. True
  23. (1, 'a')
  24. (2, 'b')
  25. (3, 'c')
  26. **************************
  27. (1, 'a', '*', 'k1')
  28. (2, 'b', '**', 'k2')

20,filter,非常重要的,像什么?像生成器表达式,和filter的效果是一样的,只是形式不一样,它里面的函数可以做的事情比生成式多。只做过滤,满足条件的筛选出来,注意return这儿,很多时候都可以简化

  1. def is_odd(x):
  2. return x%2 == 1 # 本身就能代表真假,必须返回bool值,
  3.  
  4. # 接收两个参数,第一个是一个函数地址,也就是函数名,第二个参数是一个可迭代的,会把第二个里面每一个元素作为参数传递到第一个函数里面,根据
  5. # 返回是true或者false来决定你是否在我筛选的范围之内
  6. ret = filter(is_odd,[1,2,3,4,5,6,7,8,9])
  7. print(ret) # 返回也是迭代器
  8. for i in ret: #只要函数return是True就返回列表里面的原值,这里循环就可以取出
  9. print(i)
  10.  
  11. # ret = [i for i in[1,2,3,4,5] if i%2==1] 和生成式表达式一样的
  12. # 这里不能推理出过程,必须记忆一下
  1. # 判断是否是字符串
  2. def is_str(x):
  3. return type(x) == str
  4. # 这个fiter可以做很多事情的,我们可以删除None或者空字符串等等
  5. ret = filter(is_str,[1,2,3,'lll',5,' pp',7,8,9]) #这里可以传任何数据类型
  6. for i in ret:
  7. print(i)
  8.  
  9. 运行结果:
  10. lll
  11. pp
  1. # 返回所有bool值不是false的值
  2. def is_str(s):
  3. return s and str(s).strip()
  4. # if type(s) != int:
  5. # return s and s.strip()
  6. # else:
  7. # return s
  8. # 这个fiter可以做很多事情的,我们可以删除None或者空字符串等等
  9. ret = filter(is_str,[0,2,None,'lll','',' ', 'pp',7,8,9]) #这里可以传任何数据类型
  10. for i in ret:
  11. print(i)

21,filter 100以内平方根为整数的值

  1. import math
  2. def is_sqrt(s):
  3. return math.sqrt(s)%1 == 0 # 判断是否是整数,取余1位零就可以了
  4.  
  5. ret = filter(is_sqrt,range(101))
  6. for i in ret:
  7. print(i)
  8. print(int(2.5)) #强转也是整数值了
  9.  
  10. 运行结果:
  11. 0
  12. 1
  13. 4
  14. 9
  15. 16
  16. 25
  17. 36
  18. 49
  19. 64
  20. 81
  21. 100
  22. 2

22,非常重要的map函数,map和filter和列表生成式是分不开的,元列表,按照函数加工,返回值

  1. ret = map(abs,[1,-2,-3,4,-5,6])
  2. print(ret)
  3. for i in ret:
  4. print(i)
    # 输出结果,值变了,但是个数没变,abs的返回值,作为新值返回来
  5. 运行结果:
  6. <map object at 0x1015db630>
  7. 1
  8. 2
  9. 3
  10. 4
  11. 5
  12. 6

23,结论:filter,执行了filter之后的机构集合小于等于执行之前的个数,并且filter只管筛选,不会改变原来的值,map之执行前后元素个数不变,值可能发生改变,二者的参数是一样的,一个函数名,一个iterable.

24,重要的,sorted 函数,排序方法,接收可迭代的类型,和一个函数名,根据要求排序。

  1. l = [1,-8,3,-2,5,6]
  2. # sort,是字符串对象的函数,sorted是内置函数,不用点来调用
  3. l.sort(reverse=True)
  4. print(l)
  5. l.sort(key=abs)
  6. # print(l) # 默认改过之后元列表就不存在和,默认升序,这点和reverse一样,都是原来的列表不存在了,但是,reverse
  7. l = [1,-8,3,-2,5,6]
  8. l.reverse() # 没有key
  9. print(l)
  10.  
  11. ret = sorted(l,key=abs,reverse=True)
  12. print(ret) # 直接返回列表,不修改原来的列表,占内存
  13. ret = reversed(l)
  14. print(ret) # 返回迭代器
  15.  
  16. 运行结果:
  17. [6, 5, 3, 1, -2, -8]
  18. [6, 5, -2, 3, -8, 1]
  19. [-8, 6, 5, 3, -2, 1]
  20. <list_reverseiterator object at 0x108d057b8>

25,另外一个例子,sorted 要慎用,占用内存,和reverse不同,排序要挑算法的,一定要预知所有值,才可以排序,所以和reverse机制是不一样的,reverse只要去指定位置取就可以了,一个一个来,可以用迭代器,排序用不了,尽管占内存,也比已知的所有排序算法好很多,所有自己写的都没有sorted快,实现语言C语言,操作系统也有优化机制,用还是用人家的,自己写的会慢。

  1. l = [' ',[1,2,3,4,5],'hello world']
  2. new_l = sorted(l,key=len,reverse=True) # reverse参数
  3. print(new_l)
  4. 运行结果:
  5. ['hello world', [1, 2, 3, 4, 5], ' ']

26,这个函数也可以是自己定义的,复杂算法,不支持返回可迭代的,也可以根据需求来排序。sorted,min,max,key在后面,并且必须写,map,filter func在前面

  1. def func(item):
  2. return len(item)
  3.  
  4. l = [' ',[1,2,3,4,5],'hello world']
  5. new_l = sorted(l,key=func,reverse=True) # iterable的每个元素作为参数进行计算,和上面的例子是一模一样的
  6. print(new_l)
  7.  
  8. 运行结果:
  9. ['hello world', [1, 2, 3, 4, 5], ' ']

27,最最重要的,匿名函数。匿名函数本身简单,但是难在和其他内置函数一起使用的时候,就比较难了,lambda定义匿名函数,和def差不多

  1. def calc(n):
  2. return n**n
  3. print(calc(5))
  4.  
  5. calc = lambda n:n**n
  6. print(calc(5))
  7. # 函数名 参数:返回值,不允许换行,一行写完
  8. # 参数可以有多个,逗号分隔
  9.  
  10. 运行结果:
  11. 3125
  12. 3125

28,练一练:

  1. def add(x,y):
  2. return x+y
  3. print(add(10,20))
  4.  
  5. add = lambda x,y:x+y
  6. print(add(10,20))
  7.  
  8. 运行结果:
  9. 30
  10. 30

29,匿名函数是可以有函数名字的,整个表达式就是函数名,可以赋值给一个变量,另外一个是,他真的可以匿名,后面的函数,给出的是比较标准,最后结果函数原来的迭代器里面的数字,

  1. dic={'k1':10,'k2':100,'k3':30}
  2.  
  3. print(max(dic)) # 这样的话,默认的是拿key来做比较,所以最大的是k3
  4. print(max(dic,key=lambda k:dic[k])) #拿到value值最大的key,也就是k2,后面的key =给出了比较标准,给出最后还k2
  5. print(dic[max(dic,key=lambda k:dic[k])])
  6.  
  7. 运行结果:
  8. k3
  9. k2
  10. 100

30,带key的函数,min,max,sort map和filter,他们都可以和lambda 合作,一道简单的面试题

  1. d = lambda p:p*2
  2. t = lambda p:p*3
  3. x = 2
  4. x = d(x) #
  5. x = t(x) #
  6. x = d(x) #
  7. print(x)
  8.  
  9. 运行结果:
  10. 24

31,另外一道题,两个元祖联系起来的就是zip函数,应用匿名函数,只要考到匿名函数,一定不是单纯的匿名函数,肯定会用到内置函数,那内置函数就去想那五个函数,个数没变,内容变了,就是map函数,map函数的参数,就是可迭代对象的元素

  1. # 现有两个元组(('a'),('b')),(('c'),('d')),请使用python中匿名函数生成列表[{'a':'c'},{'b':'d'}]
  2.  
  3. # 第一个版本,自己写的,最复杂
  4. tuple1 = (('a'),('b'))
  5. tuple2 = (('c'),('d'))
  6. ret = zip(tuple1,tuple2)
  7.  
  8. dict1 = {}
  9. l = []
  10. for i in ret:
  11. dict1.setdefault(i[0],i[1])
  12.  
  13. for i in dict1:
  14. l.append({i:dict1[i]})
  15. print(l)
  16.  
  17. # 第二个版本:
  18. ret = zip((('a'),('b')),(('c'),('d'))) # 这个返回本身就是iterable,可以作为map的参数
  19. def func(tup):
  20. return {tup[0]:tup[1]}
  21. ret = map(func,ret)
  22. print(list(ret))
  23.  
  24. # 第三个版本:当然最好不要这样写,会挨骂的
  25. print(list(map(lambda tup:{tup[0]:tup[1]},zip((('a'),('b')),(('c'),('d'))))))

32,这个题蛮刁钻的,不容易想到,生成器必考的,所以一看到就要往这边想

  1. def multipliers():
  2. return [lambda x:i*x for i in range(4)] # 这样的话,我要一次 后面的for循环都已经执行完了,所以i全部是3
  3.  
  4. print([m(2) for m in multipliers()])
  5. # 请修改multipliers的定义来产生预期的结果
  6.  
  7. def multipliers():
  8. return (lambda x:i*x for i in range(4)) # 改成生成器,每要一次,for走一次
  9.  
  10. print([m(2) for m in multipliers()])
  11. # 请修改multipliers的定义来产生预期的结果
  12.  
  13. 运行结果:
  14. [6, 6, 6, 6]
  15. [0, 2, 4, 6]

33,要学会归纳,尤其是内置函数这一块儿

day16:内置函数二的更多相关文章

  1. python---day14( 内置函数二)

    内置函数二一:匿名函数 lambda函数 lambda 表示匿名函数,不需要用def 来申明. 语法: 函数名=lambda 参数:返回值 ----〉 案例:f=lambda n:n*n 例子01: ...

  2. python函数知识六 内置函数二、匿名函数与内置函数三(重要)

    19.内置函数二 abs():绝对值 lst = [1,2,-3,1,2,-5] print([abs(i) for i in lst]) enumerate("可迭代对象",&q ...

  3. python 内置函数(二) 进阶函数 递归内容及二分法查找 知识点

    1,lambda:  匿名函数 2.sorgted()  排序函数 3,filter()   过滤函数 筛选 4,map()  映射函数 5.递归 6.二分法 一. 匿名函数: lambda lamb ...

  4. Python入门-内置函数二

    看到标题你也能猜到今天要说大概内容是什么了,没错,昨天没有说完的部分再给大家说说(有一些重合的部分),内置函数的内容比较多,并且工作中经常用到的却不太多,很多都是不太常用的,所以我就着重说一些比较常用 ...

  5. python(day16)内置函数,匿名函数

    # add = lambda x,y:x+y # print(add(1,2)) # dic={'k1':10,'k2':100,'k3':30} # def func(key): # return ...

  6. 内置函数二: map sorted filter

    -----------生活里没有奇迹,大部分的时候奇迹是你自己创造的. # -------------------------------------------------------------- ...

  7. Python内置函数二 (递归函数,匿名函数,二分法)

    匿名函数 lambda() 语法: lambad  参数 : 返回值 def func(a,b): return a * b print(func(2,5)) a = lambda a ,b : a* ...

  8. 百万年薪python之路 -- 内置函数二 -- 最常用的内置函数

    1.内置函数 1.1 匿名函数 匿名函数,顾名思义就是没有名字的函数(其实是有名字的,就叫lambda),那么什么函数没有名字呢?这个就是我们以后面试或者工作中经常用匿名函数 lambda,也叫一句话 ...

  9. day 15 内置函数二 递归 lamda sorted filter map 二分法求值

    回顾 for i in dict  #对字典进行遍历,拿到的是字典的key  今日主要内容 1. lambda 匿名函数 语法: lambda 参数:返回值 不能完成复杂的操作.只能写一行 注意: 1 ...

随机推荐

  1. 【mysql】GitHub 的 MySQL 高可用性实践分享

    原文出处: shlomi-noach   译文出处:oschina    GitHub 使用 MySQL 作为所有非 git 仓库数据的主要存储, 它的可用性对 GitHub 的访问操作至关重要.Gi ...

  2. ubuntu intel网卡驱动安装(华硕B250F GAMING主板 )

    jikexianfeng@jikexianfeng:~$ sudo sudo lspci -knn :]: Intel Corporation Device [:591f] (rev ) Subsys ...

  3. 偏离中轴的cos半球积分问题

    问题: 如果N与n重合,则就是普通的cos半球积分,地球人都知道结果是pi. 对于N与n不重合的一般情况,稍微麻烦一些. 解法1(同济高数课本的方法,参考同济高数第六版第二册“曲面积分”一章): 解法 ...

  4. GUI编程及文件对话框的使用

    import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import ...

  5. 很烦人的maven和gradle的jar缓存

    1. 起因 a. 最近在学习大数据相关东西,自然就少不免去操作linux系统,更别说不敲命令 b. 然而那个配置软件时,很经常使用ln -s为一个软件目录(带着版本或者其他信息的长命名)创建别名(软连 ...

  6. MySQL安装、配置、测试

    MySQL安装.配置.测试(win7_64bit) 目录 1.概述 2.本文用到的工具 3.MySQL安装配置 4.Java访问MySQL测试 5.注事事项 6.相关博文 >>看不清的图片 ...

  7. Protobuf3 序列化

    在message_lite.h中定义了SerializeToString ,SerializeToArray ,SerializeToCodedStream ,SerializeToZeroCopyS ...

  8. Ubuntu16.04下搭建Go语言环境

    1. 安装GO sudo apt-get install golang-go 2. 设置Go环境变量 打开终端,输入命令: export GOROOT=$HOME/goexport PATH=$GOR ...

  9. idea创建maven SSM项目

    maven配置 ➜ ~ cd /Applications/IntelliJ IDEA.app/Contents/plugins/maven/lib/maven3/conf ➜ conf vim set ...

  10. LVS & NGINX

      LVS NGINX