Python学习记录 - mouxue23/My_Python GitHub Wiki

Python的预备知识

  1. 在交互式环境下,如ipython和jupyter中,有一些有用的命令,如run xx.py,可以在交互式环境下运行.py文件;如help(xx),可以佷方便地查询一个类的定义和方法(实际上是查询了Python的官方文档),?xx,如?len,可以查看一个类或方法的简单介绍。ipython下还可以使用很多linux shell的命令,如pwd, cd, ls, clear等。
  2. python代码采用缩进来组织代码块,请坚持使用4个空格的缩进,并且不要把缩进和Tab键混用。
  3. Python是大小写敏感的,和大多数编程语言一样。
  4. Python以#为开头注释单行语句,以一对三引号注释多行。

Python语法

  1. 在Python中,一切皆对象(Everything is object)
  2. Python之禅:简洁,优雅

Python基础

数据类型和变量

  1. 整数:十进制整数的表示和数学上的写法一样,十六进制的整数用前缀0x和0-9,a-f表示,如0xff00,Python对整数的大小没有限制,这一点与C等语言不一样
  2. 浮点数:浮点数就是小数,当它的绝对值不大时,可使用一般的数学记法,而当它的绝对值很大时,必须使用科学记数法,如1.23*10^9,需记为1.23e9,对于0.000000012,需记为1.2e-5。Python对浮点数的大小也没有限制,但超过一定范围后就直接表示为inf(无穷大)
  3. 整数和浮点数在计算机内部的存储方式是不一样的,整数的运算是精确的(除法?),浮点数的运算则有肯能有四舍五入的误差
  4. 字符串:字符串是以单引号'或双引号"括起来的任意文本,但他们必须配对使用,不能以左边是单引号而右边是双引号。如果想在字符串内部包含单引号,则字符串需用双引号括起来,如果想在字符串内部包含双引号,则需用单引号括起来,总之,要保证不致引起歧义。如果字符串内部既有单引号又有双引号,则需要用转义字符\来对字符串内部的引号转义,以使解释器不把这些内部的引号当作字符串的边界界定符号。如果有许多字符需要转义,也可用r''表示内部的字符串默认不转义,但它使用的前提还是要能无歧义的界定字符串的边界,如print(r'what's the problem?')会报错
  5. \n表示换行符,\t表示制表符,三引号'''...'''可表示有多行内容的字符串
  6. 布尔值:一个布尔值要么是True,要么是False,在Python中可以直接用TrueFalse表示布尔值(注意大小写).在Python中,bool是int的一个子类
  7. 布尔运算:主要包括andornot,其它的还有按位布尔运算
  8. 空值:空值是Python里的一种特殊数据类型,它是NoneType类,不能理解为0或是空格
  9. 变量:Python中的变量可以指向任意数据类型,在程序中使用变量名来表示一个变量,变量名可以是数字、字母、下划线的组合,但不能以数字开头
  10. 在Python中,等号=是赋值语句,可以把任意数据类型赋值给一个变量,且一个变量可以反复赋值,而且可以是不同类型的值,这种变量类型不固定的语言称之为动态语言,与C等静态语言相对应。
  11. Python中的变量其实有点像一个指针,指向它所表示的数据。例如对于a='ABC',解释器实际上干了两件事,1)是在内存中创建了'ABC'的字符串,2)是在内存中创建了一个名为a的变量,并把它指向了'ABC',而实际上变量a和数据'ABC'之间的练习是很松散的,就如同链表里的链条,可以利用赋值语句很容易的该表这个链条的指向。廖雪峰的Python教程对这里有很清楚的解释。
  12. 常量:常量顾名思义就是不能再变的量,如一个个具体的数字,23,一个个字符串'abc',在Python中通常用一个大写的变量名来表示一个常量,如PI=3.1415926,但本质上此处的PI仍然是一个变量,Python没有任何机制保证PI不会改变,用大写的变量名来代表一个常量只是大家一个约定俗成的习惯。
  13. 除法:Python中主要有两种除法,普通除法/和地板除//。首先看普通除法/,不管对于整数还是浮点数,/得到的结果一定是小数,即使时整数能够整除也是如此,如2.4/2 得到1.2, 4/2得到2.0;对于地板除//,对于整数而言,结果一定是整数,不管是否能整除,如4//2得到2,5//2得到2(向下取整,地板除),而对于浮点数,结果仍然是浮点数。
  14. 对于求余运算%,整数的求余得到的一定是整数,浮点数得到的余数是浮点数
  15. input()用来接受输入,print()用来输出,同时还可以加入内容,如input('please input',),int name='Conway' print('I am',name),逗号分隔的内容在输出时会加入空格
  16. 对变量赋值x=y,实际上是把x指向y所指向的对象,随后如果再对y赋值,并不会改变x指向的内容

