• M3截止阶段小结


    python知识点总结
    1、copy模块中深浅拷贝copy() deepcopy()
    2、__new__ 方法参数
        def __new__(cls, *args, **kwargs):
            return object.__new__(cls)
    3、元类示例:
        class Mymetaclass(type): # 继承type类型
            def __new__(cls,name,bases,attrs):
                update_attrs={}
                for k,v in attrs.items():  # 字典遍历方法
                    if not callable(v) and not k.startswith('__'):
                        update_attrs[k.upper()]=v
                    else:
                        update_attrs[k]=v
                return type.__new__(cls,name,bases,update_attrs)

        class Chinese(metaclass=Mymetaclass):  # 继承定义的元类
            country='China'
            tag='Legend of the Dragon'
            def walk(self):
                print('%s is walking' %self.name)


        print(Chinese.__dict__)
        '''
        {'__module__': '__main__',
         'COUNTRY': 'China',
         'TAG': 'Legend of the Dragon',
         'walk': <function Chinese.walk at 0x0000000001E7B950>,
         '__dict__': <attribute '__dict__' of 'Chinese' objects>,                                         
         '__weakref__': <attribute '__weakref__' of 'Chinese' objects>,
         '__doc__': None}
        '''
    4、__str__ 类属性(作用类似于java中的 toString方法)
        示例:
        @property
        def detail(self):
            '''tostring'''
            tmp = "姓名:%s ; 性别:%s ; 年龄:%s ; 战斗力:%s" % (self.name, self.gender, self.age, self.fight_value)
            print(tmp)

        def __str__(self):
            '''tostring'''
            tmp = "姓名:%s ; 性别:%s ; 年龄:%s ; 战斗力:%s" % (self.name, self.gender, self.age, self.fight_value)
            return tmp
        
        # wenhong.detail
        print(cangjinjin)
    5、.ini 文件操作
        settings.py
        import os
        BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        ACCOUNT_FILE = "%s/conf/accounts.ini" % BASE_DIR
        
        config_obj = configparser.ConfigParser()
        config_obj.read(settings.ACCOUNT_FILE)
        return config_obj
        
    6、socket:
        server端:
            在类构造方法中:
            self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.sock.bind((settings.HOST, settings.PORT))
            self.sock.listen(settings.MAX_SOCKET_LISTEN)
            self.accounts = self.load_accounts()
            
            def run_forever(self):
                """启动socket server"""
                print('starting LuffyFTP server on %s:%s' % (settings.HOST, settings.PORT))
                while True:
                    self.request, self.addr = self.sock.accept() # 赋值成全局变量
                    print("got a new connection from %s" % (self.addr,))
                    self.handle()

            def handle(self):
                """处理与用户的所有指令交互"""
                while True:  # 一直循环运行
                    raw_data = self.request.recv(1024)  # 指定大小
                    # print('raw_data------------------>', raw_data)
                    if not raw_data:  # 判断是否为空语句
                        print("connection %s is lost...." % (self.addr, ))
                        del self.request, self.addr  # 断开连接
                        break
                    data = json.loads(raw_data.decode('utf-8'))  # 接受客户端数据,必须解码
                    action_type = data.get("action_type")
                    # print('data, action_type-------------->', data, action_type)
                    if action_type:
                        if hasattr(self, "_%s" % action_type):  # _表示和客户端交互的方法
                            func = getattr(self, "_%s" % action_type)   # 反射拿到方法名称
                            func(data)
                    else:
                        print("invalid command, ")
                        
    7、上传下载示例整理
        #!/usr/bin/python3
        # -*- coding: utf-8 -*-
        # @Time    : 2018/6/7 8:41
        # @File    : 服务端.py


        import socket
        import os
        import json
        import struct

        shar_dir = r'D:pytharmjichuyufamodel3practice2上传下载servershare'

        phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        phone.bind(('127.0.0.1', 9909))
        phone.listen(5)  #
        print('starting...')
        while True:
            conn,client_addr = phone.accept()
            print(client_addr)

            while True:
                try:
                    # 1收命令
                    res = conn.recv(8096)  # b'get a.txt'
                    if not res:break

                    # 2,解析命令,提取相应命令参数
                    cmds = res.decode('utf-8').split()  # ['get',filename]
                    filename = cmds[1]


                    # 3,易读的方式打开文件,读取文件内容发送给客户端

                    header_dic = {
                        'filename': filename,
                        'md5':'xxxdxxx',
                        'file_size': os.path.getsize(r'%s/%s' % (shar_dir, filename))
                    }

                    header_json = json.dumps(header_dic)

                    header_bytes = header_json.encode('utf-8')

                    # 2,先发送报头的长度
                    conn.send(struct.pack('i', len(header_bytes)))
                    # 3,再发报头
                    conn.send(header_bytes)

                    # 4,再发送真实的数据
                    with open('%s/%s' % (shar_dir, filename), 'rb') as f:
                        # conn.send(f.read())
                        for line in f:
                            conn.send(line)
                except ConnectionResetError:
                    break
            conn.close()
        phone.close()


        client-------------------------------------


        #!/usr/bin/python3
        # -*- coding: utf-8 -*-
        # @Time    : 2018/6/7 8:41
        # @File    : 客户端.py


        import socket
        import struct
        import json

        dow_dir = r'D:pytharmjichuyufamodel3practice2上传下载clientdownload'

        phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        phone.connect(('127.0.0.1', 9909))

        while True:
            # 1,发命令
            cmd = input('>>:').strip()
            if not cmd:continue
            phone.send(cmd.encode('utf-8'))

            # 2,以写的方式打开一个新文件
            # 2.1收报头长度
            obj = phone.recv(4)
            header_size = struct.unpack('i', obj)[0]
            # 2.2收报头
            header_bytes = phone.recv(header_size)
            # 从报头中解析出对真实数据的描述信息
            header_json = header_bytes.decode('utf-8')
            header_dic = json.loads(header_json)
            print(header_dic)

            total_size = header_dic['file_size']
            filename = header_dic['filename']
            # 2.4,接收真实的数据
            with open('%s/%s' % (dow_dir, filename), 'wb') as f:  #  服务端打开读方式,这里这种wb方式容易卡主
                recv_size = 0
                while recv_size < total_size:
                    line = phone.recv(1024)
                    f.write(line)
                    recv_size += len(line)
                    print('总大小:%s 已下载大小: %s' % (total_size, recv_size))


        phone.close()
    8、列表中数字拼接示例:
        import re
        li = [1, 2, 3, 4, 5, 66, 7, 3, 54, 34, 34]

        # s = ''.join(str(li).split(',')).replace(' ', '').replace('[','').replace(']','')
        s = re.sub('[s[]]', '', ''.join(str(li).split(',')))
        print(s)
        
    9、单例示例:
        http://www.cnblogs.com/fmgao-technology/p/9127869.html
    10、list,tuple,dict和set的主要区别

        1 .list

            list 方括号括起来的有序元素集合;

            List 可以作为以 0 下标开始的数组,任何一个非空 list 的第一个元素总是 L[0],负数索引从 list 的尾部开始向前计数来存取元素。任何一个非空的 list 最后一个元素总是 L[-1];

            有分片功能,两个list可以相加;

            append 向 list 的末尾追加单个元素;

            insert 将单个元素插入到 list 中;

            extend 用来连接 list,使用一个 list 参数进行调用;(俩个list合并,不去重)

            append 接受一个参数, 这个参数可以是任何数据类型, 并且简单地追加到 list 的尾部;

            index 在 list 中查找一个值的首次出现并返回索引值;

            要测试一个值是否在 list 内, 使用 in, 如果值存在, 它返回 True, 否则返为 False ;

            remove 从 list 中删除一个值的首次出现;

            pop 可以删除 list 的最后一个元素, 然后返回删除元素的值,用索引删除制定位置的值;

        
        2.tuple

            tuple是不可变的list,创建了一个tuple就不能以任何方式改变它;

            定义tuple是将整个元素集是用小括号括起来,是有序集合;

            tuple的索引与list一样从0开始,所以一个非空的tuple的第一个元素总是t[0];

            负数索引与 list 一样从 tuple 的尾部开始计数;

            与 list 一样分片 (slice) 也可以使用。分割一个 tuple 时, 会得到一个新的 tuple;

            没有 append、extend、remove或pop方法以及index方法;

            可以使用in来查看一个元素是否存在于tuple 中。

        

        3.dict

            dict定义了键和值之间的一一对应关系,每个元素都是一个key-value对;

            整个元素集合用大括号括起来,有序集合;

            可以通过 key 得到value, 但不能通过vaule获取 key;

            在一个 dict中不能有重复的 key, 并且 key 是大小写敏感的;

            键可以是数字、字符串或者是元组等不可变类型;

            用del使用key可以删除dict中的独立元素;

            用clear可以清除dict中的所有元素。

        4.set

            set是建立一系列无序的,不重复的元素;

            创建set的方式是调用set()并传入一个list,list的元素将作为set的元素;

            set和dict的唯一区别仅在于没有存储对应的value
            
    11、json和pickle
        dumps 和 loads 用于python对象和字符串间的序列化和反序列化
            dumps:将python 基本数据类型转化为json格式数据类型
            loads:将json格式数据类型转化为python数据类型
        
        dump 和load 用于对文件进行序列化和反序列化
            dump:主要用于json文件的读写,json.dump(x,f),x是对象,f是一个文件对象,这个方法可以将json字符串写入到文本文件中
            load:加载json文件
        
    12、logger
        # 创建一个logger
        # 创建一个handler,用于写入日志文件
        # 再创建一个handler,用于输出到控制台
        # 定义handler的输出格式
        # 给logger添加handler
        http://www.cnblogs.com/fmgao-technology/p/9108620.html
        http://www.cnblogs.com/fmgao-technology/p/9100788.html
    13、格式化日期:
        time.strftime("%H:%M:%S")
        http://www.cnblogs.com/fmgao-technology/p/9108610.html
        http://www.cnblogs.com/fmgao-technology/p/9069820.html
    14、file
        fp.read([size]) #size为读取的长度,以byte为单位
        fp.readline([size]) #读一行,如果定义了size,有可能返回的只是一行的一部分
        fp.readlines([size]) #把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。
        fp.write(str) #把str写到文件中,write()并不会在str后加上一个换行符
        fp.writelines(seq) #把seq的内容全部写到文件中(多行一次性写入)。这个函数也只是忠实地写入,不会在每行后面加上任何东西
        fp.tell() #返回文件操作标记的当前位置,以文件的开头为原点
        fp.seek(offset[,whence]) #将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾
        http://www.cnblogs.com/fmgao-technology/p/9108506.html
    15、MD5
        def md5(arg):  # 这是加密函数,将传进来的函数加密
            md5_pwd = hashlib.md5(bytes('admin'.encode('utf-8')))
            md5_pwd.update(bytes(arg.encode('utf-8')))
            return md5_pwd.hexdigest()
    16、join
        Python中有join()和os.path.join()两个函数,具体作用如下:
        join():    连接字符串数组。将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串
        os.path.join():  将多个路径组合后返回
        http://www.cnblogs.com/fmgao-technology/p/9101195.html
    17、user-add组合成键值对
        13,Alex Li,25,1344353443,IT,2015‐10‐29
        14,Alex Li,25,1344353424,IT,2015‐10‐29
        方法一:
        staff_table = {}
        field_list = ["num", "name", "age", "phone", "dept", "enroll_date"]
        def openfile():
            staff_file = open("test.txt", 'r+', encoding='utf-8')
            for line in staff_file:
                line = line.strip().split(',')
                staff_table[line[1]] = dict(zip(field_list, line[:6]))    
    18、装饰器
        def logging(level):
            @wrapt.decorator
            def wrapper(wrapped, instance, args, kwargs):
                print "[{}]: enter {}()".format(level, wrapped.__name__)
                return wrapped(*args, **kwargs)
            return wrapper

        @logging(level="INFO")
        def do(work): pass    
        http://www.cnblogs.com/fmgao-technology/p/9100217.html
        http://www.cnblogs.com/fmgao-technology/p/9072258.html
        http://www.cnblogs.com/fmgao-technology/p/9062639.html
    19、re
        s3 = 'alex22jack23rain31jinxin50#mack-oldboy'
        s31 = re.split('d+|#|-',s3)
        print(s31) # ['alex', 'jack', 'rain', 'jinxin', '', 'mack', 'oldboy']
        http://www.cnblogs.com/fmgao-technology/p/9091243.html
        http://www.cnblogs.com/fmgao-technology/p/9090983.html
    20、xml
        ElementTree(tag),其中tag表示根节点,初始化一个ElementTree对象。
        Element(tag, attrib={}, **extra)函数用来构造XML的一个根节点,其中tag表示根节点的名称,attrib是一个可选项,表示节点的属性
        http://www.cnblogs.com/fmgao-technology/p/9087584.html
        
    21、subprocess
        subprocess.Popen():    在一些复杂场景中,我们需要将一个进程的执行输出作为另一个进程的输入。在另一些场景中,我们需要先进入到某个输入环境,然后再执行一系列的指令等。这个时候我们就需要使用到suprocess的Popen()方法。该方法有以下参数:
        args:shell命令,可以是字符串,或者序列类型,如list,tuple。
        bufsize:缓冲区大小,可不用关心
        stdin,stdout,stderr:分别表示程序的标准输入,标准输出及标准错误
        shell:与上面方法中用法相同
        cwd:用于设置子进程的当前目录
        env:用于指定子进程的环境变量。如果env=None,则默认从父进程继承环境变量
        universal_newlines:不同系统的的换行符不同,当该参数设定为true时,则表示使用 作为换行符    
        http://www.cnblogs.com/fmgao-technology/p/9085761.html
        
    22、hashlib
        hexdigest():返回摘要,作为十六进制数据字符串值    
        http://www.cnblogs.com/fmgao-technology/p/9085617.html
    23、__name__
        1. 如果模块是被导入,__name__的值为模块名字
        2. 如果模块是被直接执行,__name__的值为’__main__’
        http://www.cnblogs.com/fmgao-technology/p/9080482.html

    24、sys
        sys.argv: 实现从程序外部向程序传递参数
        http://www.cnblogs.com/fmgao-technology/p/9074282.html
        
    25、os
        os.getcwd()函数得到当前工作目录,即当前Python脚本工作的目录路径
        os.path.abspath(name):获得绝对路径
        http://www.cnblogs.com/fmgao-technology/p/9073582.html
        http://www.cnblogs.com/fmgao-technology/p/9056425.html
        http://www.cnblogs.com/fmgao-technology/p/9056280.html
    26、str
        str.find(s)     返回字符串s在字符串str中的位置索引,没有则返回-1
        str.splitlines() 按照行分隔,返回一个包含各行作为元素的列表
        str.isspace() 如果str中只包含空格,则返回 True,否则返回 False
        string.letters 字符串’abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’
        http://www.cnblogs.com/fmgao-technology/p/9073564.html
        http://www.cnblogs.com/fmgao-technology/p/9056517.html
    27、random
        list_number = [1, 2, 3, 4, 5]
        random.shuffle(list_number)  # 打乱列表
        http://www.cnblogs.com/fmgao-technology/p/9073554.html
        
    28、range
        函数原型:range(start, end, scan):
            参数含义:
            start:计数从start开始。默认是从0开始。例如range(5)等价于range(0, 5);
            end:技术到end结束,但不包括end.例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5
            scan:每次跳跃的间距,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)
        http://www.cnblogs.com/fmgao-technology/p/9071681.html
        
    29、print
        print(value, …, sep=' ', end=’ ’, file=sys.stdout, flush=False)
        参数解析
            value:需要输出的值,可以是多个,用”,”分隔。
            sep:多个输出值之间的间隔,默认为一个空格。
            end:输出语句结束以后附加的字符串,默认是换行(’ ’)。
            file:输出的目标对象,可以是文件也可以是数据流,默认是“sys.stdout”。
            flush:flush值为True或者False,默认为Flase,表示是否立刻将输出语句输出到目标对象。
        http://www.cnblogs.com/fmgao-technology/p/9071156.html
        
    30、可迭代对象|迭代器
        Python中可迭代对象和迭代器对象的理解
        我们在用for ... in ...语句循环时,in后面跟随的对象要求是可迭代对象,即可以直接作用于for循环的对象统称为可迭代对象(Iterable),如list、tuple、dict、set、str等
        可迭代对象是实现了__iter__()方法的对象,而迭代器(Iterator)则是实现了__iter__()和__next__()方法的对象
        http://www.cnblogs.com/fmgao-technology/p/9064301.html
        http://www.cnblogs.com/fmgao-technology/p/9049768.html
        
    31、闭包
        Python中创建一个闭包可以归结为以下三点:
            闭包函数必须有内嵌函数
            内嵌函数需要引用该嵌套函数上一级namespace中的变量
            闭包函数必须返回内嵌函数
        http://www.cnblogs.com/fmgao-technology/p/9062419.html
        
    32、enumerate
        list1 = ["这", "是", "一个", "测试"]
        for index, item in enumerate(list1):
            print index, item    
        http://www.cnblogs.com/fmgao-technology/p/9060625.html
        
    33、
        eval 将字符串str当成有效的表达式来求值并返回计算结果。它要执行的python代码只能是单个运算表达式(不支持任意形式的赋值操作),而不能是复杂的代码逻辑
        exec 动态执行python代码,可以执行复杂的python代码
        http://www.cnblogs.com/fmgao-technology/p/9060702.html
        
    34、reduce
        from functools import reduce
        result = reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])
        http://www.cnblogs.com/fmgao-technology/p/9056076.html
        
    35、map
        map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
        [3, 7, 11, 15, 19]
        http://www.cnblogs.com/fmgao-technology/p/9049669.html
        
    36、类中方法    
        https://www.cnblogs.com/fmgao-technology/p/9173202.html
        
       
       

  • 相关阅读:
    python 中实现按照指定步长拆分字符串
    c语言中单目运算符 !返回值为0或者1
    c语言中字符常量 和 字符串常量
    python 中 在文件中创建字符串nN
    python 中 关键字 continue 和 pass的区别
    关于FD_CLOEXEC标志
    额,没想到,背包问题解题也有套路。。。
    动画 | 什么是红黑树?
    牛逼了,第一次知道 GitHub 上还有这么多好玩的项目...
    动画 | 什么是链表?
  • 原文地址:https://www.cnblogs.com/fmgao-technology/p/9177570.html
Copyright © 2020-2023  润新知