python3items
‘壹’ python3和python2区别有什么
python2版本和python3版本的区别,两者对比如下
核心类差异
1. Python3 对 Unicode 字符的原生支持。
Python2 中使用 ASCII 码作为默认编码方式导致 string 有两种类型 str 和 unicode,Python3 只
支持 unicode 的 string。Python2 和 Python3 字节和字符对应关系为:
2. Python3 采用的是绝对路径的方式进行 import
Python2 中相对路径的 import 会导致标准库导入变得困难(想象一下,同一目录下有 file.py,如
何同时导入这个文件和标准库 file)。Python3 中这一点将被修改,如果还需要导入同一目录的文件必
须使用绝对路径,否则只能使用相关导入的方式来进行导入。
3. Python2 中存在老式类和新式类的区别,Python3 统一采用新式类。新式类声明要求继承 object,
必须用新式类应用多重继承。
4. Python3 使用更加严格的缩进。Python2 的缩进机制中,1 个 tab 和 8 个 space 是等价的,所
以在缩进中可以同时允许 tab 和 space 在代码中共存。这种等价机制会导致部分 IDE 使用存在问题。
Python3 中 1 个 tab 只能找另外一个 tab 替代,因此 tab 和 space 共存会导致报错:TabError:
inconsistent use of tabs and spaces in indentation.
python学习网,免费的python学习网站,欢迎在线学习!
废弃类差异
1. print 语句被 Python3 废弃,统一使用 print 函数
2. exec 语句被 python3 废弃,统一使用 exec 函数
3. execfile 语句被 Python3 废弃,推荐使用 exec(open("./filename").read())
4. 不相等操作符"<>"被 Python3 废弃,统一使用"!="
5. long 整数类型被 Python3 废弃,统一使用 int
6. xrange 函数被 Python3 废弃,统一使用 range,Python3 中 range 的机制也进行修改并提高
了大数据集生成效率
7. Python3 中这些方法再不再返回 list 对象:dictionary 关联的 keys()、values()、items(),zip(),
map(),filter(),但是可以通过 list 强行转换:
1. mydict={"a":1,"b":2,"c":3}
2. mydict.keys() #<built-in method keys of dict object at 0x000000000040B4C8>
3. list(mydict.keys()) #['a', 'c', 'b']
8. 迭代器 iterator 的 next()函数被 Python3 废弃,统一使用 next(iterator)
9. raw_input 函数被 Python3 废弃,统一使用 input 函数
10. 字典变量的 has_key 函数被 Python 废弃,统一使用 in 关键词
11. file 函数被 Python3 废弃,统一使用 open 来处理文件,可以通过 io.IOBase 检查文件类型
12. apply 函数被 Python3 废弃
13. 异常 StandardError 被 Python3 废弃,统一使用 Exception
修改类差异
1. 浮点数除法操作符“/”和“//”的区别
“ / ”:
Python2:若为两个整形数进行运算,结果为整形,但若两个数中有一个为浮点数,则结果为
浮点数;
Python3:为真除法,运算结果不再根据参加运算的数的类型。
“//”:
Python2:返回小于除法运算结果的最大整数;从类型上讲,与"/"运算符返回类型逻辑一致。
Python3:和 Python2 运算结果一样。
2. 异常抛出和捕捉机制区别
Python2
1. raise IOError, "file error" #抛出异常
2. except NameError, err: #捕捉异常
Python3
1. raise IOError("file error") #抛出异常
2. except NameError as err: #捕捉异常
3. for 循环中变量值区别
Python2,for 循环会修改外部相同名称变量的值
1. i = 1
2. print ('comprehension: ', [i for i in range(5)])
3. print ('after: i =', i ) #i=4
Python3,for 循环不会修改外部相同名称变量的值
1. i = 1
2. print ('comprehension: ', [i for i in range(5)])
3. print ('after: i =', i ) #i=1
4. round 函数返回值区别
Python2,round 函数返回 float 类型值
1. isinstance(round(15.5),int) #True
Python3,round 函数返回 int 类型值
1. isinstance(round(15.5),float) #True
5. 比较操作符区别
Python2 中任意两个对象都可以比较
1. 11 < 'test' #True
Python3 中只有同一数据类型的对象可以比较
1. 11 < 'test' # TypeError: unorderable types: int() < str()
‘贰’ python3的问题求解决, name 'item' is not defined
应该打错字母了,少了个s,print那里,应该是items
‘叁’ python items()是怎么排序的
在Python中,当你排序一个元组时,如下所示:
>>> items = [(1, 'B'), (1, 'A'), (2, 'A'), (0, 'B'), (0, 'a')]
>>> sorted(items)
[(0, 'B'), (0, 'a'), (1, 'A'), (1, 'B'), (2, 'A')]
默认情况下,sort和sorted内建函数会优先排序第一个元素,然后再排序第二个元素,大写字母会排在小写字母前面。当你想要不区分大小写排序时,可能会按如下写代码:
>>> sorted(items, key=str.lower)
Traceback (most recent call last):
File "<stdin>", line 1, in <mole>
TypeError: descriptor 'lower' requires a 'str' object but received a 'tuple'
出现了错误,lower需要的是字符串对象,但是接收到了元组。下面的应用lamdba,返回一个元组:
>>> sorted(items, key=lambda x: (x[0], x[1].lower()))
[(0, 'a'), (0, 'B'), (1, 'A'), (1, 'B'), (2, 'A')]
我确定你知道可以通过 sorted(items, reverse=True, ...) 将其反转,但是如果你想要依赖你提供的key来获得不同的排序顺序时,该怎么办呢?使用lambda函数返回一个元组可以实现,下面是一个更高级的结构排序
>>> peeps = [{'name': 'Bill', 'salary': 1000}, {'name': 'Bill', 'salary': 500}, {'name': 'Ted', 'salary': 500}]
>>> sorted(peeps, key=lambda x: (x['name'], x['salary']))
[{'salary': 500, 'name': 'Bill'}, {'salary': 1000, 'name': 'Bill'}, {'salary': 500, 'name': 'Ted'}]
如果你想要使salary逆序,只需要如下改动:
>>> sorted(peeps, key=lambda x: (x['name'], -x['salary']))
[{'salary': 1000, 'name': 'Bill'}, {'salary': 500, 'name': 'Bill'}, {'salary': 500, 'name': 'Ted'}]
‘肆’ Python3有性能上的提升么
#xiaodeng
#python3
#1、编码方式和性能
'''
1、py3运行效率更快
2、默认源文件编码ASCII变为UTF-8,以前文件前加入的coding=utf-8不再需要
3、针对unicode的处理有了明显的改善,效率明显提升
'''
#2、数据类型和基本运算
'''
1、int和long进行了统一,统一为int
2、True、False、None都是关键词
3、必须以b'...'表示二进制数据,可以使用u'..'表示字符串,不加u也表示字符串
4、移除<>不等号,使用“!=”表示不等号关系
1)2!=3
2)2<>3#出现语法错误
5、调整除法符号‘/’的用法,只返回浮点数,要返回整数要使用“//”
6、py3运算对数据的类型要求更加的严格
'''
deffoo(test=None):
iftestisNone:
print(test)
foo()
print(5/2)#浮点数
print(5//2)#整数
print(1/3)
#4、print和exec用法
'''
1、print是一个函数,不再是一个语句,其中不需要用空格,后面打印的内容需要有括号括起来
2、exec函数用法发生变化
'''
deffoo():
_local=locals()
exec('a=4',globals(),_local)
a=_local['a']
print(a)
foo()
#5、input、bin、oct和for循环
'''
1、raw_input统一为input
在py2中用法为:
1)a=raw_input('请输入:')
printa
2)a=input('请输入:')#接收一个有效的表达式,如:2+3,而不能单独接收3
printa
2、for循环的变量不再泄露在全局变量中,此bug已修复
1)Python2.7.10(default,May232015,09:40:32)[MSCv.150032bit(Intel)]onwin32
Type"right","credits"or"license()"formoreinformation.
>>>i=8
>>>print[iforiinrange(5)]
[0,1,2,3,4]
>>>printi
#按照道理来讲for循环中的i与最外面的i=8的i是不同的,但是这里。。。。。
>>>
2)
i=6
print([iforiinrange(5)])#结果为[0,1,2,3,4]
print(i)#结果i=6
'''
#6、a=input('请输入:')#这里不再需要一个有效的表达式,他的用法和raw_input相同
#print(a)
#7、range和dict的变化
'''
1、在python2中,range火xrange会创建一个列表。常出现在for循环、字典、列表中,但是py3中xrange改名为range,在python3中使用
使用xrange会触发错误。同时range返回的是可迭代对象而不再是列表形式,要想使range的结果得到一个list数据必须要使用list(range(5))
2、字典内的dict.iterkeys(),dict.itervalues(),dict.iteritems()被keys()andvalues()anditems()所替代
他们的返回结果类似于集的可迭代对象,而不是键值对的列表。从而在不进行键和值条目复制的情况下就能对其执行set操作
'''
a=range(6)
print(a)#result:range(0,6)对象,不是列表
print(list(a))#result:[0,1,2,3,4,5]
foriinrange(6):
print(i)
#print(xrange(5))#报错:提示为name"xrange"is'notdefined
#dict案例
d={'name':"iaodeng",'sex':28}
print(d.items())
print(type(d.items()))#<class'dict_items'>
#返回结果dict_items([('name','iaodeng'),('sex',28)])
#这里不再是列表形式
'''
Python2.7.10(default,May232015,09:40:32)[MSCv.150032bit(Intel)]onwin32
Type"right","credits"or"license()"formoreinformation.
>>>d={'name':"iaodeng",'sex':28}
>>>printd
{'name':'iaodeng','sex':28}
>>>printd.items()
[('name','iaodeng'),('sex',28)]
>>>printd.iteritems()#返回一个可迭代对象
<dictionary->
>>>foriind.iteritems():printi
('name','iaodeng')
('sex',28)
>>>
'''
print('xiaodeng:d.keys():',d.keys())#xiaodeng:d.keys():dict_keys(['name','sex'])
print(type(d.keys()))#<class'dict_items'>
#values()同理
print("既然是可迭代对象,那么还可以进行下面操作")
foriind.items():
print(i)
forkeyind.keys():
print(key)
print("values用法同理")
print('用list将可迭代对象转化为list数据')
print(list(d.values()))
#7、python3具有单一的str类型,其类型相当于python2的unicode,python3所有的字符串都是unicode
#新增bytes类型
a=b"china"
print(type(a))#<class'bytes'>
#str和tytes对象都可以使用encode和decode来进行转化
s=a.decode()
print(s)#china字符串类型
s=s.encode()
print(s)#b"china",tytes字节类型
#8、输入和输出
a=open('test.txt','w')
a.write("writeinsomething")
a.close()
b=open("test.txt","r")
print(b.read())#note:注意加括号
"""
1、如果要对文本执行任何I/O操作,python3会强制用户使用文本模式,打开文件,如果不想使用默认编码utf-8
通常需要指明所需的编码
2、如果对二进制数据进行I/O操作,必须使用二进制模式打开文件或进行读写操作
eg:
f=open("test1.txt","wb+")#二进制追加模式
f.write(b"wlovefengmei")#必须加b,以bytes对象的形式进行写入
f.close()
file=open(filename,mode)
mode:
r:只读模式
w:只写,如果文件已存在则会进行覆盖操作,所以格外小心,如果文件不存在则创建新的文件
a:打开文件用于追加,只写如果文件不存在则创建
b:二进制,不能单独使用
经过演变会有很多形式
"""
#9、迭代器
"""
1、range在python3中返回颗迭代对象二不是列表,最大限度节约内存
2、zip(),map(),filter(),key(),value()返回的均是可迭代对象
"""
#10、异常错误处理
"""
1、必须使用关键词as,try和exceptNameErrorase语句
2、案例:
python2
try:
something
exceptNameError,err:
printerr
python3
try:
something
exceptNameErroraserr:
print(err)
3、raise触发语法用法的变化,python3只接受带括号的
1)raiseIOError,"fileerror"#出现语法错误
2)raiseIOError("fileerror")
"""
#11、面向对象
"""
1、需要单独深入学习
"""
#12、模块的变动
‘伍’ 用python3怎么解决这道题
代码如下:
#coding=utf-8
person=[]
#读取文件并整理数据
withopen('record.txt')asf:
forlineinf.readlines():
line=line.strip()
ifline!=''andnotline.startswith('#'):
items=line.split(',')
p={}
p['name']=items[0].strip().title()#姓名首字母转大写
p['age']=int(items[1].strip())
p['score']=int(items[2].strip())
person.append(p)
sum=0
print('低于60分的人有:')
forpinperson:
sum+=p['score']
ifp['score']<60:
print(p['name'])
print('所有人的总分:',sum)
运行结果:
‘陆’ python3和Python2的区别
你应该是刚接触Python吧,建议直接学Python3.x
下面是Python2.x与3.x版本区别:
Python的3.0版本,常被称为Python 3000,或简称Py3k。相对于Python的早期版本,这是一个较大的升级。
为了不带入过多的累赘,Python 3.0在设计的时候没有考虑向下相容。
许多针对早期Python版本设计的程式都无法在Python 3.0上正常执行。
为了照顾现有程式,Python 2.6作为一个过渡版本,基本使用了Python 2.x的语法和库,同时考虑了向Python 3.0的迁移,允许使用部分Python 3.0的语法与函数。
新的Python程式建议使用Python 3.0版本的语法。
除非执行环境无法安装Python 3.0或者程式本身使用了不支援Python 3.0的第三方库。目前不支援Python 3.0的第三方库有Twisted, py2exe, PIL等。
大多数第三方库都正在努力地相容Python 3.0版本。即使无法立即使用Python 3.0,也建议编写相容Python 3.0版本的程式,然后使用Python 2.6, Python 2.7来执行。
Python 3.0的变化主要在以下几个方面:
1.print 函数
print语句没有了,取而代之的是print()函数。 Python 2.6与Python 2.7部分地支持这种形式的print语法。在Python 2.6与Python 2.7里面,以下三种形式是等价的:
print"fish"
print("fish")#注意print后面有个空格
print("fish")#print()不能带有任何其它参数
然而,Python 2.6实际已经支持新的print()语法:
from__future__importprint_function
print("fish","panda",sep=',')
2.Unicode(这是一个极其好的改进)
Python 2 有 ASCII str() 类型,unicode() 是单独的,不是 byte 类型。
现在, 在 Python 3,我们最终有了 Unicode (utf-8) 字符串,以及一个字节类:byte 和 bytearrays。
由于 Python3.X 源码文件默认使用utf-8编码,这就使得以下代码是合法的:
>>>中国='china'
>>>print(中国)
china
Python 2.x
>>>str="我爱北京天安门"
>>>str
''
>>>str=u"我爱北京天安门"
>>>str
u''
Python 3.x
>>>str="我爱北京天安门"
>>>str
'我爱北京天安门'
3.除法运算
Python中的除法较其它语言显得非常高端,有套很复杂的规则。Python中的除法有两个运算符,/和//
首先来说/除法:
在python 2.x中/除法就跟我们熟悉的大多数语言,比如Java啊C啊差不多,整数相除的结果是一个整数,把小数部分完全忽略掉,浮点数除法会保留小数点的部分得到一个浮点数的结果。
在python 3.x中/除法不再这么做了,对于整数之间的相除,结果也会是浮点数。
Python 2.x:
>>>1/2
0
>>>1.0/2.0
0.5
Python 3.x:
>>>1/2
0.5
而对于//除法,这种除法叫做floor除法,会对除法的结果自动进行一个floor操作,在python 2.x和python 3.x中是一致的。
python 2.x
>>>-1//2
-1
python 3.x:
>>>-1//2
-1
注意的是并不是舍弃小数部分,而是执行floor操作,如果要截取小数部分,那么需要使用math模块的trunc函数
python 3.x:
>>>importmath
>>>math.trunc(1/2)
0
>>>math.trunc(-1/2)
0
4.异常
在 Python 3 中处理异常也轻微的改变了,在 Python 3 中我们现在使用 as 作为关键词。
捕获异常的语法由except exc, var改为except exc as var。
使用语法except (exc1, exc2) as var可以同时捕获多种类别的异常。 Python 2.6已经支持这两种语法。
1. 在2.x时代,所有类型的对象都是可以被直接抛出的,在3.x时代,只有继承自BaseException的对象才可以被抛出。
2. 2.x raise语句使用逗号将抛出对象类型和参数分开,3.x取消了这种奇葩的写法,直接调用构造函数抛出对象即可。
在2.x时代,异常在代码中除了表示程序错误,还经常做一些普通控制结构应该做的事情,在3.x中可以看出,设计者让异常变的更加专一,只有在错误发生的情况才能去用异常捕获语句来处理。
5.xrange
在 Python 2 中 xrange() 创建迭代对象的用法是非常流行的。比如: for 循环或者是列表/集合/字典推导式。
这个表现十分像生成器(比如。"惰性求值")。但是这个 xrange-iterable 是无穷的,意味着你可以无限遍历。
由于它的惰性求值,如果你不得仅仅不遍历它一次,xrange() 函数 比 range() 更快(比如 for 循环)。尽管如此,对比迭代一次,不建议你重复迭代多次,因为生成器每次都从头开始。
在 Python 3 中,range() 是像 xrange() 那样实现以至于一个专门的 xrange() 函数都不再存在(在 Python 3 中 xrange() 会抛出命名异常)。
importtimeit
n=10000
deftest_range(n):
returnforiinrange(n):
pass
deftest_xrange(n):
foriinxrange(n):
pass
Python 2
print'Python',python_version()
print' timingrange()'
%timeittest_range(n)
print' timingxrange()'
%timeittest_xrange(n)
Python2.7.6
timingrange()
1000loops,bestof3:433µsperloop
timingxrange()
1000loops,bestof3:350µsperloop
Python 3
print('Python',python_version())
print(' timingrange()')
%timeittest_range(n)
Python3.4.1
timingrange()
1000loops,bestof3:520µsperloop
print(xrange(10))
---------------------------------------------------------------------------
NameErrorTraceback(mostrecentcalllast)
<ipython-input-5-5d8f9b79ea70>in<mole>()
---->1print(xrange(10))
NameError:name'xrange'isnotdefined
6.八进制字面量表示
八进制数必须写成0o777,原来的形式0777不能用了;二进制必须写成0b111。
新增了一个bin()函数用于将一个整数转换成二进制字串。 Python 2.6已经支持这两种语法。
在Python 3.x中,表示八进制字面量的方式只有一种,就是0o1000。
python 2.x
>>>0o1000
512
>>>01000
512
python 3.x
>>>01000
File"<stdin>",line1
01000
^
SyntaxError:invalidtoken
>>>0o1000
512
7.不等运算符
Python 2.x中不等于有两种写法 != 和 <>
Python 3.x中去掉了<>, 只有!=一种写法,还好,我从来没有使用<>的习惯
8.去掉了repr表达式``
Python 2.x 中反引号``相当于repr函数的作用
Python 3.x 中去掉了``这种写法,只允许使用repr函数,这样做的目的是为了使代码看上去更清晰么?不过我感觉用repr的机会很少,一般只在debug的时候才用,多数时候还是用str函数来用字符串描述对象。
defsendMail(from_:str,to:str,title:str,body:str)->bool:
pass
9.多个模块被改名(根据PEP8)
>>>s=b.decode()
>>>s
'china'
>>>b1=s.encode()
>>>b1
b'china'
3)dict的.keys()、.items 和.values()方法返回迭代器,而之前的iterkeys()等函数都被废弃。同时去掉的还有 dict.has_key(),用 in替代它吧 。
‘柒’ python判断是否满足条件然后选择字典中的键
people={
'乔峰':{
'绝技':'降龙十八掌',
'门派':'丐帮'
},
'张无忌':{
'绝技':'干坤大挪移',
'门派':'明教'
},
'令狐冲':{
'绝技':'独孤九剑',
'门派':'华山派'
},
}
labels={
'绝技':'行走江湖的绝技',
'门派':'所在的门派'
}
name=input("输入大侠的名字:")
r=input("请选择大侠的绝技:q,或者门派:a:")
ifr=='q':
y='绝技'
ifr=='a':
y='门派'
ifnameinpeople:
print("{}大侠{}是{}.".format(name,labels[y],people[name][y]))
#输入大侠的名字:张无忌
#请选择大侠的绝技:q,或者门派:a:q
#张无忌大侠行走江湖的绝技是干坤大挪移.
‘捌’ python2和python3的区别
简单的说,2是旧3是新,3是2的升级版,3完全高于2,2是时代的眼泪3是现在和未来,2逐渐被淘汰3用的人越来越多。
之前两个版本共存只是因为诸多package的更新换代并没有跟上,但是到了现在只要还有活人维护的package基本都兼容3了,然而新建的package却越来越多不兼容2。使用2的意义基本没有了,日常用3大不了留一个2备用就行。
‘玖’ 学习这个的吗Python3实用编程技巧进阶我
一、如何在列表,字典,集合中根据条件筛选数据?
问题1:
如何过滤掉列表[3,9,-1,10,20,-2]中的负数?
解决方法:
在Python中可以使用函数式编程,列表解析,字典解析集合解析等方式进行筛选。
1)最通常的方法:迭代
data = [3,9,-1,10,20,-2]res = []for x in data: if(x >= 0): res.append(x)print(res)
2)使用filter函数
from random import randintdata = [randint(-10,10) for x in range(10)] #在-10到10之间随机生成10个随机数newdata = list(filter(lambda x: x >= 0, data))print(newdata)
注意Python3中的filter函数返回的对象从列表改为了Iterator(迭代器),因此如果想返回一个列表,就要加上list()
3)列表解析
newdata2 = [x for x in data if x >= 0]print(newdata2)
结果和使用filter函数相同,但是使用列表解析所需的时间要比使用filter快很多,所以首选的方式就是列表解析,另外这两种方式都远快于迭代的方式。(推荐阅读:Python零基础入门在线网课)
问题2:
如何筛选出字典中值高于90的项?
解决方法:
from random import randintdic = {x: randint(60,100) for x in range(1,11)} #随机生成学号1到10的学生成绩newdic = {k:v for k,v in dic.items() if v >= 90} #同时迭代键和值,Python3中的iteritems变为itemsprint(newdic)
问题3:
如何筛选出集合{77,89,32,29,33}中能被3整除的元素?
解决方法:
s = {77,89,32,29,33}news = {x for x in s if x % 3 == 0}print(news)
二、如何为元组中的每个元素命名,提高程序的可读性?
实际案例:
如学生信息管理系统中数据为固定格式:
(名字,年龄,性别...)
学生数量很大,为了减少存储开销,对每个学生信息采用元组表示:
(‘jam’,16,’male’)
(‘tom’,18,’male’)
(‘july’,19,’female’)
...
访问元组时,需要使用索引(index)来访问,
如一个学生元组为student = ('jam',19,'male'),那么想要访问其名字时要使用student[0],访问其性别时要使用student[2]
由此带来的问题是大量的索引会降低程序的可读性,
那么如何来解决这个问题呢?
有两种解决方案:
方案1:定义枚举类型,也就是定义一系列数值常量
NAME = 0AGE = 1SEX = 2# NAME,AGE,SEX = range(1,4)student = ('jam',19,'male')print(student[NAME])print(student[AGE])
方案2:使用标准库中collections.namedtuple替代内置的tuple
from collections import namedtupleStudent = namedtuple('student',['name','age','sex']) #相当于创建了一个命名元组类,第一个参数是元组的名字,第二个参数是其属性s1 = Student('jam',18,'male') #可以直接传参s2 = Student(name='tom',age=20,sex='male') #也可以通过关键字传参print(s1.name) #通过属性来访问print(s2.age)