字符串和编码

  1. 由于计算机CPU能直接处理的数据只有数字,要处理文本则必须先转换为数字。这个转换的过程需要有一套编码方案,将字符对应到数字。世界上存在着很多种语言,每一种语言都有一套自己的编码方案,如英文最初是使用ASCII码,中文也有GB2312,为了避免冲突和乱码,人们发明了Unicode把各种语言纳入了一套统一的编码方案。
  2. ASCII和Unicode的比较:变编码一个字符,如'A',使用ASCII只占一个字节(byte,8个bit),而使用Unicode通常需要两个字节。对于英文字母如'A',只需在ASICC码的基础上往前面补0得到两个字节长的表示,就得到了unicode码。统一成unicode编码后,乱码问题应该基本解决了。
  3. 但使用统一长度的Unicode编码又带来了这样一个问题,如果文本主要是由英文字符组成的话,原本使用一字节的ASCII码能表示一个字符,现在需要两个字节,而且增加的一个字节只是在原来ASCII码的前面添加的无意义的0。为了尽可能提高存储效率,人们又在Unicode的基础上提出了可变长的UTF-8编码,对于每个unicode字符,使用1-6个字节编码,英文字母为1个字节,汉字通常是3个字节,大致按照Hoffman编码方式来进行编码。
  4. 英文字母的ASCII码和UTF-8编码是一样的
  5. 在存储和传输文件的时候,通常使用UTF-8,这样可以节省存储空间,加快传输速度(文件尽可能小了)。
  6. 在python3中,字符串是以Unicode方式编码的,这意味着Python的字符串支持多种语言
  7. 注意,字符'0'和数字0不是一回事,字符0在ASCII码中是48
  8. ord()函数接受一个字符,返回它的Unicode编码;chr()函数接受Unicode编码(一个数字),返回对应的字符
  9. 如果知道字符的Unicode编码,还可以这样来表示一个字符串'中文':\u4e2d\u6587,其中4e2d、6587分别是'中'和'文'的unicode编码在16进制下的表示
  10. Python中的字符串以Unicode编码存储,一个字符对应多个字节,如果要在网络上传输,或者保存在磁盘上,就要把一个str编程以字节为单位的bytesm,这是因为不管是存储还是传输,计算机在底层还是把数据以字节为单位处理的。
  11. Python使用带b前缀的单引号或双引号表示,如b'ABC',表示字节流b'ABC'。对于英文字母而言,字节流和str字符串除了前者有个b前缀之外看起来并没有什么不同,但实际上不一样,str字符串里的每一个字符用unicode码表示,每个字符占2个字节,而字节流中的每个'字符'都是用一个字节(byte)表示,所以它的数据类型被称为bytes(可以翻译为字节流?)
  12. 以unicode编码的str字符串可以通过encode方法使用指定的编码类型转换为字节流bytes类型,如'ABC'.encode('ascii')会得到b'ABC',而'中文'.encode('utf-8')会得到b'\xe4\xb8\xad\xe6\x96\x87'。可以看出,汉字在utf-8中一般是有3个字节表示
  13. 在字节流bytes数据中,无法显示为ASCII字符的字节,用\x##现实,期中##表示该字节的16进制表示
  14. 如果从网络或是磁盘中读取到了字节流bytes类型数据,要把bytes变为str,需要用到decode()方法。例如,b'ABC'.decode('ascii')会得到'ABC',而b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')会得到'中文'。如果bytes中包含无法解码的字节,decode()方法会报错,如果bytes中只有一小部分字节无效,可以在decode()方法中传入errors='ignore'来忽略错误的字节。