前期工作已经准备好后,可以打开IDE编辑器了,你可以选择python自带的IDLE,也可以选择第三方的,这里我使用pycharm——一个专门为python而生的IDE

按照惯例,第一个python代码打印一个所有开发语言里入门必学“hello,world”?no,你错了,我偏不

第一行是编码,utf-8这是国际使用标准,如果我不加的话,很容易出错

第二行print(打印的意思)语句,是python的关键词语句,可以打印一个字符,可以打印一个数字,可以打印任何你想打印的东西,只要你想让它显示出来,你就可以使用print打印

下面的C:\python。。。就是python安装的位置,可以侧边的看出我当前使用的是python2版本来运行这个代码的

1——即为当前我的代码运行的结果,把1打印到屏幕上了。 

由此出现了几个问题:

问题1.什么是编码?为什么要使用编码?

答:这是个国际标准,简单的理解就是计算机中存储数据的格式,在计算机中数据都是以0/1来进行保存,所以为了把0/1转换为人类可以理解的内容就需要编码来进行转换。而人类写的字符要让计算机识别,也需要转换编码。开发语言写出来的代码,如果是高级语言(代码贴近人类语言的则为高级语言,0和1则为机器语言),都需要解释器解释为机器可以认识的字符。

最开始的字符编码是ASCII

ASCII:美国人用的,只能解释数字和英文字母。ASCII是ANSI标准,包含128个字符(7 bits)我们说的ANSI编码,通常特指windows平台的一种ASCII扩展码(因为windows默认的编码就是ANSI),它将ascii码扩展到8bits,增加了0x80-0xff共128个字符。在cjk(chinese japanese korean,中文,日语,韩语)系统中,ansi还常常指代包括多字节内码的编码。不难看出,所谓ANSI编码,就是一种未经国际标准化(也没办法标准化,因为扩展部分的内码存在交集)的兼容ASCII编码的,非unicode字符集编码。

EASCII:因为欧洲德语等语言会用到派生拉丁字符。

但这些对世界上其他语言汉语、日语、韩语是不够用的,需要多个字节。
GBK系列:为了解决中文编码问题,我国自己编写了GBK编码集,其兼容ASCII,需要注意的是不同的编码集会存在兼容问题,GBK包含所有的汉字,繁体字和简体字,而在大陆繁体不行啊,所以又有了只包含简体字的GB2312编码,注意GBK一个汉字使用两个字节表示。
虽然GBK解决了中文编码问题,但是如果中国用自己开发的编码集,日本、韩国也用自己的,这样在信息交互时如果对方的计算机没有对应的编码集解码出的数据就是错误或者叫乱码,能不能开发一套世界通用的编码集呢,Unicode应运而生,所以Unicode就是一个大一统,Unicode编码也不用查码表
Unicode:该编码集采用4个字节表示一个字符;可以容纳世界上所有的字符;但问题也很明显,假设要传一篇英文文档,使用ASCII编码与使用Unicode的传输量相差4倍,换句话说Unicode传输效率太低;为了解决这个问题,出现了UTF-8,它是Unicode的一种实现方式。

Unicode范围 UTF-8编码
单字节:0000 0000 - 0000 007F 0xxxxxxx
双字节:0000 0080 - 0000 07FF 110xxxxx 10xxxxxx
三字节:0000 0800 - 0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
四字节:0001 0000 - 001F FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Unicode编码规范下有UTF-8,UTF-16,UTF-32三种具体实现。
UTF-32每个字符都使用4字节表示。
UTF-8,采用变长技术,占用1到4字节,兼容ASCII编码,汉字占用3个字节。由此可看出utf-8最灵活,1到4以内需要占多少字节就占多少,节约了很多资源。
UTF-16统一采用两个字节表示一个字符。

UTF-8编码有一个额外的好处,就是ASCII编码实际上可以被看成是UTF-8编码的一部分,所以,大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作,因为英文字母在ascii中是一个字节,在utf-8中也是一个字节,而ascii不支持中文。

例:中国的“中”字:

前面加u是表示以Unicode的编码。

从上到下分别为GBK,unicode和utf编码,其中需要注意的是字符无法从GBK直接转化为utf-8,可以把Unicode字符串encode("utf-8")到UTF8,可以把Utf-8字符串decode("utf-8")到Unicode字符串

