Python2和Python3的一些语法区别

python


1.print

在版本2的使用方法是:

print 'this is version 2

也可以是

print('this is version 2')

但到了3,就只能加上括号,像一个函数一样来使用 print:

print('this is version 3')

2.input

2里面有两个用来从命令行接受输入的函数:input 和 raw_input。

value = input()

input 接收的是一个值或变量,也就是说,你如果输 123,程序接收到的就是整数 123,你输 True,就是 bool 值 True。如果你输了 abc,程序会认为这是一个叫做 abc 的变量,而假如你没有定义过这个变量,就会报错。

所以,当你想用 input 得到一段文字的话,必须把文字写在引号 "" 或 '' 中。

text = raw_input()

raw_input 接收的则是你输入的字符串,而不管你输的是什么内容。如果你直接拿 raw_input 得到的“数字”去比较大小,则会得到奇怪的结果。

在版本3里,为了减少混乱,这两种输入方式被合并了。只是合并的方式又坑了新手:它保留了 input 这个名字和 raw_input 的效果。3里只有input函数,它接收你输入的字符串,不管你输的是什么。

text = input()

那么在3里,如何像2一样得到用户输入的一个值呢?方法是 eval():

value = eval(input())

或者,如果你只是需要一个整数值,也可以:

value = int(input())

3. python3版本相对2版本的部分其他区别

除了一开始越到的这两个坑外,还有其他一些可能遇到的变动,这里以3与2相比的差异来说:

1.打开文件不再支持 file 方法,只能用 open

2.range不再返回列表,而是一个可迭代的range对象

3.除法 / 不再是整除,而是得到浮点数,整除需要用双斜杠 //

4.urllib和urllib2合并成了urllib,常用的urllib2.urlopen()变成了urllib.request.urlopen()

5.字符串及编码相关有大变动,简单来说就是原来的str变成了新的bytes,原来的unicode变成了新的str。

  • bytes

相当于python2中的str类型,从网页上抓取下来的数据流也是该类型的

在python3中,要得到一个bytes类型的变量,可以在字符串内容前面加入b得到,前提是该字符串的内容是可以完全由ASCII码表示的,否则会出现语法错误

相当于Python2中的str类型,从网页上抓取下来的数据流也是该类型的

在Python3中,要得到一个bytes类型的变量,可以在字符串内容前面加入b得到,但前提是该字符串的内容是可以完全由ascii码表示的,否则会出现语法错误。

Python 3.6.1

>>>s1 = "你好"
>>>s1
'你好'
>>>type(s1)
<class 'str'> >>>s2 = b'你好'
>>>
File "<stdin>", line 1
SyntaxError: bytes can only contain ASCII literal characters. >>>s2 = b'abc'
>>>s2
b'abc'
>>>type(s2)
<class 'bytes'>
  • unicode

unicode为解决传统字符编码的局限性而产生,为每一种语言的每一个字符设置了统一且唯一的二进制码,Python内部用于记录的也是该编码方式

上面的例子中s1就是通过unicode码来进行存储的

  • str

在Python3中的str类型对应的就是Python2中的unicode类型,即以统一的unicode码保存。而且,在Python3中,程序中所设置的字符串即直接保存为统一的str类型(unicode)

上面的例子中s1就是str类型的变量

  • encode与decode

由于存在着这两种不同的类型,势必要牵涉到二者的互相转化。bytes通过某一种编码方式(decode)得到str,而str通过某一种解码方式(encode)得到bytes

问题:为何会出现乱码的情况

unicode是表示了世界上所有的字符的, 但是其内部的存储是以二进制位存储的,比如你好的unicode编码为\u4f60\u597d

但是我们所见到的并不是\u4f60\u597d这一串编码,而是你好这两个汉字

这是由于控制台环境本身提供一个编码方式,比如uft-8,gbk,cp936等,通过这些编码方式,unicode码就转换成了我们可识别的字符了。

但是,不同的编码方式之间是存在区别的,当得到一个通过A方式编码得到的bytes类型,如果用B方式去进行解码的话,它就会按照B的标准去解读,那样就会出现乱码的现象。

s = "你好"
print(s)
s1 = s.encode("utf-8").decode("gbk")
print(s1)
######output########
你好
浣犲ソ

因此,开发的时候要弄清楚输入来源的编码以及输出环境的编码,尽可能保证一致性,或者做好转换的工作,可以减少出现乱码的可能性

问题:如何获取编码方式的信息?

  • 获取目标bytes的编码方式

这一情况可以通过chardet模块的detect()函数来获取信息,chardet是第三方库,可以通过pip来安装

b是待检测的bytes变量

import chardet
print(chardet.detect(b))
######output####
{'confidence': 1.0, 'encoding': 'ascii'}

confidence是指匹配程度,encoding是指可能的编码方式

获取当前环境的编码方式

这一情况可以使用sys模块下的getdefaultencoding()函数来获取信息

import sys
print(sys.getdefaultencoding()) ######## output#####
utf-8

