Python 3.8 与老版本的不同要点

1、print 打印内容要用括号括起来。

       例如:print(’ Hello Tvm-ERP ') 

2、reload 重载模块前需要先执行  import importlib  。

     例如:import hello2

                import importlib
                importlib.reload(hello2)  #重载hello2模块

3、socket发送send字符串时必须 str.encode(encoding = "utf-8")或gbk ,接收recv时需要str.recv(1024).decode('utf-8')

     encode该方法返回编码后的字符串,它是一个 bytes 对象

     例如:服务端          

import socket
def main():
    s = socket.socket()
    port = 51234
    s.bind(('localhost', port))
    s.listen(5)
    while True:
        c, addr=s.accept()
        print('got connection ', addr)
        c.send('XDQ,你非常棒!'.encode(encoding = "utf-8"))
        c.close()

if __name__ == "__main__":
    main()

           客户端

#socketc1.py
import socket
def main():
    s = socket.socket()
    add = input('请输入服务端地址:')
    s.connect((add, 51234))
    print(s.recv(1024).decode('utf-8'))


if __name__ == '__main__':
    main()

4、除法运算

     Python中的除法较其它语言显得非常高端,有套很复杂的规则。Python中的除法有两个运算符,/和//

 再也不用关注什么类型了,结果总为浮点型

  >>>1/2

     0.5

 >>>-1//2

     -1     #//是作为floor运算

5、uncode

   Python3.X 源码文件默认使用utf-8编码,这就使得以下代码是合法的:

>>> 中='232323'
>>> 中
'232323'

6、range() 是像 xrange() 那样实现,xrange() 函数不再存在

7、八进制数必须写成0o777,原来的形式0777不能用了;二进制必须写成0b111。

新增了一个bin()函数用于将一个整数转换成二进制字串

8、不等运算符

Python 2.x中不等于有两种写法 != 和 <>

Python 3.x中去掉了<>, 只有!=一种写法,还好,我从来没有使用<>的习惯

9、去掉了repr表达式``

Python 2.x 中反引号``相当于repr函数的作用

Python 3.x 中去掉了``这种写法,只允许使用repr函数,这样做的目的是为了使代码看上去更清晰么?不过我感觉用repr的机会很少,一般只在debug的时候才用,多数时候还是用str函数来用字符串描述对象。

10、多个模块被改名(根据PEP8)

旧的名字 新的名字
_winreg winreg
ConfigParser configparser
copy_reg copyreg
Queue queue
SocketServer socketserver
repr reprlib

StringIO模块现在被合并到新的io模组内。 new, md5, gopherlib等模块被删除。 Python 2.6已经支援新的io模组。

httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib被合并到http包内。

取消了exec语句,只剩下exec()函数。 Python 2.6已经支援exec()函数。

11、.数据类型

(1)Py3.X去除了long类型,现在只有一种整型——int,但它的行为就像2.X版本的long

(2)新增了bytes类型,对应于2.X版本的八位串,定义一个bytes字面量的方法如下:

>>> b = b'china' 
>>> type(b) 
 

str 对象和 bytes 对象可以使用 .encode() (str -> bytes) 或 .decode() (bytes -> str)方法相互转化。

>>> s = b.decode() 
>>> s 
'china' 
>>> b1 = s.encode() 
>>> b1 
b'china' 

(3)dict的.keys()、.items 和.values()方法返回迭代器,而之前的iterkeys()等函数都被废弃。同时去掉的还有 dict.has_key(),用 in替代它吧 。

12、打开文件

原:

file( ..... )
或 
open(.....)

改为只能用

open(.....)

从键盘录入一个字符串

原:

raw_input( "提示信息" )

改为:

input( "提示信息" )

在python2.x中raw_input()和input( ),两个函数都存在,其中区别为:

  •  raw_input()---将所有输入作为字符串看待,返回字符串类型
  •  input()-----只能接收"数字"的输入,在对待纯数字输入时具有自己的特性,它返回所输入的数字的类型(int, float )

在python3.x中raw_input()和input( )进行了整合,去除了raw_input(),仅保留了input()函数,其接收任意任性输入,将所有输入默认为字符串处理,并返回字符串类型。

13、map、filter 和 reduce

这三个函数号称是函数式编程的代表。在 Python3.x 和 Python2.x 中也有了很大的差异。

首先我们先简单的在 Python2.x 的交互下输入 map 和 filter,看到它们两者的类型是 built-in function(内置函数):

>>> map

>>> filter

>>>

它们输出的结果类型都是列表:

>>> map(lambda x:x *2, [1,2,3])
[2, 4, 6]
>>> filter(lambda x:x %2 ==0,range(10))
[0, 2, 4, 6, 8]
>>>

但是在Python 3.x中它们却不是这个样子了:

>>> map

>>> map(print,[1,2,3])

>>> filter

>>> filter(lambda x:x % 2 == 0, range(10))

>>>

首先它们从函数变成了类,其次,它们的返回结果也从当初的列表成了一个可迭代的对象, 我们尝试用 next 函数来进行手工迭代:

>>> f =filter(lambda x:x %2 ==0, range(10))
>>> next(f)
0
>>> next(f)
2
>>> next(f)
4
>>> next(f)
6
>>>

对于比较高端的 reduce 函数,它在 Python 3.x 中已经不属于 built-in 了,被挪到 functools 模块当中。

 

 

 

 

你可能感兴趣的:(python)