zoukankan      html  css  js  c++  java
  • day16:内置函数二

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

    # 现在需要对这个员工信息文件进行增删改查。
    
    
    # 可以进行查询,支持三种语法:
    # 支持:大于小于等于,还要支持模糊查找。
    # 示例:
    # select name, age where age>22
    # select * where job=IT
    # select * where phone like 133
    
    
    # 用户信息处理-分析信息
    # user_msg = input('>>>')
    user_msg = 'select * where age>22'  # 规律都有where
    view,condition= user_msg.split('where') # 查询内容,查询条件,拆包
    
    # view = view.split('select').pop().strip()  # strip不可以去掉完整的字符串,split前面字典必然有个空值,因为是从头开始切得
    view = view.replace('select','').strip() # 和上一句效果一样的
    view_list = view.split(',')
    
    
    # 读取文件  ---将文件内容整理
    def get_line(filename):
        '''
        返回员工的列表
        :param filename:
        :return:
        '''
        with open(filename,encoding='utf-8') as f1:
            for line in f1:
                line = line.strip()
                list_line = line.split(',')
                yield list_line #  这一句是关键,信息可以拿出去处理了
    
    
    dic = {'name':1,'id':0, 'age':2,'phone':3,'job':4}
    
    def condition_filter(condition):
        '''条件筛选'''
        print(condition)
        condition = condition.strip()
        if '>' in condition:
            col,value = condition.split('>')
            print(col,value)
            g_line = get_line('employ_list.txt')
            for line in g_line:
                if int(line[dic.get(col)]) > int(value):
                    yield line
    
    # 尽量做到程序的解耦,就是把它拆分成几个函数去完成
    def view(view_list,staff_g):
        '''展示符合条件的员工信息'''
    
        for staff in staff_g:
            if '*' in view_list:
                view_list = dic.keys()
    
            for i in view_list:
                print(staff[dic[i]],end=' ')
            print('
    ')
    
    staff_g = condition_filter(condition)
    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 函数

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

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

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

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

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

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

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

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

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

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

    # 发现规律了吗?
    b_array = bytearray('你好',encoding="utf-8")
    print(b_array)
    # bytearray(b'xe4xbdxa0xe5xa5xbd')
    print(b_array[0])
    print(hex(b_array[0]))
    print(hex(b_array[1]))
    
    s1 = 'lisa'
    s2 = 'lisa2'  # 当然我们可以按照自己改,但是比较麻烦,还要查编码,用的不多,了解一下就行
    
    运行结果:
    bytearray(b'xe4xbdxa0xe5xa5xbd')
    228
    0xe4
    0xbd

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

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

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

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

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

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

    print(chr(68))
    print(chr(98))
    
    #没有的结果为空
    运行结果:
    D
    b

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

    print(ascii(''))
    print(ascii("a"))
    
    运行结果:
    'u4f60'
    'a'

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

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

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

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

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

    # 判断是否有bool值是false的值,也就是全为真值,最后结果才为真,有一个false整体就是false
    print(all(range(10)))
    print(all([1,'',9]))
    print(all([1,' ',9])) # 控制也代表有值,就代表这个字符串不为空
    print(bool('')) # 注意空串和空值的区别,只有是空串的时候才为false
    print(bool(' '))
    print('***************************')
    
    # 判断是否有bool值为true的值,有一个false,整体就是false
    print(any([1,'',2]))
    print(any([1,' ',2]))
    print(any([0,'',()]))
    
    运行结果:
    False
    False
    True
    False
    True
    ***************************
    True
    True
    False

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

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

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

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

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

    import math
    def is_sqrt(s):
        return math.sqrt(s)%1 == 0 # 判断是否是整数,取余1位零就可以了
    
    ret = filter(is_sqrt,range(101))
    for i in ret:
        print(i)
    print(int(2.5))  #强转也是整数值了
    
    运行结果:
    0
    1
    4
    9
    16
    25
    36
    49
    64
    81
    100
    2

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

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

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

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

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

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

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

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

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

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

    def calc(n):
        return n**n
    print(calc(5))
    
    calc = lambda n:n**n
    print(calc(5))
    # 函数名  参数:返回值,不允许换行,一行写完
    # 参数可以有多个,逗号分隔
    
    运行结果:
    3125
    3125

    28,练一练:

    def add(x,y):
        return x+y
    print(add(10,20))
    
    
    add = lambda x,y:x+y
    print(add(10,20))
    
    运行结果:
    30
    30

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

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

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

    d = lambda p:p*2
    t = lambda p:p*3
    x = 2
    x = d(x)  # 4
    x = t(x)  # 12
    x = d(x)  # 24
    print(x)
    
    运行结果:
    24

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

    # 现有两个元组(('a'),('b')),(('c'),('d')),请使用python中匿名函数生成列表[{'a':'c'},{'b':'d'}]
    
    # 第一个版本,自己写的,最复杂
    tuple1 = (('a'),('b'))
    tuple2 = (('c'),('d'))
    ret = zip(tuple1,tuple2)
    
    dict1 = {}
    l = []
    for i in ret:
        dict1.setdefault(i[0],i[1])
    
    for i in dict1:
        l.append({i:dict1[i]})
    print(l)
    
    # 第二个版本:
    ret = zip((('a'),('b')),(('c'),('d')))  # 这个返回本身就是iterable,可以作为map的参数
    def func(tup):
        return {tup[0]:tup[1]}
    ret = map(func,ret)
    print(list(ret))
    
    
    # 第三个版本:当然最好不要这样写,会挨骂的
    print(list(map(lambda tup:{tup[0]:tup[1]},zip((('a'),('b')),(('c'),('d'))))))

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

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

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

  • 相关阅读:
    eclipse远程调试Tomcat方法(转)
    Django表单字段汇总
    Django表单API详解
    django使用表单
    django自定义模板标签和过滤器
    django人类可读性
    django特殊的标签和过滤器
    Django内置模板标签
    Django模板语言详解
    django 动态生成PDF文件
  • 原文地址:https://www.cnblogs.com/lisa-blog/p/10099236.html
Copyright © 2011-2022 走看看