zoukankan      html  css  js  c++  java
  • 魔力Python——我踩过的各种坑

    1.函数与内置函数

    def func(a=1, b=2, l=[]):
        l.append(a + b)
        print(l)
    
    func(1,2)
    func(3,4,[])
    func(5,6)
    #结果:
    #[3]
    #[7]
    #[3, 11]

    filter:

    lst = filter(lambda n:n%3 == 1,range(10))
    print(len(list(lst)))
    print(len(list(lst)))
    #结果:
    #3
    #0
    # filter返回的是迭代对象, 这个迭代器只能迭代一次(list(lst)),迭代完成就完了. 第二次(list(lst)),执行返回的是空.
    # 但如果你把结果做为list放到内存里, 就没有这个问题了,只是如果list很大的话,内存占用多,效率会下降,好的做是把这些操作串在一起, 一次完成.

    2.迭代器,生成器与装饰器

    def Generator():
        value = yield 1
        yield value
    gen = Generator()
    print(gen.send(1))
    #结果:
    #报错:TypeError: can't send non-None value to a just-started generator
    #解决方法:第一个用next接收,接下来再用send
    v = [lambda :x for x in range(10)]
    print(v)
    # print(v[0])
    # print(v[0]())
    v = (lambda  :x for x in range(10))
    print(v)
    for i in range(10):
        print(v.__next__()())
    print(v[0])
    #最后一个print报错,TypeError: 'generator' object is not subscriptable.
    #原因:第二个生成的v实际上是生成器(此处要注意生成器的两种生成手段,一个是如此生成,另一个是定义出来的用yield挂起值),用v.__next__导出的是函数,此时调用发现从0到9依次输出.而生成器怎么可能像列表那样操作呢?
    #PS:生成器两种写法:
    #1.只要把一个列表生成式的[]改成(),就创建了一个generator
    #2.如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator

    装饰器的典型错误: 

    flag = True
    
    
    def wrapper(func):
        def inner(*args, **kwargs):
            if flag:
                ret = func(*args, **kwargs)
                return ret
    
        return inner
    
    
    @wrapper
    def wahaha():
        print('wahaha')
        return True
    
    
    flag = False
    ret = wahaha()
    print(ret)
    #输出结果是None,你能想到么?因为里面关了,所以直接不走了,输出none.并不是像想象中的走主函数的语句块,不然装饰器意义何在呢?就是要在装饰器里面调用的呀!

    3.正则表达式与re模块

    demo1:
    import re
    ret = re.search(r'<(w+)>(w+)<(\w+)>',r'<title>qqxing<	itle>')
    print(ret.group())
    
    demo2:
    import re
    ret = re.search(r'<(w+)>(w+)<(\w+)>',r'<title>qqxing<	itle>')
    print(ret.group())
    
    #demo1和demo2错误相同.
    #AttributeError: 'NoneType' object has no attribute 'group'
    #解决方案:demo1应该是w+ ;  demo2应该是\
    
    demo3:
    import re
    ret = re.search(r'<(?P<tab1>w+)>(?P<content>w+)<(\w+)>',r'<title>qqxing<	itle>')
    print(ret.group('<content>'))
    
    #IndexError: no such group
    #解决方案:去掉<>

    demo4:
    import re
    ret = re.search('<(?P<tag>w+)>(w+)<\(?P=<tag>)>',r'<h1>wahaha<h2><h1>')
    print(ret.group())

    #sre_constants.error: unbalanced parenthesis at position 26
    #解决方案:第一个前面加个r,即
    r'<(?P<tag>w+)>.*?<\(?P=tag)>'
    
    

     

     4.面对对象

    class Goods:
        def __init__(self,name,price,number):
            self.__name = name
            self.price = price
            self.number = number
        def pay(self):
            print(self.__name)
            print(self.price)
        def __add__thing(self):
            print('ok')
    
    
    apple = Goods('apple',5,10)
    print(apple.price)
    print(apple.number)
    # 报错!!!print(apple.__name)#apple.__name调用不出来#AttributeError: 'Goods' object has no attribute '__name'
    print(apple.__dict__)
    print(apple._Goods__name)#_类名__属性名才能调用出来
    apple.pay()
    # 报错!!! apple.__add__thing#AttributeError: 'Goods' object has no attribute '__add__thing'
    print(apple._Goods__add__thing)#类方法调用情况<bound method Goods.__add__thing of <__main__.Goods object at 0x00000000023D7E80>>
    apple._Goods__add__thing()#正常输出

     5.异常

    #demo1:
    with open('course_st_info','rb')as f: print(pickle.load(f)) #由于之前没有该文件,所以报错. #报错内容:EOFError: Ran out of input #修正结果 try: with open('course_st_info','rb')as f: print(pickle.load(f)) except EOFError: pass

    #demo2:
    while 1:
    try:
    with open('course_all_info', 'ab')as f:
    pickle.load(f)
    except EOFError:
    break
    #报错内容:io.UnsupportedOperation: read
    #原因:读取格式不对
    #解决方案:将ab改为rb.

    6. 网络编程

    #server
    import socket
    sk = socket.socket()
    sk.bind(('127.0.0.1',9001))
    while 1:
        conn,addr = sk.accept()
        while 1:
            username = 'smith'
            password = '123'
            usn = conn.recv(1024).decode('utf8')
            psw = conn.recv(1024).decode('utf8')
            if usn ==username and psw == password:
                msg = '登录成功'
            else:
                msg = '登录失败'
            conn.send(msg.encode('utf8'))
        conn.close()
    sk.close()
    #报错:OSError: [WinError 10022] 提供了一个无效的参数。
    #在sk.bind(('127.0.0.1',9001))下面写sk.listen()
    #当缺少监听的时候接收本来就是不可能的事情
    
    
    #client
    import socket
    sk = socket.socket()
    sk.connect('127.0.0.1',9001)
    while 1:
        usn1 = input('请输入账号:').strip()
        psw1 = input('请输入密码:').strip()
        sk.send(usn1.encode('utf8'))
        sk.send(psw1.encode('utf8'))
        msg1 = sk.recv(1024).decode('utf8')
        print(msg1)
        if '成功' in msg1:break
    sk.close()
    #报错:TypeError: connect() takes exactly one argument (2 given)
    #这种错误一般是sk.connect处.
    #sk.connect后面应该跟元组,所以是sk.connect(('127.0.0.1',9001))
    import socket
    
    sk = socket.socket(socket.SOCK_DGRAM)
    server_addr = ('127.0.0.1', 9001)
    while 1:
        content = input('>>>')
        sk.sendto(content.encode('utf8'), server_addr)
        msg, _ = sk.recvfrom(1024)
        print(msg.decode('utf8'))
    sk.close()
    
    #OSError: [WinError 10057] 由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。
    #原因:sk = socket.socket(type = socket.SOCK_DGRAM)
    #server:
    import json
    import socket
    import hashlib
    import struct
    
    
    def get_sha1(username,password):
        sha1 = hashlib.sha1(username.encode('utf8'))
        sha1.update(password.encode('utf8'))
        return sha1.hexdigest()
    
    def get_userinfo(filename_userinfo):
        with open(filename_userinfo, encoding='utf8') as f:
            for line in f.readlines():
                user,pwd = line.strip().split('|')
                yield user,pwd
    
    sk = socket.socket()
    sk.bind(('127.0.0.1',9001))
    sk.listen()
    
    conn,addr = sk.accept()
    
    
    flag = 1
    while flag:
        num = conn.recv(4)
        num = struct.unpack('i', num)[0]
        bytes_dic1 = conn.recv(num)
        str_dic1 = bytes_dic1.decode('utf8')
        dic1 = json.loads(str_dic1)
        dic1['password'] = get_sha1(dic1['username'], dic1['password'])
        for user,pwd in read:
            if dic1['username'] == user and dic1['password'] == pwd:
                bytes_msg = '登录成功'.encode('utf8')
                struct_len = struct.pack('i',len(bytes_msg))
                conn.send(struct_len)
                conn.send(bytes_msg)
                flag = 0
                break
        else:
            flag += 1
            if flag == 4:
                bytes_msg = '登录失败,请明天再试'.encode('utf8')
                struct_len = struct.pack('i', len(bytes_msg))
                conn.send(struct_len)
                conn.send(bytes_msg)
                conn.close()
            bytes_msg = '登录失败,请明天再试'.encode('utf8')
            struct_len = struct.pack('i', len(bytes_msg))
            conn.send(struct_len)
            conn.send(bytes_msg)
    
    conn.close()
    sk.close()
    
    #client:
    import json
    import socket
    import hashlib
    import struct
    
    
    def get_md5(username, password):
        md5 = hashlib.md5(username.encode('utf8'))
        md5.update(password.encode('utf8'))
        return md5.hexdigest()
    
    for i in range(3):
        username = input('用户名:').strip()
        password = input('密  码:').strip()
    
    
    
        sk = socket.socket()
        sk.connect(('127.0.0.1', 9001))
    
    
        password = get_md5(username, password)
        dic1 = {'username': username, 'password': password}
        str_dic1 = json.dumps(dic1)
        bytes_dic1 = str_dic1.encode('utf8')
        bytes_len = struct.pack('i', len(bytes_dic1))
    
        sk.send(bytes_len)
        sk.send(bytes_dic1)
    
        num = sk.recv(4)
        num = struct.unpack('i',num)[0]
        bytes_msg = sk.recv(num)
        print(bytes_msg.decode('utf8'))
    
    sk.close()
    
    
    #报错:num = struct.unpack('i', num)[0]
    #struct.error: unpack requires a buffer of 4 bytes
    #原因:经查看是循环时候报错,由此推出是因为client端未循环输入username和password的问题.
    #报错:非套接字OSError: [WinError 10038] 在一个非套接字上尝试了一个操作。
    #原因:查看是否进行了conn.close()但还是在进行连接.

    7.MySQL

    ERROR 1054(42S22):Unknown column 'smith' in 'field list'

    解决方案:把变量加上引号变为字符串即可.

    8.Django

    报错: 'Did you install mysqlclient or MySQL-python?' % e
    django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No module named 'MySQLdb'.
    Did you install mysqlclient or MySQL-python?

    解决方案:忘配置与settings同级的__init__的文件了.写如下:

    import pymysql
    pymysql.install_as_MySQLdb()

    9.通用

    9.1 编码问题

    table1 = pd.read_excel(r"C:UsersAdministratorDesktop数据1.xls")
    table2 = pd.read_excel(r"C:UsersAdministratorDesktop rans.xls")


    (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated UXXXXXXXX escape

    解决方法:记得在路径处加r. 避免转义.

  • 相关阅读:
    Apache2的安装
    JVM(9) 程序编译及代码优化
    Java基础(43)Queue队列
    Java基础(42)AbstractSet类
    OptimalSolution(10)--日常
    OptimalSolution(9)--其他问题(1)
    OptimalSolution(9)--其他问题(2)
    OptimalSolution(8)--位运算
    OptimalSolution(7)--大数据和空间限制
    golang教程汇总
  • 原文地址:https://www.cnblogs.com/smithpath/p/10579297.html
Copyright © 2011-2022 走看看