python的迭代器坑_魔力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.迭代器,生成器与装饰器

defGenerator():

value= yield 1

yieldvalue

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 =Truedefwrapper(func):def inner(*args, **kwargs):ifflag:

ret= func(*args, **kwargs)returnretreturninner

@wrapperdefwahaha():print('wahaha')returnTrue

flag=False

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

3.正则表达式与re模块

demo1:importre

ret= re.search(r'(\w+)',r'

qqxing')print(ret.group())

demo2:importre

ret= re.search(r'(\w+)',r'

qqxing')print(ret.group())#demo1和demo2错误相同.#AttributeError: 'NoneType' object has no attribute 'group'#解决方案:demo1应该是\w+ ; demo2应该是\\\

demo3:importre

ret= re.search(r'\w+)>(?P\w+)',r'qqxing')print(ret.group(''))#IndexError: no such group#解决方案:去掉<>

demo4:

import re

ret = re.search('\w+)>(\w+))>',r'

wahaha')

print(ret.group())

#sre_constants.error: unbalanced parenthesis at position 26

#解决方案:第一个前面加个r,即r'\w+)>.*?'

2fd2450bb3c4c29b13ea14ad7141e05b.png

4.面对对象

classGoods:def __init__(self,name,price,number):

self.__name =name

self.price=price

self.number=numberdefpay(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))exceptEOFError: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

importsocket

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

importsocket

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:breaksk.close()#报错:TypeError: connect() takes exactly one argument (2 given)#这种错误一般是sk.connect处.#sk.connect后面应该跟元组,所以是sk.connect(('127.0.0.1',9001))

importsocket

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:

importjsonimportsocketimporthashlibimportstructdefget_sha1(username,password):

sha1= hashlib.sha1(username.encode('utf8'))

sha1.update(password.encode('utf8'))returnsha1.hexdigest()defget_userinfo(filename_userinfo):

with open(filename_userinfo, encoding='utf8') as f:for line inf.readlines():

user,pwd= line.strip().split('|')yielduser,pwd

sk=socket.socket()

sk.bind(('127.0.0.1',9001))

sk.listen()

conn,addr=sk.accept()

flag= 1

whileflag:

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 inread: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=0break

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:

importjsonimportsocketimporthashlibimportstructdefget_md5(username, password):

md5= hashlib.md5(username.encode('utf8'))

md5.update(password.encode('utf8'))returnmd5.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 mysqlclientor MySQL-python?

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

importpymysql

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. 避免转义.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值