循环语句 & 字符编码

          计算机语言进化史

计算机语言经过这些年的发展壮大,从基础的二级制到现在的多种高级语言,使编程变得简单而快捷

  • 机器语言
  • 汇编语言
  • 高级语言

机器语言:

  • 优点:运行速度快
  • 缺点:代码复杂度高,直观性差,开发效率低

机器语言就是所谓的 “ 二进制 ”,二进制是计算机最底层的语言,因此它的运行速度是最快的。但是由于机器语言本身的限制,它的开发效率较低,而且编写出的代码复杂度最高。现在除了计算机厂家的工程师外,没有人去学机器语言。

汇编语言:

  • 优点:运行速度快
  • 缺点:代码复杂度高,开发效率低

汇编语言的实质和机器语言是相同的,,多事直接对硬件进行操作,只不过指令采用了英文所写的标识符,看起来更容易理解和记忆。

汇编语言也需编程者将每一步具体的操作用命令的形式写出来,汇编语言每一句指令只能对应实际操作的一个很细微的动作,例如:移动,自增

因此汇编源程序一般比较复杂,容易出错。但是汇编语言的优点也是显而易见的,用汇编语言所完成的操作不是一般高级语言能够实现的,而且源程序经汇编语言生成的可执行文件不见比较小,而且执行速度也很快。

高级语言:

  • 优点:运行速度较慢
  • 缺点:代码复杂低,开发效率高

高级语言相比于汇编语言,不但能将指令简化并且去除了具体操作相关的细节,如:使用堆栈。寄存器等。同时对编程者专业知识要求较低

高级语言运行速度较慢主要相对汇编语言而言,其实速度相差不大。高级语言在代码编写上有很大的提高,相比于汇编语言几十行写的的指令,高级语言有的只需一条就OK了

高级语言现在市面上有很多种高级语言,如C\C++、JAVA、PHP、Python、GO、C#等等

分类:编译型 & 解释型

高级语言所编制的程序不能直接被计算机识别,必须经过转换才能被执行

根据转换方式 高级语言又分为“ 编译型 “和 ” 解释型 ”

  • 编译型语言:不能跨平台

高级语言所编制的程序不能直接被计算机识别,必须经过转换才能被执行。因此其目标程序可以脱离其语言环境独立执行,使用比较方便灵活。但应用程序一旦需要修改,就必须修改源代码,再重新生成目标文件(*obj。也就是OBJ文件)才能执行。只有目标文件没有源代码修改很不方便

编译后的程序运行是不需要重新翻译,直接使用编译的结果就行了。程序执行 效率高,依赖编译器,跨平台性差,如C、C++、Dellphi、Go等

  • 解释型语言:可以跨平台

执行方式类似于  ” 同声翻译 “,应用程序源代码一边由相应语言的解释器 “ 翻译 ”成目标代码(机器语言),一边执行,因此效率较低,而且不能生成可独立的可执行文件。应用程序不能脱离其解释器,但这种方式比较灵活,可以动态的调整,修改应用程序。如进JAVA、PHP、Python、Ruby等

Python 交互器作用:代码调试

                运算符

计算机可以进行的运算有很多种,可不只加减乘除这么简单,运算按种类可分为算数运算、比较运算、逻辑运算、赋值运算、成员运算、身份运算、位运算,今天我们暂只学习算数运算、比较运算、逻辑运算、赋值运算

算数运算

以下假设变量:a=10,b=20

比较运算

以下假设变量:a=10,b=20

赋值运算

以下假设变量:a=10,b=20

 

逻辑运算

if...else..条件语句

当满足 if 条件时 ,才会执行的后续的代码,否则会执行 else 语句中的代码

 1 a=  2
 2 b= 6
 3 if a>b:                                
 4     print('a is bigger than  b')
 5 
 6 else:
 7     print('a is smaller than b')
 8 
 9 输出
10 a is smaller than b

 由于a小于b,if 条件不满足,所以执行 else 语句的代码

while 循环语句

如果我们将一段代码执行很多遍时,为了方便快捷,应使用 while 循环语句

 1 username = input('请输入你的名字')
 2 print('欢迎 %s 来到猜年龄游戏!'% username)
 3 age = 18
 4 i = 0
 5 while i  <3:
 6 
 7     guess = int(input('请输入你猜的数字:'))
 8 
 9     if guess > age:
10         print('It`s too bigger! please try again')
11 
12     elif guess <age:
13 
14         print('It`s too smaller! please try again')
15 
16     elif guess == age:
17         print('恭喜你,答对了')
18         break

 while。。。。else语法