encode主要是把unicode encode到utf-8,decode主要是从utf-8到unicode,windows内核都是unicode

python在print时,会自动把字符串encode为sys.stdout.encoding,默认什么编码就以这套编码来执行。

注意:当python把一个已经encode的字符串再进行encode会报错。

可以打个比喻,Unicode好比一个当铺,我需要钱就得到当铺去估值并抵换或者叫卖(抵的过程就是decode)成钱(换成钱的过程就是encode),我需要物件就得去当铺给钱换或者叫买(给钱的过程是decode)物件(换成物件的过程就叫encode),不可直接用钱买物件或者卖物件还钱,因为没有当铺做价格估值,就容易亏(当然这个比喻有点逻辑出入,不过你只要懂其中原理就行,后面在爬虫章节会亲身体会到)。

既然说到编码,那顺便把编译器和解释器,也一起说了,高级语言因为十分贴近人类用语,所以机器是无法识别的,这就需要解释器来解释

 

字节码和机器码:

字节码和机器码(或者native code)的区别:



C代码被编译成机器码,将在处理器上直接执行。每一条指令控制CPU工作,而python就是用C写的。

Java代码被编译成字节码,将在Java虚拟机(JVM)这个抽象的计算机上执行。每一条指令由JVM处理,JVM同计算机本身之间交互,再由解释器解释或者翻译成可执行文件

简而言之:机器码快的多,但字节码更易迁移,也更安全。

解释性语言定义:

程序不需要编译,在运行程序的时候才翻译,每个语句都是执行的时候才翻译。这样解释性语言每执行一次就需要逐行翻译一次,效率比较低。

现代解释性语言通常把源程序编译成中间代码,然后用解释器把中间代码一条条翻译成目标机器代码,一条条执行。

后面运行代码时你就会发现Python就是解释型的。

编译性语言定义:

编译性语言写的程序在被执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件,比如exe文件,以后要运行的话就不用重新翻译了,直接使用编译的结果就行了(exe文件),因为翻译只做了一次,运行时不需要翻译,所以编译型语言的程序执行效率高。

Python工作过程:

python 是解释型的编程语言。也可以把python脚本编译成pyc文件,不然编译后也是一种python虚拟指令,在python中运行。

Python先把代码编译成字节码,在对字节码解释执行。字节码在python虚拟机程序里对应的是PyCodeObject对象,pyc文件是字节码在磁盘上的表现形式。

问题2.不加为什么会报错?

答:如果不加utf-8的话,是一定会报错的,报错提示的意思就是没有设置默认编码

在python3里,官方已经把这个编码问题解决了,因为python2的编码问题(默认是ASCII)确实很烦,在后面说到爬虫时很能体现这个问题

注意如果在python3下打印这段代码

注意:

  • 1.在python3里已经把print改为一个内置函数,不再是一个语法关键词,所以必须加括号,在python2里如果printt加上括号也是可以的,不会报错。
  • 2.python3里的默认编码已经是Unicode,解决了编码问题,所以可以正常打印,但是建议还是加上默认编码:#-*- coding:utf-8 -*-,其实直接写 #coding:utf-8也是可以的,但是前者写法是国际习惯,一个好的习惯可以体现你的编程能力。
  • 3.如果要打印字符串,必须用引号包括住,后面在类型篇会讲到。
  • 如果你使用的是python自带的IDLE,在python2里IDLE用的是cp936编码,是ASCII码的一种。

问题3.为什么只使用utf-8编码?

答:前面编码问题已经说了,Unicode是一个大一统,utf-8属于Unicode的一种,也是最优的选择,所以使用utf-8

问题4.print这个单词,我可以写其他的吗?如果我想打印一段中文,怎么打印?

答:python的关键词是设定好的语法关键词,不可更改,但可以当作变量重新定义,但原则上不要重新定义,也不能使用其他来代替。

打印中文的效果上面已经给出,附上代码自己练习:

# -*- coding:utf-8 -*-
print('我')


