python基础

1 输入和输出

<1>输出:

print()在括号中加上字符串,就可以向屏幕上输出指定文字。

print('hello world')

print()函数也可以接受多个字符串,用逗号隔开,就可以连城一串输出:

print('hello','world','again')

print()也可以打印整数或计算结果

print(300)
print(1+1)

<2>输入:

Python提供了一个input()函数,可以让用户输入字符串,并存放到一个变量中。

a=input()

2 数据类型和变量

<1>空值
空值是python里一个特殊的值,用None表示。None不能理解为0,因为0是有意义的,而None是特殊的没有意义的空值。

<2>变量
python的变量本身类型是不固定的,这种变量本身类型不固定的语言称为动态语言,与之对应的是静态语言。静态语言在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错。

变量在计算机内存中的表示:
当我们写:

a='ABC'

时,Python解释器做了两件事情:

  • 在内存中创建一个'ABC'字符串。
  • 在内存中创建了一个名为a的变量,并把它指ABC

也可以把一个变量·a·赋值给另一个变量·b·,

b=a

这个操作实际上是把变量b指向变量·a·所指向的数据。
再执行

a='XYZ'

这个操作只是把a指向XYZ不会改变b的值。

<3>常量

所谓常量就是不能变的量,通常用全部大写的变量名表示常量。

<4>除法
\:计算结果是浮点数,即使两个整数恰好整除,结果也是浮点数。

//:称为地板除,结果只取整数部分。

%:取余数

3 字符串与编码

<1>字符编码
字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题。
因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节。比如两个字节可以表示的最大整数是65535,4个字节可以表示的最大整数是4294967295。
由于计算机是美国人发明的,因此,最早只有127个字符被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII码,比如大写字母A的编码为65,小写字母z编码是122。
但是要处理中文显然一个字节是不够的,至少需要两个字节,且不能和ASCII编码冲突,所以中国制定了GB2312编码,用来把中文编进去。
世界上有上百种语言,各国有各国的标准,难免会出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。
因此,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会出现乱码问题了。
Unicode标准在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。现代操作系统和大多数编程语言都直接支持Unicode。

ASCII编码和Unicode编码的区别:ASCII编码是一个字节,而Unicode编码通常是2个字节。
字母A用ASCII编码的是十进制的65,二进制的01000001
字符0用ASCII编码是十进制的48,二进制的00110000,注意字符0和整数0是不同的。
汉字已经超出了ASCII编码的范围,用
Unicode编码是十进制的20013,二进制的01001110 00101101

你可以猜测到,如果把ASCII编码的A用Unicode编码,只需要在前面补0,因此,A的Unicode编码是00000000 01000001
统一成Unicode编码,乱码问题就从此消失了。但是,新的问题出现了,英文用Unicode编码比ASCII便阿门需要多一倍的存储空间。
所以,为了节约空间,又出现了把Unicode编码转化为“可变长编码”的utf-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。

(一)【重拾python】python基础_python
从上面表格还可以发现,UTF-8编码有一个额外的好处,就是ASCII编码实际上可以被看成UTF-8编码的一部分,所以大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作。

总结一下现在计算机系统通用的字符编码工作方式:
在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输时,就转换为UTF-8编码。
用记事本编辑时,从文件读取的UTF-8字符被转换为Unicode字符到内存里,保存时再把Unicode转换为UTF-8保存到文件。

(一)【重拾python】python基础_python_02
浏览网页时,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器,所以你看到很多网页的源码上会有类似<meta charset="UTF-8" />。表示该网页正是用的UTF-8编码。

<2>python字符串

在最新的python3版本中,字符串哦都是以Unicode编码的,也就是说,Python字符串支持多语言。
对于单个字符的编码,Python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应字符。
如果知道字符的整数编码,还可以用十六进制这么写str

>>>'\u4e2d\u6587'
'中文'

由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes

Python对bytes类型的数据用带b前缀的单引号或双引号表示

x=b'ABC'

注意区分b'ABC'ABC前者为str,后者虽然内容显示和前者一样,但bytes的每个字符都只占用一个字节。

以Unicode表示的str通过encode()方法可以编码为指定类型bytes
(一)【重拾python】python基础_python_03
bytes中,无法显示的ASCII字符的字节,用\x##显示。
反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法。