问题:在控制台上看到的到底是什么?

写上面的东西的时候产生了一个疑问,现在已经知道Python内部存储str的方式是使用unicode字符集,但是我们在屏幕上看到的并不是unicode字符集

s = "你好"
print(s) #########output#############
你好
s的 unicode 是 \u4f60\u597d

那么,这中间应该是进行了某种转换

实际上,在执行print(str)的时候,python内部执行了encoding操作,控制台拿到的其实是一个bytes变量

之后,控制台又根据环境内部的编码方式,将所得到的bytes内容进行decoding的操作,就显示了原先str的内容

Python2和Python3的一些语法区别的更多相关文章

  1. day008 字符编码之 字符编码 、Python2和Python3字符编码的区别

    计算机基础(掌握) 启动应用程序的流程 双击qq 操作系统接受指令然后把该操作转化为0和1发送给CPU CPU接受指令然后把指令发送给内存 内存接受指令把指令发送给硬盘获取数据 qq在内存中运行 文本 ...

  2. Python2与Python3字符编码的区别

    目录 字符编码应用之Python(掌握) 执行Python程序的三个阶段 Python2与Python3字符串类型的区别(了解) Python2 str类型 Unicode类型 Python3 字符编 ...

  3. python2和python3中range的区别

    参考自 python2和python3中的range区别 - CSDN博客 http://blog.csdn.net/xiexingshishu/article/details/48581379 py ...

  4. Python2与python3中字符串的区别

    Python2 在python中包含两种字符串类型:str和unicode,str并不是完全意义上的字符串,其实是由unicode经过编码(encode)后的字节组成的字节字符串,而unicode则是 ...

  5. python2和python3中的range区别

    python2中的range返回的是一个列表 python3中的range返回的是一个迭代值 for i in range(1,10)在python2和python3中都可以使用,但是要生成1-10的 ...

  6. python2与python3中除法的区别

    python2中的除法 >>>1/2 0 即一个整数(无小数部分的数)被另外一个整数除,计算结果的小数部分被截除了,只留下了整数部分 有时候,这个功能比较有用,譬如在做一些需要取位数 ...

  7. python2 与python3中最大的区别(编码问题bytes&str

    1,在python2.x 中是不区分bytes和str类型的,在python3中bytes和str中是区分开的,str的所有操作bytes都支持 python2 中 >>> s = ...

  8. flask ssti python2和python3 注入总结和区别

    总结一下flask ssti的注入语句 代码 import uuid from flask import Flask, request, make_response, session,render_t ...

  9. python2和python3中str,bytes区别

    python2中,有basestring.str.bytes.unicode四种类型 其中str == bytes ,basestring = (str,unicode) >>> i ...

随机推荐

  1. 2017寒假零基础学习Python系列之函数之 返回多个值

    Python也和C语言一样有自己的标准库,不过在Python中叫做模块(module),这个和C语言中的头文件以及Java中的包类似,其中math就是其中之一,math模块中提供了sin()和cos( ...

  2. javascript之原型(prototype)

    今天是第一次写博客,写点在javascript中重要的一个概念----原型(prototype): 原型,顾名思义,就是一切事物的模板. 柏拉图在<理想国>卷10中说:"床不是有 ...

  3. 这个类复制文本文件FileCopy

    package JBJADV003; import java.io.File;import java.io.BufferedReader;import java.io.BufferedWriter;i ...

  4. 使用 electron 做个播放器

    使用 electron 做个播放器 本文同步更新在:https://github.com/whxaxes/blog/issues/8 前言 虽然 electron 已经出来好长时间了,但是最近才玩了一 ...

  5. Centos7yum安装Redis详细教程

    原本是在自己的mac上安装redis的,通过brew去安装的redis觉得很简单,实际macos系统与centos系统还是有一些区别的. 1.yum安装redis服务 sudo yum install ...

  6. VS2010中的sln,suo分别是什么文件

    相当于VC6里的.dsw和.dsp .Net解决方案下 .sln文件和.suo文件的解释: When a Web site is created, a solution file (.sln) and ...

  7. PostGreSQL数据库安装教程

    windows 10 x64 pro 1703安装postgresql-9.6.3-2-windows-x64.exe数据库,步骤如下: 第一:下载数据库安装程序,下载地址为:https://www. ...

  8. Spring Boot 系列(二)单元测试&网络请求

    实际开发中,Junit单元测试是必不可少的.在spring-boot 中可以通过测试模块(spring-boot-starter-test)快速使用单元测试功能. 开始 本示例在 spring boo ...

  9. Educational Codeforces Round 25 Five-In-a-Row(DFS)

    题目网址:http://codeforces.com/contest/825/problem/B 题目:   Alice and Bob play 5-in-a-row game. They have ...

  10. Android - FEATURE_NO_TITLE

    Android设置无标题的方法 在onCreate()中写入: requestWindowFeature(Window.FEATURE_NO_TITLE); 例如: protected void on ...