洗礼灵魂,修炼python(3)--从一个简单的print代码揭露编码问题,运行原理和语法习惯的更多相关文章

  1. python定义的一个简单的shell函数的代码

    把写代码过程中经常用到的一些代码段做个记录,如下代码段是关于python定义的一个简单的shell函数的代码. pipe = subprocess.Popen(cmd, stdout=subproce ...

  2. Windows 下针对python脚本做一个简单的进程保护

    前提: 大家运行的脚本程序经常会碰到系统异常关闭.或被其他用户错杀的情况.这样就需要一个进程保护的工具. 本文结合windows 的计划任务,实现一个简单的进程保护的功能. 利用py2exe生产 ex ...

  3. Python学习 - 编写一个简单的web框架(二)

    在上一篇日志中已经讨论和实现了根据url执行相应应用,在我阅读了bottle.py官方文档后,按照bottle的设计重写一遍,主要借鉴大牛们的设计思想. 一个bottle.py的简单实例 来看看bot ...

  4. python实现的一个简单的网页爬虫

    学习了下python,看了一个简单的网页爬虫:http://www.cnblogs.com/fnng/p/3576154.html 自己实现了一个简单的网页爬虫,获取豆瓣的最新电影信息. 爬虫主要是获 ...

  5. Flask学习之旅--用 Python + Flask 制作一个简单的验证码系统

    一.写在前面 现在无论大大小小的网站,基本上都会使用验证码,登录的时候要验证,下载的时候要验证,而使用的验证码也从那些简简单单的字符图形验证码“进化”成了需要进行图文识别的验证码.需要拖动滑块的滑动验 ...

  6. Python并发编程-一个简单的爬虫

    一个简单的爬虫 #网页状态码 #200 正常 #404 网页找不到 #502 504 import requests from multiprocessing import Pool def get( ...

  7. 用python开发了一个简单apache web服务端范例,在win10 + apache2.4.9 + python3.5 测试成功

    #!D:\Programs\Python\Python35-32\python.exe import cgi def htmlTop():     print("Content-type: ...

  8. 窥探原理:实现一个简单的前端代码打包器 Roid

    roid roid 是一个极其简单的打包软件,使用 node.js 开发而成,看完本文,你可以实现一个非常简单的,但是又有实际用途的前端代码打包工具. 如果不想看教程,直接看代码的(全部注释):点击地 ...

  9. python编程(最简单的rpc代码)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 采用twisted可以编写最简单的rpc代码. server端代码如下, from twiste ...

随机推荐

  1. MySQL57安装图解

    MySQL57安装图解... ============================= 0-需要准备的安装包 =================== 1在百度下载MySQl ============ ...

  2. 一款代码扫描工具 火线!!!! fireline

    1. 在火线官网进行火线相关文件的下载,下载后的文件为fireline.jar 2.运行fireline.jar文件前请先确认系统环境中已安装Java JDK.   java-version 查看 3 ...

  3. 花生壳DDNS为何不支持LetsEncrypt申请

    Inspired by Let's Encrypt Community , thx to sahsanu, jsha, and orzorc. 开端 Lets Encrypt 是一款免费的网站 SSL ...

  4. javaScript数组去重方法

    在JAvascript平时项目开发中经常会用到数组去重的操作.这时候就要用到JS数组去重的方法了. demo1: 第一种:JS数组去重操作方法是利用遍历原数组,利用数组的indexOf()方法来来判断 ...

  5. JavaScript学习日志(四):BOM

    BOM的核心对象就是window,这一章没什么好说的,总结一些比较常用的: 1,a未定义,a; //报错window.a; //undefined 不能用delete删除全局变量 2,html5不支持 ...

  6. hashMap和treeMap

    前言 首先介绍一下什么是Map.在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.这就是我们平时说的键值对. ...

  7. Beta版本冲刺计划及安排(附七天冲刺的博客链接)

    Beta版本冲刺计划及安排(附七天冲刺的博客链接) 新增组员 本次换人加入我们团队的新成员是原"爸爸说的都队"的队长念其锋同学,经过我们小组严格的两轮面试,他从几个同样前来面试的同 ...

  8. 201521123061 《Java程序设计》第四周学习总结

    201521123061 <Java程序设计>第四周学习总结 1. 本章学习总结 (1)思维导图: --- (2)上课内容总结: 第四周学习了Java中的继承与多态,思维导图中已经给出了本 ...

  9. 201521123062《Java程序设计》第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现 ...

  10. 201521123023《Java程序设计》第11周学习总结

    1. 本周学习总结 Lock.Condition,互斥同步访问方法,相比于synchronized,相似的wait().notify().notifyAll()方法,还有更多高级的方法 Executo ...