Python字符编码以及循环机制介绍
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
身为一名运维人员就得不断的学习,那么如何身为运维的你是否已经嗅探已经很火的Python编程啦?大家可以打开智联招聘,拉勾网,猎聘网等等去查看一下中级以上的运维要求必会的技能之一就是Python没错,当然你要是会golang的话那简直就是锦上添花啊。本片博客没有涉及到很高深的数据类型,只是简单的介绍了一下字符编码和流程控制的案例。学习Python势在必行了,你准备好了没?
一.为什么Python在自动化方面这么火
1>.安装的大多数Linux发行版默认安装Python;
2>.Python有大量的线程库;
3>.Python有很多的标准库,直接导入就可以用,开发效率高;
二.Python语言和其他语言对比
相比C语言的其他语言,比如首屈一指Java,Python,golang,PHP等等,他们在写完代码之后,都会将代码交给相应的软件去编译生成字节码(比如Java写的代码就会交给Java虚拟机),然后在再将字节码转换成机器码,再然后将机器码交给操作系统去执行。而你用C语言写的代码经过编译会直接得到机器码,然后直接就可以将这个编译后的机器码交给操作系统去执行了。从执行的步骤上来看,C语言就比其他的高级语言要少一个生产字节码的环节。况且有很多语言都是基于C语言二次开发来的,比如现在特别流行的Python,golang等等。
那么你可能会问,为什么我们不直接去学习C语言呢?当然要学习C语言,一个资深的开发工程师不可能不懂C语言的,当你学习完python,当你想要了解它底层是如何实现的,你可能回去看Python的源码,这个时候你就不得不去学习C语言啦。之所以不一开始学习C语言是因为它的上手难度要大,开发周期要长,生产环境中,效率是第一生产力呀!
身为小白的你我可能都会问为什么C语言的上手难度大呢?我们举一个最简单例子,在使用C语言的时候,我们要定义一个变量时,我需要考虑这个变量占用的内存空间,还要考虑这个变量的存活周期,以及何时释放这个变量的内存等问题。而我们使用的高级语言如Java,golang,Python等等就帮我们解决这些烦恼,直接交给他们各自的软件(有的叫虚拟机比如Java,有的叫解释器比如Python,我们这里可以统称为软件)去解决这些问题,而我们只用关心如何使用这个变量即可。
Java适合做企业级的应用,Java能做的Python全部都能做,但是Java的运行效率要比Python是要高的。不过在实现相同功能的情况下,Java如果用了1000行代码实现,可能Python只需要100行就能搞定,你选择Python只是选择了一个更简单的方式去实现功能。C#适合做Windows的程序,虽然近些年在向Linux方向靠拢,但是毕竟还不成熟。你写的程序想要跑到Windows上,那就意味着你可能就得花钱了。而PHP更适合做web应用,也就是写一些前端的东西。golang更适合做网络请求,它的网络处理能力依靠它的并发能力,在网络请求处理方面的高级语言几乎没有任何一门语言可以跟他相伯仲。相比其他语言,Python会减少程序员的开发成本。
三.python语言的种类
Python是近几年才火起来的,你都能看出Python火,那么之前在IT行业的大牛们能不提前看到Python要火的趋势吗?这不,C,Java,C#,Ruby这些开发者更具有前瞻性,他们用他们各自擅长的语言重写了Python,他们都看到了Python要火,都想来分Python的一杯羹,因此在Python里面又分很多版本,而我们常用的还是C语言写的Python。对于程序员来说,这些不同版本的Python几乎无差别,因为程序员只要按照相应的Python版本来写就可以了,然后交给相应的解释器去执行。
1>.Cpython
Python的官方版本,使用C语言实现,使用最为广泛,CPython实现会将源文件(py文件)转换成字节码文件(pyc文件),然后再转换成机器码运行在Python虚拟机上。Cpython在解释代码的时候是逐行翻译的,每一行代码都会先生成字节码,然后再讲字节码转换成机器码再Python虚拟机上运行。
执行Python代码时,如果导入了其他的 .py 文件,那么,执行过程中会自动生成一个与其同名的 .pyc 文件,该文件就是Python解释器编译之后产生的字节码(注意:代码经过编译可以产生字节码;字节码通过反编译也可以得到代码)。
2>.Jyhton
Python的Java实现,Jython会将Python代码动态编译成Java字节码,然后再转换成机器码在JVM上运行。
3>.IronPython
Python的C#实现,IronPython将Python代码编译成C#字节码,然后再转换成机器码在CLR上运行。(与Jython类似)
4>.PyPy(特殊)
用Python语言自己实现的Python,它是在Cpython的基础之上又多了一次加工,它的工作方式和Cpython的逐行翻译还有所不同,它是一口气将所有的代码都先进行字节码,然后在生成机器码,最后运行的时候直接运行这个编译好的机器码即可。
5>.RubyPython、Brython ...等等
以上是Python解释器的种类介绍,我们无需关系,我们只要学习Python的语法格式写出相应的Python代码即可,至于交给哪个软件去解释就会根据实际情况而定了,不过目前主流的还是用的是CPython,PyPy这种类型暂时还未发育成熟。用的不是很广泛。
四.常见编码简介
1>ASCII
我们知道计算机是由外国人发明的,他们当时也没有考虑到全球都用到计算机,因此在设计编码的时候压根就没有考虑中文,日文,泰文等等,而是仅仅将英文大小写和标点符号等一些特殊字符考虑进去了,这种编码格式被称为ASCII编码,每个字母或特殊字符都会用8个“0”和“1”的二进制组合进行标识,聪明的小伙伴估计口算都能算出来2的八次方是多少了,没错是256个,也就是说用8个连续的“0”或者“1“是没有办法表示所有国家的语言的。因为它最大上限就是256个字符存储。比如我们要保存一个大写的字母”A“就需要一个字节,用二进制表示则为:“0100 0001”
2>.gb2312和gbk
这种编码格式就是为了解决ASCII无法存储汉字的情况而诞生的,也就是说gb2312可以存储我们的汉字,而gbk只是对gb2312的一个补充,它主要补充了中国的繁体字。这两种编码格式都可以存储ASCII的所有字符且可以存储所有的中国字符,也就是说你开发了一个中国人的游戏,如果你将这游戏放在日本,泰国等国家的电脑上安装的话可能无法运行,因为他们的电脑安装的操作系统也是他们的母语哟。gb2312和gbk编码在存储汉字上要比utf8要好的多,因为utf8在存储一个汉字的时候需要3个字节(即24位)进行存储,而gbk只需要2个字节就可以搞定,占用空间较少。
3>.万国码
但是随着计算机的快速发展,其他国家也有需求存入相应国家的文字(如中国出现了gbk编码,日本出现了Shift_JIS编码,韩国出现了Euc-kr编码等等。),因此又出现了一种能够存储各个国家的编码,我们称之为“万国码”(即Unicode),支持大多数个国家的语言文字。它有一个下限要求,就是美国字符都必须用最少16位(两个字节)来进行存储,也就是说要用连续的16个”0“和”1“的二进制数字来表示一个字符,没错,这种编码格式能够保存所有的ASCII的字符,只不过之前用一个字节存取的ASCII编码,现在要用两个字节进行存取。比如存取一个大写的“A”,用二进制表示则为:”000000000100 0001“,很明显,浪费了空间。本来用8位就可以存储的现在却用了16位来进行存储。而存储一个普通的中国汉字只需要用3个字节来存取,也就是24位来进行存储,即连续的24个“0”或者“1”来进行存储。甚至如果出现更复杂的文字可能需要用4到5个字节来进行存储。
4>.UTF8
我们刚刚也提到万国码的确是不错的,因为它能存几乎所有国家的语言和文字,但是缺陷就是对每个字符的存储空间最小必须是2个字节,这在存储一些简单的字符很明显就是浪费空间呢,于是又兴起了另外一种编码UTF-8,我们称之为可变长字符编码。它实际上是对万国码的一种压缩,能够用最少的位数表示一个字符(每个字符表示最少是8位,即一个字节)。换句话说,一个英文字符就用一个字节来表示(按照之前ASCII的方式来存取),而存储汉字还是按照万国码的方式进行存储,即3个字节表示一个汉字。
5>.推荐使用的编码格式
我们知道编码格式有很多种,虽然gbk存储汉字要比utf8要节省空间,但是我们还是推荐使用utf8编码格式,原因有三:
第一,gbk并没有包含其它国家的文字;
第二,很多开源软件使用的都是外国人开发的,他们大多数都是使用utf8编码格式;
第三,Python3.x解释器默认使用utf-8方式进行编码和解码(当然你也可以指定编码格式);
6>.Python编码相关知识
其实Python的编码我们大致分为两类,即文件编码和解释器编码,还记得我们在写一个以“*.py”结尾的脚本语言吗?第一行是要声明Python的运行路径的,而第二行则是需要指定解释器编码格式,即告诉解释器用什么编码来读取这个文件的内容的。这两行注释是强烈建议写的,因为Python2.x使用的默认编码格式是ASCII,而Python3.x使用的默认编码格式是UTF8哟!所以我们还是养成一个好的习惯吧!
相信对解释器编码的你应该有所了解了吧,那么文件编码又是怎么回事呢?其实我们可以通过以下的代码进行意会:
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ 5 #EMAIL:y1053419035@qq.com 6 7 ''' 8 执行过程中字符串的概念: 9 在Python3.x版本中: 10 在Python3.x中,所有的字符串都会被识别成Unicode编码的结果,在Python3.x中有两种形式的字符串: 11 1>.str(即Unicode) 12 2>.bytes(即str.encode()的结果) 13 在Python2.x版本中: 14 在Python2.x中也有两种形式的字符串: 15 1>.str 16 2>.Unicode 17 ''' 18 19 name = "尹正杰" 20 SaveGbk = name.encode("gbk") #将字符串name以“gbk”的方式编码 21 print(SaveGbk) 22 OpenGbk = SaveGbk.decode("gbk") #将字符串savevalue以“gbk”的方式解码,即以哪种方式编码就以哪种方式解码,否则就会报错:UnicodeDecodeError。 23 print(OpenGbk) 24 25 SaveUTF8 = SaveGbk.decode("gbk").encode("utf-8") #将”“gbk”保存的方式以ut-8的方式进行保存,首先要将文件解析解码(decode)操作,然后在编码(encode)成其他格式。 26 print(SaveUTF8) 27 OpenUTF8 = SaveUTF8.decode("utf-8") #进行解码操作,这样我们就可以看到真正保存的数据啦! 28 print(OpenUTF8) 29 30 31 32 以上代码执行结果如下: 33 b'\xd2\xfc\xd5\xfd\xbd\xdc' 34 尹正杰 35 b'\xe5\xb0\xb9\xe6\xad\xa3\xe6\x9d\xb0' 36 尹正杰
五.变量定义的规则
变量其实就是一个昵称,它代指内存里某个地址中保存的内容。Python中声明变量很简单,比如:“name=yinzhengjie”,其中“name”就是变量名,而“yinzhengjie”就是变量的值。当然我们在声明变量时需要遵循以下规则:
1>.变量名只能是 字母、数字或下划线的任意组合
2>.变量名的第一个字符不能是数字
3>.以下关键字不能声明为变量名(后期的博客你会经常看到我用这些关键字哟!):
['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield']
接下来我们就来一起看个案例:
六.流程控制
流程控制其实很简单,就是你需要提前定义一个条件,当符合你的条件的时候就会去触发相应的代码。 在说循环语句之前,我们需要了解一下之前我们不能声明变量名的其中两个关键字,即:break和continue。
1>.break用于退出当前循,如果是嵌套循环的话,它只能退出它所在的循环,但是无法终止其上层循环哟。
2>.continue用于跳过本次循环,继续下一次循环。也就是说它不会终止当前循环哟。
接下里,我们来举一个简单的例子,写个小脚本验证用户登陆信息:
1 #/usr/bin/env python 2 #_*_coding:gb2312_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ 5 #EMAIL:y1053419035@qq.com 6 7 import getpass 8 9 CorrectUsername = "yinzhengjie" 10 CorrectPassword = "123" 11 12 Counts = 1 13 while Counts < 4: 14 username = input("Please enter your username>>>") 15 password = getpass.getpass("Please enter your password>>>") 16 if username == CorrectUsername and password == CorrectPassword : 17 print("登陆成功") 18 break 19 else: 20 if Counts == 3 : 21 print("sorry,尝试次数已上限,程序结束!") 22 break 23 else: 24 print("用户名或密码错误") 25 Counts += 1
Windows命令行中测试结果如下:
七.循环进阶知识
Python中的while循环和for循环都是可以和else用法互相搭配的:
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ 5 #EMAIL:y1053419035@qq.com 6 7 8 for i in range(5): 9 if i == 4: 10 # break 11 continue 12 print(i) 13 else: 14 print("for循环正常执行完毕,即没有被break!") 15 16 17 18 19 20 21 #以上代码执行结果如下: 22 0 23 1 24 2 25 3 26 for循环正常执行完毕,即没有被break!