字符编码

为什么要编码

因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理

AscII码 :标准ASCII码是采用7位二进制码来编码的,最高为0,没有0000 0000,所以就是2**7-1=127个字符 , 当用1个字节(8位二进制码)来表示ASCII码时,就在最高位添加1个0。1个字节表示一个英文字母。扩充的ASCII码最高位为1,相应的十进制为1~255。

  一个英文字母占一个字节

    8位(bit)==一个字节(byte)

  1024byte=1KB

    1024kb==1MB

    1024MB=1GB

    1024GB==1TB

Unicode:当时为了解决ASCII全球化的问题,就出现了Unicode,Unicode规定一个中文用4个字节表示,一个英文用2个字节表示。python3用四个字节来表示一个字符包含英语字母和汉字。

utf-8:其实就是Unicode的升级版,规定英文用1个字节表示,汉字用3个字节表示。

GBK:英文占用一个字节,汉字占用两个字节。

字符编码重点

关于字符编码困扰我好久了,今天我终于弄明白了,

编码(encode):将unicode编码的str转化为其他编码bytes类型的过程

解码:将其他编码的bytes类型转换为unicode编码的str字符串的过程

你要把gbk编码的字符串转换为utf的字符串必须这么办?

s = "你好"
print(s.encode("gbk").decode("gbk").encode("utf-8"))

结果:

b'\xe4\xbd\xa0\xe5\xa5\xbd'

问题一为什么要字符编码?

因为机器语言只能识别01010101,所以你编写的任何东西最后都要转化为bytes的类型。才能够让机器识别运行,bytes和二进制编码可以直接转换

Python 3最重要的新特性大概要算是对文本和二进制数据作了更为清晰的区分

文本在内存中是用Unicode编码方式编码而存储的.其表现形式是str类型,这里很重要,你在解释器中看到的所有的变量函数等都是unicode在解释器中的表现形式,它在内存中就是unicode的字节码

import json
s='中国'
t=json.dumps(s)
print(t)

结果:

#在内存中就是以这种格式存在的
"\u4e2d\u56fd" #\u+16进制

文本在硬盘中和网络传输中是以(utf-8(python3默认),gbk,gb2312)编码方式编码成字节串而保存在硬盘中或网络传输的.这是因为这几种方式编码占用内存小.

s='中国'
t=s.encode()#默认utf-8
print(t)

结果:

b'\xe4\xb8\xad\xe5\x9b\xbd'

字符编码的补充版本:

新添加一个数据类型:

bytes 类型其表现形式为 s= b"alex"  内部储存是以(UTF-8,GBK,GB2312)编码方式编码的,Bytes 对象是由单个字节作为基本元素(8位,取值范围 0-255)组成的序列,为不可变对象。

str类型 其表现形式为s="alex"    内部存储是以Unicode编码方式编码的。

汉字如果在python2中显示要注释#-*-coding:utf-8-*-,python 2 中默认编码方式为ASCII,python3中默认为utf-8

encode: 方法以 encoding 指定的编码格式编码字符串(用unicode编码)。把字符串编码成bytes类型(utf-8),编码其实就是加密的意思 返回bytes

decode: 以encdoing指定的编码格式解码,解码为对应的字符串

内存中字符串是以Unicode的编码方式,占用内存大,但是可以兼容更多的编码方式

硬盘中字符串是以utf-8的编码方式编码的,

关于字符编码我又想了很长时间,得到了一些新的体会,继续补充说明。

a='你好'
a_b=a.encode('utf-8')
print(a_b) #得到a的二进制形式
for i in a_b: #这步的主要作用是把16进制转换为十进制
print(i)
for i in a_b:
print(bin(i)) #这步主要的作用是把十进制转化为二进制

结果:

b'\xe4\xbd\xa0\xe5\xa5\xbd'  #这里a的二进制数据类是用十六进制数字表示的,因为这样看起来比较清晰,其中\xe4代表1个字节,a总共有6个字节,这也印证了在uft-8中每个汉字用3个字节表示
228 #原来十六进制中的xe4就是十进制中的228
189
160
229
165
189
0b11100100 #这就是为什么a的二进制数据类型不用二进制表示的原因,这样太乱了,完全懵逼
0b10111101
0b10100000
0b11100101
0b10100101
0b10111101

bin(number):一个整数转换为一个二进制字符串。注意这个二进制是str类型的并不是bytes类型。

范例:

b=bin(100)
print(b,type(b))

结果:

0b1100100 <class 'str'>

范例

