目录
数据类型
不可变数据类型:Number、String、Tuple
可变数据:List、Dictionary、Setumber
Number
Number具体分为:int(整数)、float(浮点数即小数)、String(字符串)、bool(布尔值)
整数
Python可以处理任意大小的整数,当然包括负整数,表示方法与数学的写法一致。
允许在数字中间以_分隔
10_000_000_000和10000000000
浮点数
浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的。浮点数可以用数学写法,如1.23,-9.01等等。
在Python中 科学计数法中把10用e替代。
字符串
字符串是以单引号'或双引号"括起来的任意文本。
字符串的拼接
用逗号拼接,则逗号位会出现空格。
用加号拼接,不会出现空格。如果想有空格,则应在其中加入空格
print("Hello","World") #输出:Hello World
print("Hello"+"World") #输出:HelloWorld
print("Hello"+" "+"World") #输出:Hello World
字符串的处理(8种常用)
len():返回字符串的长度,即字符串中单个元素的个数
length=len(target_string) #target-string为目标字符串变量
upper():将字符串中的所有字符都转换为大写
lower():将所有字符转换为小写
title():将字符串所有单词的首字母变成大写,而其他字母依然小写
new_string="Tom is good"
print(name_string.upper()) #输出:TOM IS GOOD
print(name_string.lower()) #输出:tom is good
print(name_string.title()) #输出:Tom Is Good
strip():可以去除字符串两侧(不包含内部)全部的空格。使用该方法,也可以通过指定参数,去除两侧指定的特定字符
split():实现字符串分割。该方法根据提供的分隔符,将一个字符串分割为字符列表,如果不提供分隔符,则程序会默认把空格(制表、换行等)作为分隔符。
find():利用该方法可以在一个较长的字符串中查找子字符串。如果该字符串中,有一个或者多个子字符串,则该方法返回第一个子串所在位置的最左端索引,若没有找到符合条件的子串,则返回-1。
replace():用以替换给定字符串中的子串。
source_string.replace(old_string, new_string)
'本身也是字符的情况
用""括起来
转义字符
转义字符\可以转义很多字符,比如\n表示换行,\t表示制表符,字符\本身也要转义,所以\\表示的字符就是 \ 。
当字符串里即既包含 ' 又包含 ",用转义字符
特例:
用r''表示''内部的字符串默认不转义
用'''...'''的格式表示多行内容
布尔值
在Python中,可以直接用True、False表示布尔值(请注意大小写)
布尔值可以用and、or和not运算。
and运算是与运算,只有所有都为True,and运算结果才是True
or运算是或运算,只要其中有一个为True,or运算结果就是True
not运算是非运算,它是一个单目运算符,把True变成False,False变成True
补充
空值
None不能理解为0,因为0是有意义的,而None是一个特殊的空值。
注意事项
Python的语法:缩进方式(没有规定缩进是几个空格还是Tab,惯例为4个空格的缩进)
Python大小写敏感。
List(列表)
List是一种有序的集合,可以作为一个方括号内的逗号分隔值出现。List里面的元素的数据类型也可以不同,可以随时添加和删除其中的元素。List元素也可以是另一个List(但是另一个List只算一个元素,可以理解为一个二维数组)。
List中一个元素也没有,就是一个空的list,它的长度为0
格式:List=['a','b','c']
len(list) #获得list元素的个数
列表函数
list.append(obj) #在列表末尾添加新的对象
list.count(obj) #统计某个元素在列表中出现的次数
list.extend(seq) #在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
list.index(obj) #从列表中找出某个值第一个匹配项的索引位置
list.pop() #移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
list.remove() #移除列表中某个值的第一个匹配项
list.reverse() #反向列表中元素
list.sort(key=None,reverse=False) #对原列表进行排序,True 降序,False 升序(默认)
list.clear() #清空列表
list.copy() #复制列表
Tuple(元组)
tuple与list非常类似,但是一旦初始化就不能修改。
其他获取元素的方法和list是一样的,但不能赋值成另外的元素。
只有1个元素的tuple定义时必须加一个逗号,Python在显示只有1个元素的tuple时,也会加一个逗号,,以免你误解成数学计算意义上的括号。
tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。
dict(dictionary)
Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。
d = {key1 : value1, key2 : value2 }
原理:先在字典的索引表里(比如部首表)查这个字对应的页码,然后直接翻到该页,找到这个字。
注意:dict内部存放的顺序和key放入的顺序是没有关系的
字典函数
radiansdict.clear() #删除字典内所有元素
pop(key[,default]) #删除字典给定键 key 所对应的值,
#返回被删除的值。key值必须给出。 否则,返回default值
dict查找不到的情况
当查找不到时就会报错,所以有两种方法避免报错。
一是通过in判断key是否存在:'' in list
二是通过dict提供的get()方法,如果key不存在,可以返回None,或者自己指定的value
set(集合)
集合是一个无序的不重复元素序列,可以使用大括号 { } 或者 set() 函数创建集合
set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
注意: 建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典
重复元素在set中自动被过滤
集合函数
s.add() #为集合添加元素
s.clear() #移除集合中的所有元素
s.copy() #拷贝一个集合
s.remove() #删除元素
函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。
定义函数
格式:
def 函数名():
代码
空函数
如果想定义一个什么事也不做的空函数,可以用pass语句(pass可以用来作为占位符):
def nop():
pass
参数检查
调用函数时,如果参数个数不对,Python解释器会自动检查出来,并抛出TypeError。但是如果参数类型不对,Python解释器就无法帮我们检查。
返回多个值
返回值是一个tuple!但是,在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值,所以,Python的函数返回多值其实就是返回一个tuple,但写起来更方便。
调用函数
格式:
函数名()
每次调用函数时,函数都会从头开始执行,当这个函数中的代码执行完毕后,意味着调用结束了。当然了如果函数中执行到了return也会结束函数。
函数的参数
位置参数
例:power(x) #x即为位置参数
当括号里有两个以上的参数时,实参要按照形参的顺序摆放,传入。
默认参数
默认参数可以简化函数的调用。最大的好处是能降低调用函数的难度。
def enroll(name,city='Beijing'):
print('name:',name)
print('city:',city)
enroll('Jim')
注意:
一是必选参数在前,默认参数在后,否则Python的解释器会报错(思考一下为什么默认参数不能放在必选参数前面);
二是如何设置默认参数。
当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。
可变参数
在Python函数中,还可以定义可变参数。顾名思义,可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。
要定义出这个函数,我们必须确定输入的参数。由于参数个数不确定,我们首先想到可以把a,b,c……作为一个list或tuple传进来。但是调用的时候,需要先组装出一个list或tuple。
定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个*号。在函数内部,参数numbers接收到的是一个tuple,因此,函数代码完全不变。但是,调用该函数时,可以传入任意个参数,包括0个参数。
*nums表示把nums这个list的所有元素作为可变参数传进去。
递归函数
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。
使用递归函数需要注意防止栈溢出。解决递归调用栈溢出的方法是通过尾递归优化,事实上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊的尾递归函数也是可以的。
尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。
IO文件读写
在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。
读取文件
使用Python内置的open()函数,传入文件名和标示符,标识符'r'表示读。
f=open('F:\eclipse\eclipse\sy9T3.txt','r')
文件不存在则会抛出FileNotFoundError。
成功打开文件后,调用read()方法一次性读完文件的全部内容。
f.read();
最后调用close()方法关闭文件文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的。
f.close()
为了避免文件内容过多,反复调用read(size)方法,每次最多读取size个字节的内容。
其中readline()可以每次读取一行内容,调用readlines()一次读取所有内容并按行返回list。
IOError异常处理
由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们对异常提前进行处理:
方法一:
try...finally
try:
f = open('/path/to/file', 'r')
print(f.read())
finally:
if f:
f.close()
方法二:
引入with
with open('/path/to/file', 'r') as f:
print(f.read())
第二种方法代码更佳简洁,并且不必调用f.close()方法。
UnicodeDecodeError异常处理
read()时可能会抛出UnicodeDecodeError(encoding不管是用utf8、gb2312、gbk编码方式都不行)
解决办法:
改为以二进制的方式读取即可:open('xxx.xsl','rb')
f=open('F:\eclipse\eclipse\sy9T3.txt','rb')
f.read()
写文件
写文件和读文件是一样的,唯一区别是调用open()函数时,传入标识符'w'或者'wb'表示写文本文件或写二进制文件:
f=open('F:\eclipse\eclipse\sy.txt','w')
f.write("I love Python!")
f.close()
进行完上面的操作后,点开文件
注:1.只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。
2.以'w'模式写入文件时,如果文件已存在,会直接覆盖(相当于删掉后新写入一个文件)。
可以传入'a'以追加(append)模式写入 追加到文件末尾
f=open('F:\eclipse\eclipse\sy.txt','a')
f.write("end")
f.close()
循环语句
for循环
for x in ...循环就是把每个元素代入变量x,然后执行缩进块的语句。
for each in range(3):
print(each)
0
1
2
Python提供一个range()函数,可以生成一个整数序列,再通过list()函数可以转换为list
list=['eat','sleep','study']
for act in list:
print("正在",act)
正在 eat
正在 sleep
正在 study
range(101)就可以生成0-100的整数序列
for循环嵌套
for iteration_var in sequence:
for iteration_var in sequence:
循环语句
while循环
只要条件满足,就不断循环,条件不满足时退出循环。
while i<3: #判断条件
print(i) #循环语句
i=i+1
0
1
2
在循环中,break语句可以提前退出循环
在循环过程中,也可以通过continue语句,跳过当前的这次循环,直接开始下一次循环
用Ctrl+C退出程序,或者强制结束Python进程
while循环嵌套
while 判断条件:
while 判断条件:
循环语句
迭代器
迭代器用来循环访问一系列元素,它不仅可以迭代序列,也可以迭代不是序列但是表现出序列行为的对象。迭代器很适用于迭代一些无法预先知道元素总数的巨大的集合。迭代器提供了一个统一的访问集合的接口,定义iter()方法对象,就可以使用迭代器访问。
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。next()函数访问每一个对象,直到对象访问完毕,返回一个StopIteration异常。使用isinstance()可以判断一个对象是否是Iterator对象。
所有的Iterable都可以通过iter()函数转化为Iterator。
异常处理
捕获异常
try...except...
try:
print("....")
except IOError:
pass
try中放的是可能产生异常的代码。当产生错误时,跳转到except中运行七处理异常的方法。
捕获多个异常
如果想通过一次except捕获到多个异常可以用一个元组的方式
try:
print("...") #代码
except (IOError,NameError):
pass
或者针对不同的异常进行不同的处理
try:
ptint("....")
except NameError:
print("nameerror")
except IOError:
print("IOError")
注:父类的异常要放到其子类的后面,否则永远不会有子类异常处理
另外,还可以使用try...except...else语句,当try中的语句没有发生异常时,else中的代码就会被执行。还可以再else后面加上finally,finally中的语句,不管try中有没有发生有异常都会执行。
自定义异常
自定义异常类继承自 Exception 类,可以直接继承,或者间接继承。