while 后面的 else 是指:当while 循环正常执行完,中间没有被 break 终止的话,就会执行后面的 else 语句

 1 i = 0
 2 while i<3:
 3     print('That`s ok')
 4     i  +=1
 5 else:
 6     print('loogup')
 7 
 8 输出
 9 That`s ok
10 That`s ok
11 That`s ok
12 loogup

当 while 循环被 break 终止后

 1 i = 0
 2 while i<3:
 3     print('That`s ok')
 4     break
 5     i  +=1
 6 else:
 7     print('loogup')
 8 
 9 输出
10 That`s ok

 

deade loop 死循环

当我们写一个循环时如果没有终止语句,那么这个循环变成一个死循环

 1 username = input('请输入你的名字')
 2 print('欢迎 %s 来到猜年龄游戏!'% username)
 3 age = 18
 4 i = 0
 5 while i  <3:
 6 
 7     guess = int(input('请输入你猜的数字:'))
 8 
 9     if guess > age:
10         print('It`s too bigger! please try again')
11 
12     elif guess <age:
13 
14         print('It`s too smaller! please try again')
15 
16     elif guess == age:
17         print('恭喜你,答对了')

怎么防止变成死循环呢,就需要使用循环终止语句

循环终止语句

如果在 循环中我们需要终止某个循环,那么我们 就需要使用  break 和 continue 语句

  • break:用于完全结束一个循环语句,跳出循环执行后面的语句
  • continue:和 break 类似,区别在于continue 只是终止本次循环,接着执行后面的循环,break 则完全终止

用 while 做一个猜年龄的游戏,只能才三次,猜对后  break 退出循环

 1 username = input('请输入你的名字')
 2 print('欢迎 %s 来到猜年龄游戏!'% username)
 3 i = 0
 4 while i  <3:             # 当 i 大于等于3时,循环结束
 5     guess = int(input('请输入你猜的数字:'))
 6 
 7     if guess > age:
 8         print('It`s too bigger! please try again')
 9 
10     elif guess <age:
11         print('It`s too smaller! please try again')
12 
13     elif guess == age:
14         print('恭喜你,答对了')
15         break                                   # 猜对后退出循环
16 
17     i += 1                                      # 没循环一次 i 加 1

那,现在要求错误三次后来一次询问,是否继续游戏,接下来这么写

 1 username = input('请输入你的名字')
 2 print('欢迎 %s 来到猜年龄游戏!'% username)
 3 age = 18
 4 i = 0
 5 while i  <3:
 6 
 7     guess = int(input('请输入你猜的数字:'))
 8 
 9     if guess > age:
10         print('It`s too bigger! please try again')
11 
12     elif guess <age:
13 
14         print('It`s too smaller! please try again')
15 
16     elif guess == age:
17         print('恭喜你,答对了')
18         break
19 
20     i += 1
21     if i ==3:                         # 判断 i 是否等于3
22 
23         print('错误三次')
24         userinput = input('是否还想玩?y|n :')
25         if userinput == 'y':
26             i =0
27             print('请继续游戏')
28 
29         else:
30             print('欢迎下次光临!')

 for 循环

在前面已经介绍过while语句了,while 语句非常灵活,可用于在条件为真时反复执行代码块。再通常情况下很好,但有时你需要定制。

一种这样的需求是为序列(或其他可迭代对象)中的每个元素执行代码块


 注意:基本上,可迭代对象是可使用 for  循环进行遍历 的对象。


 为此,可使用 for 语句:

1 nums =[1,2,3,4,]
2 for num in nums:
3     print(num)
4 输出
5 1
6 2
7 3
8 4

 提示:能使用 for 循环就不要使用 while 循环!

 

         字符编码

二进制

 二进制定义

二进制是计算技术中广泛采用的一种数制二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。计算机中的二进制则是一个非常微小的开关,用“开”来表示1,“关”来表示0。

每一位 0 和 1 所占的空间单位为  bit(比特),这是计算机最小的 单位

二进制与十进制转换

二进制的第n位代表的十进制值都刚好遵循着2的n次方这个规律

十进制转二进制方法相同,只要对照二进制为1的那一位对应的十进制值相加就可以了。

      128  62  32  16  8  4  2  1

      0   0     0   0  0  0  0  0

10                  1  0  1  0

60         1     1     1       1       0      0

十进制转二进制、八进制、十六进制

 

 1 dec = int(input("输入数字:"))
 2 
 3 print("十进制数为:", dec)
 4 print("转换为二进制为:", bin(dec))
 5 print("转换为八进制为:", oct(dec))
 6 print("转换为十六进制为:", hex(dec))
 7 
 8 输入数字:6
 9 十进制数为: 6