(一)【重拾python】python基础_python_04
如果bytes中包含无法解码的字节,decode()方法会报错:
(一)【重拾python】python基础_python_05
如果bytes中只有一小部分无效的字节,可以传入`errors='ignore’忽略。

(一)【重拾python】python基础_python_06
len()函数计算的是str的字符数,如果换成byteslen()函数就计算字节数。
(一)【重拾python】python基础_python_07
(一)【重拾python】python基础_python_08
在操作字符串时,我们经常遇到strbytes的相互转换。为了避免乱码问题,应当始终坚持使用UTF-8编码对strbytes进行转换。

由于Python源代码也是一个文本文件,所以,如果你的源代码包含中文,那么在保存源代码时,就务必指定保存为utf-8。当Python解释器读取源代码时,为了让它按utf-8编码读取,通常在文件开头写上这两行:
(一)【重拾python】python基础_python_09
第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释。
第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你的源代码中写的中文输出可能会有乱码。
(一)【重拾python】python基础_python_10

4 格式化

在Python中,采用的格式化方式和C语言一样,用%实现,如:
(一)【重拾python】python基础_python_11
有几个%_占位符,后面就跟几个变量或者值,顺序要对应。如果只有一个占位符,括号可省略。
常见的占位符:

占位符 替换内容
%d 整数
%f 浮点数
%s 字符串
%x 十六进制整数

其中格式化整数和浮点数还可以指定是否补0和整数与小数点的位数:

如果你不太确定应该用什么,s%永远起作用,他会把任何数据类型转换为字符串:
(一)【重拾python】python基础_python_12
另一种格式化字符串的方法是使用字符串的format()方法,它会用传入的参数依次替换字符串内的占位符{0}、{1}......
(一)【重拾python】python基础_python_13


<5>使用list和tuple
list:
Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。
比如,列出班里所有同学的名字,就可以用一个list表示
(一)【重拾python】python基础_python_14
变量classmates就是一个list。用len()函数可以获得list元素的个数:
(一)【重拾python】python基础_python_15

用索引来访问list中每一个位置的元素,索引是从0开始的,最后一个索引为len(classmates)-1,超出就会报一个Indexerror的错误:
(一)【重拾python】python基础_python_16
如果要取最后一个元素,可以用-1作为索引:
(一)【重拾python】python基础_python_17
list是一个可变的有序表,所以,可以往list中追加元素到末尾。
(一)【重拾python】python基础_python_18
也可以把元素插入到指定的位置,比如索引号为1的位置:
(一)【重拾python】python基础_python_19
要删除list末尾的元素,用pop()方法:
(一)【重拾python】python基础_python_20
要删除指定位置的元素,用pop(i)方法,其中i是索引位置:
(一)【重拾python】python基础_python_21
要把某个元素替换成别的元素,可以直接赋值给对应的索引位置:
(一)【重拾python】python基础_python_22
list里面的元素的数据类型也可以不同,比如:
(一)【重拾python】python基础_python_23
list元素也可以是另一个list:
(一)【重拾python】python基础_python_24
要拿到'php'可以写s[2][1],因此s可以看成一个二维数组,类似的还有三维、四维…

如果一个list中一个元素也没有,就是一个空的list,它的长度为0:
(一)【重拾python】python基础_python_25
tuple:
tuple和list非常类似,但是tuple一旦初始化就不能修改
(一)【重拾python】python基础_python_26
tuple没有append(),insert这样的方法。其他获取元素的方法和list一样,可以使用classmates[1]等,但是不能赋值成另外元素。

不可变的tuple的意义:因为tuple不可变,所以代码更加安全。如果可能,能用tuple代替list就尽量用tuple。

注意:
t=(1)定义的不是tuple,是1这个数!这是因为括号既可以表示tuple,又可以表示数学公式中的小括号,这就产生歧义,因此,Python规定,在这种情况下,按小括号进行计算,计算结果自然是1。
所以只有1个元素的tuple定义时必须加一个逗号:t=(1,)

再来看一个可变的tuple
(一)【重拾python】python基础_python_27
表面上看,tuple的元素确实变了,但其实变的时list里的元素。tuple还是指向原来的list。tuple的“不变”是说:tuple的每个元素指向永远不变。指向一个list,就不能改指向其他对象,但指向的这个list本身是可变的。

6 条件判断和循环

条件判断:
(一)【重拾python】python基础_python_28
注意:
input()返回的数据是str,使用它得到判断条件时,如果判断条件为整数类型的,要用int()str转换为整数。

循环:
Python的循环有两种,一种是for...in循环,依次把list或tuple中的每个元素迭代出来:
(一)【重拾python】python基础_python_29
ps:Python提供一个range(),可以生成一个整数序列,通过list()函数可以转换为list如:

(一)【重拾python】python基础_python_30
另一种是while循环:
(一)【重拾python】python基础_python_31
break可以提前退出循环。
continue作用是跳过当前循环。

7 dict和set

dict:

Python内置了字典:dict的支持,在其他语言也称为map,使用键-值(key-value)存储,具有极快的查找速度。
声明一个dict:

(一)【重拾python】python基础_python_32
可以通过key把数据放入字典:
(一)【重拾python】python基础_python_33

如果指定的key不存在,就会报错。避免key不存在的方法有:

  • 通过in判断key是否存在:

(一)【重拾python】python基础_python_34

  • 通过get(),如果key不存在,可以返回None,或者自己指定的value(如-1):
    (一)【重拾python】python基础_python_35

要删除一个key,用pop(key)的方法,对应的value也会从dict中删除。
(一)【重拾python】python基础_python_36务必注意,dict内部存放的顺序和key放入的顺序是没有关系的。

dict和list比较:
(一)【重拾python】python基础_python_37

需要牢记的是dict的key必须是不可变对象。这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)。
要保证hash的正确性,作为key的对象就不能变。在python中,字符串、整数等都是不可变的(可哈希的),因此,可以作为key。而list是可变的,就不能作为key。


set:
set与dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
要创建一个set,需要提供一个list作为输入集合:
(一)【重拾python】python基础_python_38
注意:传入的参数[1, 2, 3]是一个list,而显示的{1, 2, 3}只是告诉你这个set内部有1, 2, 3 这三个元素,显示的顺序也不表示set是有序的。

重复的元素在set中自动过滤掉:
(一)【重拾python】python基础_python_39
通过add(key)可以添加元素到set中,可以重复添加,但不会有结果:
(一)【重拾python】python基础_python_40

通过remove(key)方法可以删除元素:
(一)【重拾python】python基础_python_41

set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:
(一)【重拾python】python基础_python_42

再议不可变对象:
上面我们讲了:str是不变对象,而list是可变对象。
对于可变对象,比如list,对list进行操作,list内部的内容是会变化的,如:
(一)【重拾python】python基础_python_43

而对于不可变对象,比如str:
(一)【重拾python】python基础_python_44
虽然确实变出了'Abc',但是变量a最后仍然是abc

上述例子中,a是变量,而’abc'才是字符串对象!当我们调用replace时,是创建了一个新的字符串'Abc'并返回。


参考:廖雪峰Python