s="你好"
b=bytes(s,encoding="gbk")
print(b)
print(s.encode("utf-8")) #告诉python解释器你要把这个字符串汉字以什么方式编码,如果你要以utf-8我就3个字节(24位二进制)来表示每个汉字,如果你是要以GBK方式编码来编码字符,我就用2个字节(16位二进制来表示每个汉字)

结果:

b'\xc4\xe3\xba\xc3' #印证了GBK2个字节表示一个汉字
b'\xe4\xbd\xa0\xe5\xa5\xbd'

bytes():将字符串str类型转换成bytes类型,和字符串中的encode一样。

范例

s="你好"
b=bytes(s,encoding="gbk")
print(b)
print(s.encode("utf-8"))

结果:

b'\xc4\xe3\xba\xc3'
b'\xe4\xbd\xa0\xe5\xa5\xbd'

python2和python3编码区别

总结一下:

在python3中 文件默认编码方式是utf-8,字符串默认编码方式是unicode,以utf-8和gbk编码的代码加载到内存中会自动转化为unicode编码,window默认编码方式是gbk,unicode可以和gbk之间互相转化,这就是为什么你可以在显示屏中看到正常的字符了

在python 2中文件的默认编码方式是ascii,字符串默认编码方式也是ascii,但是ascii和unicode编码并不能互相转化,所以我们在文件头声明了utf-8,文件默认编码也会变成utf-8,这样中文也就能够在window的显示瓶中显示了.

默认编码改成unicode的话是不现实的, 因为很多软件就是基于之前的默认编码ASCII开发的,编码一换,那些软件的编码就都乱了。所以Python 2
就直接 搞了一个新的字符类型,就叫unicode类型,比如你想让你的中文在全球所有电脑上正常显示,在内存里就得把字符串存成unicode类型。
>>> s = "路飞"
>>> s
'\xe8\xb7\xaf\xe9\xa3\x9e'
>>> s2 = s.decode("utf-8")
>>> s2
u'\u8def\u98de'
>>> type(s2)
<type 'unicode'>

比较运算符和逻辑运算符

比较运算符的级别比逻辑运算符高。

逻辑运算符有not,or, and.

这几个逻辑运算符的运算优先级为:()>not>and>or

同等优先级从左到右开始运算

print(7>4==4)   #the same as 7>4 and 4==4  
 True #其实这个表达式有多个隐形的式子组成。 

例如:

A=(1 > 2 and 3 < 4 or 4 > 5 and 2 > 1 or 9 < 8)
print(a)

结果:

False

int与bool之间的转换:除了0,都是True

A=int(True)
B=int(False) print(a,b)

结果:

1,0
print(bool(1))
print(bool(3))
print(bool(0))

结果:

True
True
False

bool和str之间的转换:bool()非空字符都是true,空格也是True,空字符为False

例子

s="sdfa"
s1="a"
s2=""
s3=" "

结果:

s True
s1 True
s2 False
s3 True

例子:

 print(str(2>1))
结果:
True


例子:
name=""
if name:
print("输入正确")
else:
print("请输入内容")

结果:

请输入内容

此题关键空字符串就是false,接着就运行到了else。注意“”表示的是空字符串,而不是空格。空格就是True。

 

面试题:

  1. print( x or y) ,如果bool(x)为True,则结果为x。否则结果为Y。

例题:

print(3 or 5)
print(0 or 8)
print(-1or 0)

结果为:

3
8
-1

  2. print(X and y),如果bool(x)为True,则结果为y,如果bool(x)为False,则结果为X。

例子:

print(3 and 5)
print(0 and 8)
print(-1 and 0)

结果为:

5
0
0
例子:
print(3 or 4 or 0 and 1 or 2)

结果为:

3

 in 和 not in 的运用:

例子

sl="abcdefg"
print("a"in sl)
print("ad" in sl) #"ad" 作为一个整体相当于一个元素,而不是像这样"a""b"拆开。

结果:

True
False

题目要求:评论的内容不能有敏感词如“习大大”,“国民党”,“蒋介石”

答案:

comment=input("请输入评论")
if ("习大大"in comment )or ("国民党" in comment )or ("蒋介石"in comment):
print("评论中包含敏感词")
else:
print("评论成功")

稍微高级的解法:

list_1=["习大大","蒋介石","国民党"]
conment=input("请输入内容")
for i in list_1:
if i in conment:
print("涉及非法字符")
break
else:
print(conment) #不知道是不是新方法:for else 方法

注意:此题的关键在于敏感词要in 评论而不是commet in 敏感词。

     

