Python解释器分类:
1、CPython:这个解释器是用C语言开发的,所以叫CPython。在命令行下运行python就是启动CPython解释器
2、IPython:IPython是基于CPython之上的一个交互式解释器,也就是说,IPython只是在交互方式上有所增强,
但是执行Python代码的功能和CPython是完全一样的。好比很多国产浏览器虽然外观不同,但内核其实都是调用了IE。
CPython用>>>作为提示符,而IPython用In [序号]:作为提示符。
3、PyPy:PyPy是另一个Python解释器,它的目标是执行速度。PyPy采用JIT技术,对Python代码进行动态编译
(注意不是解释),所以可以显著提高Python代码的执行速度。
绝大部分Python代码都可以在PyPy下运行,但是PyPy和CPython有一些是不同的,这就导致相同的Python代码
在两种解释器下执行可能会有不同的结果。如果你的代码要放到PyPy下执行,就需要了解PyPy和CPython的不同点。
4、Jython:Jython是运行在Java平台上的Python解释器,可以直接把Python代码编译成Java字节码执行。
5、IronPython:IronPython和Jython类似,只不过IronPython是运行在微软.Net平台上的Python解释器,
可以直接把Python代码编译成.Net的字节码。
小结:Python的解释器很多,但使用最广泛的还是CPython。如果要和Java或.Net平台交互,最好的办法不是
用Jython或IronPython,而是通过网络调用来交互,确保各程序之间的独立性。
Python文本编辑器:
在Python的交互式命令行写程序,好处是一下就能得到结果,坏处是没法保存,下次还想运行的时候,还得再敲一遍。
所以,实际开发的时候,我们总是使用一个文本编辑器来写代码,写完了,保存为一个文件,这样,程序就可以反复运行了。
推荐使用Notepad++,免费使用,有中文界面;
请注意,用哪个都行,但是绝对不能用Word和Windows自带的记事本。Word保存的不是纯文本文件,而记事本会
自作聪明地在文件开始的地方加上几个特殊字符(UTF-8 BOM),结果会导致程序运行出现莫名其妙的错误。
在Windows上不能直接运行py文件,在Mac和Linux上是可以的,方法是在.py文件的第一行加上一个特殊的注释:
#!/usr/bin/env python3,然后,通过chomd命令给py文件以执行权限,就可以直接运行py文件了。
小结:用文本编辑器写Python程序可以保存为后缀为.py的文件,就可以用Python直接运行这个程序了。
print输出:
用print()在括号中加上字符串,就可以向屏幕上输出指定的文字。
print()函数可以接受多个字符串,用逗号“,”隔开,打印字符串时,遇到逗号会输出一个空格,起到拼接的作用
input输入:
input()可以让用户输入字符串,并存放到一个变量里,可以起到交互的作用
input()在括号中可以写一个字符串来提示用户输入
小结:任何计算机程序都是为了执行一个特定的任务,有了输入,用户才能告诉计算机程序所需的信息,
有了输出,程序运行后才能告诉用户任务的结果。
输入是Input,输出是Output,因此,我们把输入输出统称为Input/Output,或者简写为IO。
input()和print()是在命令行下面最基本的输入和输出,但是,用户也可以通过其他更高级的图形界面完成输入和输出,
比如,在网页上的一个文本框输入自己的名字,点击“确定”后在网页上看到输出信息
Python数据类型:
1、整数
2、浮点数(小数)
3、字符串(用单引号或双引号或三引号括起来的任意文本)
转义字符:
表示换行、 表示制表符等(r''表示''内部的字符串默认不转义)
4、布尔值(True、False)
5、列表
6、元祖
7、字典
8、集合
变量:
变量名必须是大小写英文、数字和下划线的组合,且不能用数字开头
小结:Python支持多种数据类型,在计算机内部,可以把任何数据都看成一个“对象”,
而变量就是在程序中用来指向这些数据对象的,对变量赋值就是把数据和变量给关联起来。
字符编码
ASCII编码是1个字节(支持中文)
Unicode编码字母中文都是2个字节
UTF-8编码字母是1个字节,中文是3个字节
ord()函数把字符转换成字符编码
chr()函数把字符编码转换成字符
bytes类型的数据用带b前缀的单引号或双引号表示,如x=b'ABC'
encode()函数可以把str转换为bytes,如'ABC'.encode('utf-8')运行结果b'ABC',超过编码范围会报错
decode()函数可以把bytes转换为str,如b'ABC'.decode('utf-8')运行结果'ABC'
如果bytes中包含无法解码的字节,decode()方法会报错
如果bytes中只有一小部分无效的字节,可以传入errors='ignore'忽略错误的字节,
如b'ABC'.decode('utf-8',errors='ignore')运行结果'ABC'
Python文件为防止乱码,通常在文件开头写上这两行:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;
第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。
字符串操作:
str.capitalize():将字符串的第一个字母大写
str.count():获得字符串中某一子字符串的数目
str.find():获得字符串中某一子字符串的起始位置,无则返回-1
str.isalnum():检测字符串是否仅包含0-9A-Za-z
str.isalpha():检测字符串是否仅包含A-Za-z
str.isdigit():检测字符串是否仅包含数字
str.islower():检测字符串是否均为小写字母
str.isspace():检测字符串中所有字符是否均为空白字符
str.istitle():检测字符串中的首字母是否为大写
str.isupper():检测字符串是否均为大写字母
str.join():连接字符串
str.lower():将字符串全部转换为小写
str.split():分割字符串
str.swapcase():将字符串中大写字母转换为小写或小写字母转换为大写
str.title():将字符串的首个字母转换为大写
len(str):获取字符串长度
字符串的格式化:
>>> 'Hello, %s' % 'world'
'Hello, world'
>>> 'Hi, %s, you have $%d.' % ('Michael', 1000000)
'Hi, Michael, you have $1000000.'
%运算符就是用来格式化字符串的。在字符串内部,%s表示用字符串替换,%d表示用整数替换,%f表示用浮点数替换,
%x表示用十六进制整数替换,有几个%?占位符,后面就跟几个变量或者值,顺序要对应好。如果只有一个%?,括号可以省略。
字符串里的%是一个普通字符,可以用%%表示一个%
另一种格式化字符串的方法是使用字符串的format()方法,它会用传入的参数依次替换字符串内的占位符{}
如>>> 'Hello, {0}, 成绩提升了 {1:.1f}%'.format('小明', 17.125)
'Hello, 小明, 成绩提升了 17.1%
小结:当str和bytes互相转换时,需要指定编码,最常用的编码是UTF-8。
列表(list):
list是一种有序的集合,可以随时添加和删除其中的元素。用len()函数可以获得list元素的个数
可以用索引来访问list中的每一个元素,list的索引是从0开始的,当索引超出范围时,Python会报一个IndexError错误
list的最后一个元素的索引可以用len(classmates) - 1表示,还可以用-1做索引,直接获取最后一个元素
list的操作:
list.append(x):列表尾部追加成员x
list.count(x):返回列表中的参数x出现的次数
list.extend(L):向列表中追加另一个列表L
list.index(x):返回参数x在列表中的序号
list.insert(index,object):向列表中指定位置(index)插入数据(object)
list.pop():删除列表中尾部的成员并返回删除的成员,pop(i)可以删除指定位置的元素,i是索引位置
list.remove(x):删除列表中的指定成员(有多个则只删除第一个)指定成员不存在则报错
list.reverse():将列表中成员的顺序颠倒
list.sort():将列表中成员排序(要求其成员可排序,否则报错)
>>> alst = [1,2,3,4,5] #建立一个列表
>>> alst.append(1) #列表尾部追加元素1,alst = [1,2,3,4,5,1]
>>> alst.count(1) #统计1在列表中出现的次数,1出现2次
>>>alst.exend([2,'insert']) #列表后追加另一个列表所有元素,alst = [1,2,3,4,5,1,2,'insert']
>>> alst.index(2) #元素2在列表中首次出现的序号,2出现的序号为1
>>> alst.insert(3,0) #在序号3处插入元素0,alst = [1,2,3,0,4,5,1,2,'insert']
>>> alst.pop() #删除并返回列表最后一个元素,删除并返回'insert',alst = [1,2,3,0,4,5,1,2]
>>> alst.remove(1) #删除列表中的元素(仅删除第一个),alst = [2,3,0,4,5,1,2]
>>> alst.sort() #对列表元素进行排序,alst = [0,1,2,2,3,4,5]
元祖(tuple):
tuple是一种有序的集合,tuple一旦初始化就不能修改。用len()函数可以获得tuple元素的个数
因为tuple不可变,所以代码更安全,能用tuple代替list就尽量用tuple
元祖只有一个元素时必须加一个逗号来消除歧义:
>>> t = (1)
>>> t
1
>>> t = (1,)
>>> t
(1,)
“可变的”tuple:
>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])
表面上看,tuple的元素确实变了,但其实变的不是tuple的元素,而是list的元素。tuple一开始指向的list并
没有改成别的list,所以,tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即指向'a',就不能
改成指向'b',指向一个list,就不能改成指向其他对象,但指向的这个list本身是可变的!
小结:list和tuple是Python内置的有序集合,一个可变,一个不可变。
字典(dict):
dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度
为什么dict查找速度这么快?
因为dict的实现原理和查字典是一样的。假设字典包含了1万个汉字,我们要查某一个字,一个办法是把字典从第一页往后翻,
直到找到我们想要的字为止,这种方法就是在list中查找元素的方法,list越大,查找越慢。
第二种方法是先在字典的索引表里(比如部首表)查这个字对应的页码,然后直接翻到该页,找到这个字。无论找哪个字,
这种查找速度都非常快,不会随着字典大小的增加而变慢。
key不存在,dict就会报错,避免key不存在的错误的两种方法:
一是通过in判断key是否存在
二是通过dict提供的get()方法,如果key不存在,可以返回None,或者自己指定的value
删除key的方法:pop(key)
dict的key必须是不可变对象
dict内部存放的顺序和key放入的顺序是没有关系的
和list比较,dict有以下几个特点:
查找和插入的速度极快,不会随着key的增加而变慢;
需要占用大量的内存,内存浪费多。
而list相反:
查找和插入的时间随着元素的增加而增加;
占用空间小,浪费内存很少
字典操作:
dic.clear():清空字典
dic.copy():复制字典
dic.get(k,[default]):获得键k对应的值,不存在则返回default
dic.items():获得由键盒值组成的迭代器
dic.keys():获得键的迭代器
dic.pop(k):删除k:v成员对
dic.values():获得值的迭代器
dic.fromkeys(iter,value):以列表或元祖中给定的键建立字典,默认值为value
dic.popitem():从字典中删除任意k:v项并返回它
dic.setdefault(k,default):若字典中存在key值为k的,则返回其对应的值;否则,在字典中建立一个k:default字典成员
集合(set):
set是一组无序的、不可重复的集合
重复元素在set中自动被过滤
>>> s = set([1, 1, 2, 2, 3, 3])
>>> s
{1, 2, 3}
通过add(key)方法可以添加元素到set中,可以重复添加,但不会有效果
>>> s.add(4)
>>> s
{1, 2, 3, 4}
>>> s.add(4)
>>> s
{1, 2, 3, 4}
通过remove(key)方法可以删除元素
>>> s.remove(4)
>>> s
{1, 2, 3}
set可以做数学意义上的交集、并集等操作
>>> s1 = set([1, 2, 3])
>>> s2 = set([2, 3, 4])
>>> s1 & s2
{2, 3}
>>> s1 | s2
{1, 2, 3, 4}
序列:
序列表示索引为非负整数的有序对象的集合,包括前面所介绍的字符串、列表和元祖。
字符串是字符的序列,列表和元祖则是任意Python数据类型或对象的序列。
元祖是不可变的,字符串也是不可以变的(修改字符串就是重新创建一个字符串)。
序列的切片方法:
abc =[0,1,2,3,4,5,6,7]
abc[:] #取全部成员数据项,abc =[0,1,2,3,4,5,6,7]
abc[0:] #取全部成员数据项,abc =[0,1,2,3,4,5,6,7]
abc[:-1] #取除最后一个成员之外的所有成员数据项,abc =[0,1,2,3,4,5,6,]
abc[2:5] #取到[2,3,4]
abc[::2] #每隔一个取一个成员,取到[0,2,4,6]
abc[0:5:2] #从0至4每隔一个取一个成员,取到[0,2,4]
abc[::-1] #从右至左取全部成员,abc =[7,6,5,4,3,2,1,0]
abc[5:0:-2] #从5至0(不包括0)从右至左每隔一个取一个成员,取到[5,3,1]
序列的内置操作:
len(s):返回s的元素数(长度)
min(s):返回s中的最小值
max(s):返回s中的最大值
sum(s):返回s中各项的和
all(s):s中所有项为真,则返回真,否则返回假
any(s):s中有一项为真,则返回真,否则返回假
条件判断:
if <条件判断1>:
<执行1>
elif <条件判断2>:
<执行2>
elif <条件判断3>:
<执行3>
else:
<执行4>
条件判断从上向下匹配,当满足条件时执行对应的块内语句,后续的elif和else都不再执行
循环:
Python的循环有两种
一种是for...in循环,依次把可迭代对象中的每个元素迭代出来
for循环的内置函数:
enumerate(seq):编号迭代
sorted(seq):排序迭代
reversed(seq):翻转迭代
zip(seq1,seq2,...):并行迭代
>>>for i,item in enumerate('abc'):
>>>print('第%d个字符是:%s'%(i,item))
弟0个字符是:a
弟1个字符是:b
弟2个字符是:c
>>>for i in sorted([3,1,6]):
>>>print(i)
1
3
6
>>>a = (1,2)
>>>c = (3,4)
>>>a = (5,6,7)
>>>for i,j,k in zip(a,b,c):
>>>print('%d:%d:%d'%(i,j,k))
1:3:5
2:4:6
并行迭代函数中序列值的长度不一致时,只遍历到最短的序列的长度
第二种循环是while循环,只要条件满足,就不断循环,条件不满足时退出循环
在循环中,break语句可以提前退出整个循环,continue语句可以跳过当前的这次循环,直接开始下一次循环,
这两个语句通常都必须配合if语句使用。
要特别注意,不要滥用break和continue语句。break和continue会造成代码执行逻辑分叉过多,容易出错。大多数循环
并不需要用到break和continue语句,上面的两个例子,都可以通过改写循环条件或者修改循环逻辑,去掉break和continue语句。
有些时候,如果代码写得有问题,会让程序陷入“死循环”,也就是永远循环下去。这时可以用Ctrl+C退出程序,或者强制结束Python进程。