10 转换为二进制为: 0b110
11 转换为八进制为: 0o6
12 转换为十六进制为: 0x6

字节单位转换:

 上面讲了如何将十进制转为二进制,那计算机是怎么将文字转为二进制呢?

在讲这个 之前我们需要了解字符编码

 计算机由美国人发明,最早的字符编码为ASCII,只规定了英文字母数字和一些特殊字符与数字的对应关系。最多只能用 8 位来表示(一个字节),即:2**8 = 256,所以,ASCII码最多只能表示 256 个符号

 

 由于ASCII 的局限性,不能够适用于世界上不同国家不同的语言,所以各国就搞出了自己的编码

中国人规定了自己的标准gb2312编码,规定了包含中文在内的字符->数字的对应关系

日本人规定了自己的Shift_JIS编码

韩国人规定了自己的Euc-kr编码

但是为了世界的发展,所以编码必须有一个统一的标准。So unicode应运而生

  • ascii用1个字节(8位二进制)代表一个字符
  • unicode常用2个字节(16位二进制)代表一个字符,生僻字需要用4个字节

但是问题又来了由于Unicode表示一个字符需要16位,而ASCII只需要8位。并且Unicode在储存上比ASCII多出来一倍的空间。所以为了抵制铺张浪费 utf-8 就降世了。

UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。

编码的种类情况

  • ASCII 占1个字节,只支持英文
  • GB2312 占2个字节,支持6700+汉字
  • GBK GB2312的升级版,支持21000+汉字
  • Shift-JIS 日本字符
  • ks_c_5601-1987 韩国编码
  • TIS-620 泰国编码

由于每个国家都有自己的字符,以上编码都存在局限性,应运而生出现了万国码,他涵盖了全球所有的文字和二进制的对应关系

  • Unicode 2-4字节 已经收录136690个字符,并还在一直不断扩张中...  

   Unicode 起到了2个作用:

  1. 直接支持全球所有语言,每个国家都可以不用再使用自己之前的旧编码了,用unicode就可以了。(就跟英语是全球统一语言一样)
  2. unicode包含了跟全球所有国家编码的映射关系,为什么呢?后面再讲

Unicode解决了字符和二进制的对应关系,但是使用unicode表示一个字符,太浪费空间。为了解决存储和网络传输的问题,出现了Unicode Transformation Format,学术名UTF,即:对unicode中的进行转换,以便于在存储和网络传输时可以节省空间!

  • UTF-8: 使用1、2、3、4个字节表示所有字符;优先使用1个字符、无法满足则使增加一个字节,最多4个字节。英文占1个字节、欧洲语系占2个、东亚占3个,其它及特殊字符占4个
  • UTF-16: 使用2、4个字节表示所有字符;优先使用2个字节,否则使用4个字节表示。
  • UTF-32: 使用4个字节表示所有字符;

总结:UTF 是为unicode编码 设计 的一种 在存储 和传输时节省空间的编码方案。

编码的转换

python3 执行代码的过程

  1. 解释器找到代码文件,把代码字符串按文件头定义的编码加载到内存,转成unicode
  2. 把代码字符串按照语法规则进行解释,
  3. 所有的变量字符都会以unicode编码声明

在python3里utf-8可以在Windows GBK终端上显示,是因为python解释器把utf-8转成了Unicode。但是在python 2中是会乱码的,因为python 2默认支持的是ASCII,想写中文就必须在文件开头声明你是以什么编码去写的(gbk or utf-8,)。python2解释器仅以文件头声明的编码去解释你的代码,并不会去自动转成Unicode。即你的文件编码是utf-8,加载到内存里,你的变量字符串还是utf-8,在Windows中就会乱码

编码和 解码图示:

unicode与gbk的映射表 http://www.unicode.org/charts/

文件读取写入编码转换:

1、在存入磁盘时,需要将unicode转成一种更为精准的格式,utf-8:全称Unicode Transformation Format,将数据量控制到最精简

2、在读入内存时,需要将utf-8转成unicode
所以我们需要明确:内存中用unicode是为了兼容万国软件,即便是硬盘中有各国编码编写的软件,unicode也有相对应的映射关系,但在现在的开发中,程序员普遍使用utf-8编码了,估计在将来的某一天等所有老的软件都淘汰掉了情况下,就可以变成:内存utf-8<->硬盘utf-8的形式了。

 

 

 

 

 

 

 

 

 


 

posted @ 2018-07-06 08:55  繁华无殇  阅读(315)  评论(0编辑  收藏  举报