【python】 - 基本语法总结(1)
1.1 数据类型
计算机可以处理不同类型的数据,文本,图形,音视频数据通过转换成数值型数据而被计算机直接所处理,这些直接所处理的数据类型包括:整数、浮点数、字符串、布尔值、空值。
1.1.1 整数
形如1,2,3,4,…的数字在数学上和程序中的表示方法一样,都属于整数类型。
1.1.2 浮点数
浮点数是通常现实中所见的小数,比如1.2,1.34,1.0000089等。
浮点数在计算机中的科学计数法表示为:计算机中1.34×109表示成科学计数法为1.34e9,0.0000089表示成科学计数法为8.9e-6.
1.1.3 字符串
以单引号‘’或者双引号“”括起来的任意文本(不包括‘’或者“”)。
‘abc’字符串只包含a,b,c三个字符;
“I’m ok ” 字符串包含I ‘ m 空格 o k6个字符;
转义字符\
‘I’m ok’ #第二个/会将后边的’按字符输出
'I'm ok' #输出错误
File "<ipython-input-1-3ab66808fb8f>", line 1
'I'm ok' #输出错误
^
SyntaxError: invalid syntax
"I'm ok"
"I'm ok"
'I\'m ok'
"I'm ok"
1.1.4 布尔值
使用True、False表示布尔值。
True and True #与
True
True and False #与
False
not False #非
True
True or False #或
True
5<3
False
1.1.5 空值
Python中的特殊值,空值用None表示,不同于0值。
占位符
%d — 整数
%f — 浮点数
%s — 字符串
%x — 十六进制整数
Python同时提供了列表、字典等多种数据类型,还允许创建自定义数据类型。
1.2 列表、元组、字典与集合
list是一种有序的集合,可以随时添加和删除其中的元素。
添加元素可以有append,insert
删除元素可以有pop
替换元素
list里面的元素的数据类型可以不同。
note=['apple','banana','pear','peach']
print(note)
print(len(note)) #获取列表note中元素个数
print(note[0]) #按索引访问list中的元素
print(note[-1]) #获取列表中最后一个元素
print(note[-2]) #获取列表中倒数第二个元素
['apple', 'banana', 'pear', 'peach']
4
apple
peach
pear
#列表末尾追加元素
note.append('melon')
print(note)
['apple', 'banana', 'pear', 'peach', 'melon', 'melon']
#元素插入到指定位置,比如查到索引为1的位置
note.insert(1,'grape')
note
['apple', 'grape', 'grape', 'banana', 'pear', 'peach', 'melon', 'melon']
#删除list末尾的元素
note.pop()
'melon'
print(note)
['apple', 'grape', 'grape', 'banana', 'pear', 'peach', 'melon']
#删除指定位置的元素
note.pop(1)
'grape'
note
['apple', 'grape', 'banana', 'pear', 'peach', 'melon']
#替换元素
note[5]='water-melon'
note
['apple', 'grape', 'banana', 'pear', 'peach', 'water-melon']
#list中的元素可以不同
L=['Apple',12,True,'']
L
['Apple', 12, True, '']
tuple,元组与列表的区别是一旦初始化就不能被修改,tuple的不可变性,使得代码更加安全。
note=('apple','pear','grape') #note元组没有append(),insert()方法。
#同样可以采用list获取元素的方法
note[-1]
'grape'
当定义只有一个元素的tuple时,不能这么写t=(1),而应该写作t=(1,)
#t=(1)中的小括号既可以表示tuple,也可以表示成数学公式中的小括号,
#在Python中,这种情况下,按小括号进行计算,计算结果就是1.
#所以在元组中的定义,需要加一个逗号,消除歧义
t=(1,)
t
(1,)
可变的tuple怎么看待
t=('apple','grape',['melon','pear']) #tuple中定义了三个元素
t[2][0]='a'
t[2][1]='b'
t
('apple', 'grape', ['a', 'b'])
这个例子中元组可变的原因是,元组最后一个元素是列表,列表中的元素重新赋值后,元组中列表发生变化,但是元组第2个索引指向的位置没有发生变化
字典dict,使用键-值(key-value)存储,具有极快的查找速度。
#d={key1:value1,key2:value2,...}
d={'key1':1,'key2':2,'key3':3}
d['key1']
1
#查看key是否存在字典里
'key4' in d
False
d.get('key4') #key值不存在,返回None时,交互环境并没有显示
#可以在key不存在的情况下指定返回值
d.get('key4','-1')
'-1'
#删除key操作
d.pop('key1')
1
dict:
查找和插入的速度极快,不会随着key的增加而变慢;
需要占用大量的内存;
list:
查找和插入的时间随着元素的增加而增加;
占用空间小
dict同时存储key和value,根据key值计算value得位置,其中key是不可变对象,通过key计算value存储位置的算法称为哈希算法。
字符串,整数等都是不可变的,可以放心的用作于key值,list是可变的,不能作为key。
key5=[1,2,3]
d[key5]='list' #列表不能作为字典中的key值
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-9-4ff700c86b7b> in <module>()
1 key5=[1,2,3]
----> 2 d[key5]='list' #列表不能作为字典中的key值
TypeError: unhashable type: 'list'
set集合,顾名思义,在数学中集合中不能同时存在两个一样的数字,在python中,set是一组key的集合,但不存储value,key值不能重复。
#定义一个set
s=set([1,2,3,4,4,5,6,6])
s
{1, 2, 3, 4, 5, 6}
#上边重复元素会被过滤
#结合添加元素
s.add(6) #t添加重复元素,不会有效果
s
{1, 2, 3, 4, 5, 6}
#删除元素
s.remove(4)
s
{1, 2, 3, 5, 6}
#集合间的交并集
s1=set([1,2,3])
s2=set([2,3,4])
s1&s2 #交集
{2, 3}
s1|s2 #并集
{1, 2, 3, 4}
s=set([1,2,3,[1,2]]) #list不能放入set中
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-19-e311a47a3491> in <module>()
----> 1 s=set([1,2,3,[1,2]]) #list不能放入set中
TypeError: unhashable type: 'list'
a='abc' #字符串是不可变对象
a.replace('a','A')
'Abc'
a
'abc'
a=['c','b','a'] #列表作为可变对象
a.sort()
a #
['a', 'b', 'c']
1.3 文件操作
读写文件是最常见的IO操作,那么使用python语言如何操作呢?见下。
读写文件的过程请求操作系统打开一个文件对象(通常称为文件描述符),然后通过系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。
#读文件---使用python内置的open()函数
f=open('./test.txt','r') #'r'表示读
f
<_io.TextIOWrapper name='./test.txt' mode='r' encoding='cp936'>
#文件打开成功,调用read()方法可以一次读取文件的全部内容
f.read()
'你好!欢迎学习python读写文件。'
#最后通过调用close()方法关闭文件,文件不关闭会占用操作系统的资源,同时操作系统同一时间能打开的文件数量也是有限的
f.close()
#当文件读写时都有可能产生IOError,一旦出错,后边文件的关闭就不会调用
#为了无论是否出错都能正确的关闭文件,我们可以使用try...finally来实现
try:
f=open('./test.txt','r')
print(f.read())
finally:
if f:
f.close()
你好!欢迎学习python读写文件。
#由于上边的写法在每次写都写那么多,比较繁琐,Python就引入了with语句自动调用close()
with open('./test.txt','r') as f:
print(f.read())
你好!欢迎学习python读写文件。
#上面的写法不用调用f.close()f方法
#接下来,我们就看看read()方法
read()会一次性读取文件的全部内容,如果文件的内容很大,内存就会爆炸。所以可以采用read(size)的方法,每次最多读取size个字节的内容。
readline()可以每次读取一行内容
readlines()一次读取所有内容并按行返回list
若文件很小,read()一次性读取最方便;
若不能确定文件的大小,反复调用read(size)比较保险;
若是配置文件,调用readlines()最方便。
f=open('./test.txt','r')
for line in f.readlines():
print(line.strip()) #把末尾的‘\n’删掉
f.close()
你好!欢迎学习python读写文件。
二进制文件读取
前面读取的是文本文件,并且是UTF-8编码的文本文件,要读取二进制文件,比如图片、视频等等,用‘rb’模式打开文件即可。
f=open('./Tulips.jpg','rb')
#f.read() #输出的是十六进制表示的字节
字符编码文件读取
在读取非UTF-8编码的文本文件时,需要给open()函数传入encoding参数,例如读取GBK编码的文件时,如下。
f=open('./gbk.txt',encoding='gbk')
f.read()
'你好,欢迎一起学习文件读写!'
若文件中含有编码不规范字符,可能会遇到UnicodeDecodeError,此时,open()函数还接受一个errors参数,表示遇到编码错误后如何处理。
#最简单的方式是直接忽略
f=open('./gbk.txt','r',encoding='gbk',errors='ignore')
f.read()
'你好,欢迎一起学习文件读写!你好,欢迎一起学习文件读写!你好,欢迎一起学习文件读写!ahjbvhjvjdknbnihaohuanyinxuexi '
f=open('./gbk.txt','r',errors='ignore')
f.read()
'你好,欢迎一起学习文件读写!你好,欢迎一起学习文件读写!你好,欢迎一起学习文件读写!ahjbvhjvjdknbnihaohuanyinxuexi '
写文件
在调用open()函数时,传入标识符‘w’或者‘wb’表示写文本文件或写二进制文件
f=open('./test.txt','w')
f.write('Hello,world') #在写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存中缓存起来
f.close() #只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。
#因此,忘记调用close()的结果是数据可能只写一部分到磁盘了,剩下的丢失了
f=open('./test.txt','r')
f.read()
'Hello,world'
我们会发现原来test.txt的内容变了,这是因为‘w’会直接复写之前的内容,传入参数‘a’可以以追加的形式写入。
#保险的做法是使用with语句
with open('./test.txt','a') as f:
f.write(',开始读写文件之旅!')
f=open('./test.txt','r')
f.read()
'Hello,world,开始读写文件之旅!'
同理,写入特定编码的文本文件,就给open()函数传入encoding参数,将字符串自动转换成指定编码。
with open('./gbk.txt','w',encoding='gbk') as f:
f.write('你好,欢迎一起学习文件读写!')