Python基础2 字符编码和逻辑运算符的更多相关文章

  1. python基础_字符编码

    字符编码的历史 阶段一:现代计算机起源于美国,最早诞生也是基于英文考虑的ASCII 阶段二:为了满足中文,中国人定制了GBK 阶段三:各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的 ...

  2. python 基础之字符编码和文件处理

    一.字符编码 (1)计算机基础知识 (2)python 解释器执行py文件的原理 <1>python 解释器启动 <2>python解释器相当于一个文本编辑器,打开txt.py ...

  3. python基础4 ----字符编码

    python基础---字符编码 一.了解字符编码 1. 文本编辑器存取文件的原理(nodepad++,pycharm,word) 打开编辑器就打开了启动了一个进程,是在内存中的,所以在编辑器编写的内容 ...

  4. 第二篇.2、python基础之字符编码

    一 了解字符编码的知识储备 一 计算机基础知识 二 文本编辑器存取文件的原理(nodepad++,pycharm,word) #1.打开编辑器就打开了启动了一个进程,是在内存中的,所以,用编辑器编写的 ...

  5. 第1章 Python基础之字符编码

    阅读目录 一.什么是字符编码 二.字符编码分类 三.字符编码转换关系 3.1 程序运行原理 3.2 终极揭秘 3.3 补充 总结 回到顶部 一.什么是字符编码 计算机要想工作必须通电,也就是说'电'驱 ...

  6. Python基础之字符编码

    前言 字符编码非常容易出问题,我们要牢记几句话: 1.用什么编码保存的,就要用什么编码打开 2.程序的执行,是先将文件读入内存中 3.unicode是父编码,只能encode解码成其他编码格式 utf ...

  7. (Python基础)字符编码与转码

    ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧 ...

  8. Python全栈开发之路 【第三篇】:Python基础之字符编码和文件操作

    本节内容 一.三元运算 三元运算又称三目运算,是对简单的条件语句的简写,如: 简单条件语句: if 条件成立: val = 1 else: val = 2 改成三元运算: val = 1 if 条件成 ...

  9. 第一章:python基础语法| 字符编码| 条件语句...

    1.编程语言介绍 编程就是写代码,让计算机帮你做事情.计算机底层是电路,只认识二进制0和1.机器语言&汇编语言语言进化历史:机器.汇编.高级.机器语言只接受二进制代码:汇编语言是采用英文缩写的 ...

随机推荐

  1. 检测用户命令序列异常——使用LSTM分类算法【使用朴素贝叶斯,类似垃圾邮件分类的做法也可以,将命令序列看成是垃圾邮件】

    通过 搜集 Linux 服务器 的 bash 操作 日志, 通过 训练 识别 出 特定 用户 的 操作 习惯, 然后 进一步 识别 出 异常 操作 行为. 使用 SEA 数据 集 涵盖 70 多个 U ...

  2. RESTful API单元测试(十九)

    下面针对该Controller编写测试用例验证正确性,具体如下.当然也可以通过浏览器插件等进行请求提交验证. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ...

  3. Scanner类完成用户键盘录入

    l  Scanner类 Scanner类是引用数据类型的一种,我们可以使用该类来完成用户键盘录入,获取到录入的数据. Scanner使用步骤: 导包:import java.util.Scanner; ...

  4. 一篇文章有若干行,以空行作为输入结束的条件。统计一篇文章中单词the(不管大小写,单词the是由空格隔开的)的个数。

    #include <iostream>using namespace std; int k = 0;int n = 0;int main() { char c; char a[1000]; ...

  5. install the Mondo Rescue utility in Ubuntu 12.04 or 12.10.

      1. Open a terminal window. 2. Type in the following commands, then hit Enter after each.   wget ft ...

  6. LY.JAVA面向对象编程.final、多态、抽象类、接口

    2018-07-08    13:47:26 final关键字 多态 从右向前念 多态的成员访问特点及转型的理解 多态的问题理解: class 孔子爹 { public int age = 40; p ...

  7. Win10系列:C#应用控件基础3

    CheckBox控件 在应用程序的开发过程中开发者经常使用一组CheckBox控件来显示多个复选框,让用户从中选择一个或多个.当用户勾选复选框后,被选中的复选框会被标记为勾选状态,再次点击此复选框可取 ...

  8. RabbitMQ进阶使用-延时队列的配置(Spring Boot)

    依赖 MAVEN配置pom.xml <dependency> <groupId>org.springframework.boot</groupId> <art ...

  9. Python Django 之 Template 模板的使用

    一.模板样式 注意: 1.url urlpatterns = { path('admin/', admin.site.urls), path('order/', views.order), path( ...

  10. 1.3 CPU简介

    目录 CPU的功能模块 cpu总线 CPU寄存器 16位cpu的寄存器组 32位cpu的寄存器组 64位cpu的寄存器组 CPU的功能模块 CPU从逻辑上可以划分成3个模块,分别是控制单元.运算单元和 ...