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'qqxing<\title> ') print(ret.group()) demo2: import re ret = re.search(r'<(\w+)>(\w+)<(\\w+)>',r'qqxing<\title> ') print(ret.group()) #demo1和demo2错误相同. #AttributeError: 'NoneType' object has no attribute 'group' #解决方案:demo1应该是\w+ ; demo2应该是\\\ demo3: import re ret = re.search(r'<(?P\w+)>(?P ',r'\w+)<(\\\w+)> qqxing<\title> ') print(ret.group('en t>')) #IndexError: no such group #解决方案:去掉<>
demo4:
import re
ret = re.search('<(?P\w+)>(\w+)<\\(?P= )>',r' wahaha<\h2><\h1>')
print(ret.group())
#sre_constants.error: unbalanced parenthesis at position 26
#解决方案:第一个前面加个r,即r'<(?P\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)#类方法调用情况> 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:\Users\Administrator\Desktop\数据1.xls")
table2 = pd.read_excel(r"C:\Users\Administrator\Desktop\trans.xls")
(unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
解决方法:记得在路径处加r. 避免转义.