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个字节。
从上面表格还可以发现,UTF-8编码有一个额外的好处,就是ASCII编码实际上可以被看成UTF-8编码的一部分,所以大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作。
总结一下现在计算机系统通用的字符编码工作方式:
在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输时,就转换为UTF-8编码。
用记事本编辑时,从文件读取的UTF-8字符被转换为Unicode字符到内存里,保存时再把Unicode转换为UTF-8保存到文件。
浏览网页时,服务器会把动态生成的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
在bytes
中,无法显示的ASCII字符的字节,用\x##
显示。
反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes
。要把bytes
变为str,就需要用decode()
方法。
如果bytes
中包含无法解码的字节,decode()
方法会报错:
如果bytes
中只有一小部分无效的字节,可以传入`errors='ignore’忽略。
len()
函数计算的是str
的字符数,如果换成bytes
,len()
函数就计算字节数。
在操作字符串时,我们经常遇到str
和bytes
的相互转换。为了避免乱码问题,应当始终坚持使用UTF-8编码对str
和bytes
进行转换。
由于Python源代码也是一个文本文件,所以,如果你的源代码包含中文,那么在保存源代码时,就务必指定保存为utf-8。当Python解释器读取源代码时,为了让它按utf-8编码读取,通常在文件开头写上这两行:
第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释。
第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你的源代码中写的中文输出可能会有乱码。
4 格式化
在Python中,采用的格式化方式和C语言一样,用%
实现,如:
有几个%_
占位符,后面就跟几个变量或者值,顺序要对应。如果只有一个占位符,括号可省略。
常见的占位符:
占位符 | 替换内容 |
---|---|
%d | 整数 |
%f | 浮点数 |
%s | 字符串 |
%x | 十六进制整数 |
其中格式化整数和浮点数还可以指定是否补0和整数与小数点的位数:
如果你不太确定应该用什么,s%
永远起作用,他会把任何数据类型转换为字符串:
另一种格式化字符串的方法是使用字符串的format()
方法,它会用传入的参数依次替换字符串内的占位符{0}、{1}......
:
<5>使用list和tuple
list:
Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。
比如,列出班里所有同学的名字,就可以用一个list表示
变量classmates就是一个list。用len()函数可以获得list元素的个数:
用索引来访问list中每一个位置的元素,索引是从0开始的,最后一个索引为len(classmates)-1
,超出就会报一个Indexerror
的错误:
如果要取最后一个元素,可以用-1作为索引:
list是一个可变的有序表,所以,可以往list中追加元素到末尾。
也可以把元素插入到指定的位置,比如索引号为1的位置:
要删除list末尾的元素,用pop()
方法:
要删除指定位置的元素,用pop(i)
方法,其中i是索引位置:
要把某个元素替换成别的元素,可以直接赋值给对应的索引位置:
list里面的元素的数据类型也可以不同,比如:
list元素也可以是另一个list:
要拿到'php'
可以写s[2][1]
,因此s可以看成一个二维数组,类似的还有三维、四维…
如果一个list中一个元素也没有,就是一个空的list,它的长度为0:
tuple:
tuple和list非常类似,但是tuple一旦初始化就不能修改
tuple没有append(),insert
这样的方法。其他获取元素的方法和list一样,可以使用classmates[1]
等,但是不能赋值成另外元素。
不可变的tuple的意义:因为tuple不可变,所以代码更加安全。如果可能,能用tuple代替list就尽量用tuple。
注意:t=(1)
定义的不是tuple,是1
这个数!这是因为括号既可以表示tuple,又可以表示数学公式中的小括号,这就产生歧义,因此,Python规定,在这种情况下,按小括号进行计算,计算结果自然是1。
所以只有1个元素的tuple定义时必须加一个逗号:t=(1,)
再来看一个可变的tuple
:
表面上看,tuple的元素确实变了,但其实变的时list里的元素。tuple还是指向原来的list。tuple的“不变”是说:tuple的每个元素指向永远不变。指向一个list,就不能改指向其他对象,但指向的这个list本身是可变的。
6 条件判断和循环
条件判断:
注意:input()
返回的数据是str
,使用它得到判断条件时,如果判断条件为整数类型的,要用int()
将str
转换为整数。
循环:
Python的循环有两种,一种是for...in
循环,依次把list或tuple中的每个元素迭代出来:
ps:Python提供一个range()
,可以生成一个整数序列,通过list()
函数可以转换为list
如:
另一种是while循环:break
可以提前退出循环。continue
作用是跳过当前循环。
7 dict和set
dict:
Python内置了字典:dict的支持,在其他语言也称为map,使用键-值(key-value)存储,具有极快的查找速度。
声明一个dict:
可以通过key把数据放入字典:
如果指定的key不存在,就会报错。避免key不存在的方法有:
- 通过
in
判断key是否存在:
- 通过
get()
,如果key不存在,可以返回None
,或者自己指定的value(如-1
):
要删除一个key,用pop(key)的方法,对应的value也会从dict中删除。
务必注意,dict内部存放的顺序和key放入的顺序是没有关系的。
dict和list比较:
需要牢记的是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作为输入集合:
注意:传入的参数[1, 2, 3]
是一个list,而显示的{1, 2, 3}
只是告诉你这个set
内部有1, 2, 3 这三个元素,显示的顺序也不表示set是有序的。
重复的元素在set中自动过滤掉:
通过add(key)
可以添加元素到set中,可以重复添加,但不会有结果:
通过remove(key)
方法可以删除元素:
set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:
再议不可变对象:
上面我们讲了:str
是不变对象,而list是可变对象。
对于可变对象,比如list,对list进行操作,list内部的内容是会变化的,如:
而对于不可变对象,比如str:
虽然确实变出了'Abc'
,但是变量a最后仍然是abc
,
上述例子中,a
是变量,而’abc'
才是字符串对象!当我们调用replace
时,是创建了一个新的字符串'Abc'
并返回。
参考:廖雪峰Python