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,就是 boolTrue。如果你输了 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.urlliburllib2合并成了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-8gbkcp936等,通过这些编码方式,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. 仿网易新闻app下拉标签选择菜单

    仿网易新闻app下拉标签选择菜单 仿网易新闻app下拉标签选择菜单,长按拖动排序,点击增删标签控件 ##示例  ##EasyTagDragView的使用 在layout布局里添加:  

  2. 网站waf检测

    WAFW00F WAFW00F识别和指纹Web应用防火墙(WAF)产品. 其工作原理是首先通过发送一个正常http请求,然后观察其返回有没有一些特征字符,若没有在通过发送一个恶意的请求触发waf拦截来 ...

  3. php之试触法----error--关键字的误用

    实际开发中,在不同网页的输出中,常常有许多公共的代码或者变量需要使用,于是定义了以下类来缩减代码量 如下代码所示: <?php class universalClass { function w ...

  4. 企业QQ客服的添加

    商城项目需要用腾讯的企业QQ客服,但默认提供的是一个链接,点击后弹出一个新页面, 请确认 确认打开QQ与营销QQ4009928310对话? 点确认才弹出聊天窗口,并不是需求想要的效果,经过一番折腾联系 ...

  5. U盘发现器

    U盘发现器 package com.lx.io; import java.io.File; import java.io.IOException; import java.util.ArrayList ...

  6. static关键字,引发的spring普通类获取spring的bean的思考

    在c++和java中static关键字用于修饰静态成员变量和成员函数 举例一个普通的javabean class AA { int a; static int b; geta/seta;//此处省略g ...

  7. Ansible 运维自动化 ( 配置管理工具 )

    背景 出差背景,要搞项目的自动化部署.因为只直接对接生产分发,机器又非常多,这样以往使用的bat只能作为应急方案了,还是得考虑使用专业化的工具来做这个事情! 当下有许多的运维自动化工具( 配置管理 ) ...

  8. 机器学习 —— 基础整理(五)线性回归;二项Logistic回归;Softmax回归及其梯度推导;广义线性模型

    本文简单整理了以下内容: (一)线性回归 (二)二分类:二项Logistic回归 (三)多分类:Softmax回归 (四)广义线性模型 闲话:二项Logistic回归是我去年入门机器学习时学的第一个模 ...

  9. (转)TCP和UDP之间的区别

    TCP和UDP区别     TCP UDP 是否连接 面向连接 面向非连接 传输可靠性 可靠的 不可靠的 应用场合 传输大量的数据 少量数据 速度 慢 快    OSI 和 TCP/IP 模型在传输层 ...

  10. Android APP 内部捐赠实现(支付宝&微信)

    Android APP 内部捐赠实现(支付宝&微信) 目前支持 支付宝和 微信. 项目地址:https://github.com/didikee/AndroidDonate https://p ...