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)