一、推导
1.矩阵的运算(加减乘除)
以乘法为例:
求m,n中矩阵各个元素的乘积
m=[(1,2,3),(4,5,6),(7,8,9)]
n=[(2,2,2),(3,3,3),(4,4,4)]
#第一种方案 通过元素下标获取各个数据
#for循环法
for i in range(len(m)):
for j in range(len(m[i])):
print(m[i][j]*n[i][j],end=' ')
print()
#推导法
x=[m[i][j]*n[i][j] for i in range(len(m)) for j in range(len(m[i]))]
print(x)
#第二种方案 将每组得乘积放在列表中
x=[[m[i][j]*n[i][j] for i in range(len(m[j]))] for j in range(len(m))]#外部循环中j得到一个结果 内部循环中i循环三次得到三个结果
print(x)
执行命令得:
2 4 6 12 15 18 28 32 36
[2, 4, 6, 12, 15, 18, 28, 32, 36]
[[2, 12, 28], [4, 15, 32], [6, 18, 36]]
2.结合下面列表的元素(条件:不能有重复值)
#两个列表
a=[1,2,3]
b=[3,4,2]
#for循环写法
for i in a:
for j in b:
if i!=j:
print((i,j), end=' ')
print()
#推导写法
x=[(i,j)for i in a for j in b if i!=j]
print(x)
#三个列表
a=[1,2,3]
b=[3,4,2]
c=[3,5,1]
#for循环写法
for i in a:
for j in b:
for k in c:
if i!=j and i!=k and j!=k:
print((i,j,k), end=' ')
print()
#推导写法
x=[(i,j,k)for i in a for j in b for k in c if i!=j and i!=k and j!=k]
print(x)
执行命令得
(1, 3) (1, 4) (1, 2) (2, 3) (2, 4) (3, 4) (3, 2)
[(1, 3), (1, 4), (1, 2), (2, 3), (2, 4), (3, 4), (3, 2)]
(1, 3, 5) (1, 4, 3) (1, 4, 5) (1, 2, 3) (1, 2, 5) (2, 3, 5) (2, 3, 1) (2, 4, 3) (2, 4, 5) (2, 4, 1) (3, 4, 5) (3, 4, 1) (3, 2, 5) (3, 2, 1)
[(1, 3, 5), (1, 4, 3), (1, 4, 5), (1, 2, 3), (1, 2, 5), (2, 3, 5), (2, 3, 1), (2, 4, 3), (2, 4, 5), (2, 4, 1), (3, 4, 5), (3, 4, 1), (3, 2, 5), (3, 2, 1)]
3.创建一个列表,遍历出x得值 并且得出x得平方,打印出的格式为[(number,square)]
x=[(x,x**2) for x in range(6)]
print(x)
执行命令得
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]
二、枚举
枚举简单的说也是一种数据类型,只不过是这种数据类型只包含自定义的特定数据,它是一组有共同特性的数据的集合。举个例子,颜色也可以定义成枚举类型,它可以包含你定义的任何颜色,当需要的时候,只需要通过枚举调用即可,另外比如说季节(春夏秋冬)、星期(星期一到星期日)等等这些具有共同投特征的数据都可以定义枚举。
1.枚举得定义
<1> 首先,定义枚举要导入enum模块
<2>枚举定义用class关键字,继承Enum类
<3>用于定义枚举的class和定义类的class是有区别的
from enum import Enum
class Color(Enum):
red = 1
orange = 2
yellow = 3
green = 4
blue = 5
indigo = 6
purple = 7
代码分析:
1.上面的代码,我们定义了颜色的枚举Color
2.颜色枚举有7个成员,分别是Color.red Color.orange Color.yellow等
3.每一个成员都有他们各自名称和值,Color.red,值是:1
4.每个成员的数据类型就是它所述的枚举.(注:用class定义的类,实际上就是一种类型)
2.注意事项!!!
<1>定义枚举时,成员名称不允许重复
如:
from enum import Enum
class Color(Enum):
red = 1
red = 2
<2>默认情况下,不同的成员值允许相同.但是两个相同值的成员,第二个成员的名称被视作第一个成员得别名
from enum import Enum
class Color(Enum):
red = 1
red_alias = 1
<3>如果枚举中存在相同值的成员,在通过值获取枚举成员时,只能获取第一个成员
<4>如果要限制定义枚举时,不能定义相同值的成员.可以使用装饰器@unique(要导入unique模块)
3.枚举的获取
<1>通过成员的名称来获取成员 Color['red']
<2>通过成员值来获取成员 Color(2)
<3>通过成员,来获取它的名称和值
red_member = Color.red
red_member.name
red_member.value
from enum import Enum, unique
@unique
class Color(Enum):
'''
对于一些既定的值,不允许随意赋值的量
自定义的类 枚举又叫自定义数据类型
'''
red = 1
orange = 2
yellow = 3
green = 4
blue = 5
indigo = 6
purple = 7
print(Color(1)) #根据枚举的值 来获取枚举名
print(Color['orange'].value) #根据枚举名来获取枚举值
#创建生成一个枚举数据
color=Color.green
print('枚举数据名字:',color.name)
print('枚举数据的值:',color.value)
执行命令得
Color.red
2
枚举数据名字: green
枚举数据的值: 4
4.枚举迭代器
<1>枚举支持迭代器,可以遍历枚举成员
<2>如果枚举有值重复的成员,循环遍历枚举时只获取值重复成员的第一个成员
<3>如果想把值重复的成员也遍历出来,要用枚举的一个特殊属性__members__
from enum import Enum
class Color(Enum):
red = 1
orange = 2
yellow = 3
green = 4
blue = 5
indigo = 6
purple = 7
dark_red=1
for color in Color:
print(color,end=' ')
for color in Color.__members__.items():
print(color)
执行命令得
Color.red Color.orange Color.yellow Color.green Color.blue Color.indigo Color.purple ('red', <Color.red: 1>)
('orange', <Color.orange: 2>)
('yellow', <Color.yellow: 3>)
('green', <Color.green: 4>)
('blue', <Color.blue: 5>)
('indigo', <Color.indigo: 6>)
('purple', <Color.purple: 7>)
('dark_red', <Color.red: 1>)
5.枚举的比较
<1>枚举可进行同一性比较 Color.red is Color.red Color.red is not Color.blue
<2>枚举成员可等值比较 Color.blue==Color.red Color.blue!=Color.red
<3>枚举成员不能进行大小比较 但是他们的value值可以比较大小 Color.red<Color.blue错误写法将报错
from enum import Enum
class Color(Enum):
red = 1
orange = 2
yellow = 3
green = 4
blue = 5
indigo = 6
purple = 7
dark_red=1
print(Color.red is Color.red)
print(Color.red is not Color.red)
print(Color.blue == Color.red)
print(Color.blue != Color.red)
print(Color.blue.value > Color.red.value)
执行命令得
True
False
False
True
True
三、文件I/O
打开和关闭文件
1.open()函数
你必须先用Python内置的open()函数打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写。
代码:file object=open(file_name[,access_mode][,buffering])
各个参数的细节如下:
- file_name:file_name变量是一个包含了你要访问的文件名称的字符串值。
- access_mode:access_mode决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。
- buffering:如果buffering的值被设为0,就不会有寄存。如果buffering的值取1,访问文件时会寄存行。如果将buffering的值设为大于1的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。
不同模式打开文件
模式 | 描述 |
---|---|
r | 以只读方式打开文件。文件的指针将会放在文件的开头 。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头 。这是默认模式。一般用于非文本文件如图片等。 |
r+ | 打开一个文件用于读写。 文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 一般用于非文本文件如图片等。 |
w | 打开一个文件只用于写入。如果该文件已存在则将其覆盖。 如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
w+ | 打开一个文件用于读写。如果该文件已存在则将其覆盖。 如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。 如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
2.File对象的属性
一个文件被打开后,你有一个file对象,你可以得到有关该文件的各种信息
以下适合file对象相关的所有属性列表
属性 | 描述 |
---|---|
file.closed | 返回true如果文件已被关闭,否则返回false。 |
file.mode | 返回被打开文件的访问模式。 |
file.name | 返回文件的名称。 |
file.softspace | 如果用print输出后,必须跟一个空格符,则返回false。否则返回true。 |
例如
:
fo=open('foo.txt','a+')
print('文件名:',fo.name)
print('是否已关闭:',fo.closed)
print('访问模式:',fo.mode)
执行命令得
文件名: foo.txt
是否已关闭: False
访问模式: a+
3.close()方法
file对象的close() 方法刷新缓冲区里任何还没写入的信息,并关闭该文件,这之后便不能再进行写入.
当一个文件对象的引用被重新指定给另一个文件时,Python会关闭之前的文件.用close()方法关闭文件是一个很好的习惯
fo=open('foo.txt','a+')
print('文件名:',fo.name)
print('是否已关闭:',fo.closed)
print('访问模式:',fo.mode)
fo.write('123')
fo.close()
print('是否已关闭:',fo.closed)
执行命令得
文件名: foo.txt
是否已关闭: False
访问模式: a+
是否已关闭: True
4.写与读
write()方法
write()方法可将任何字符串写入一个打开的文件.需要重点注意的是,Python字符串可以使二进制的数据,而不仅仅是文字
write() 方法不会在字符串的结尾添加换行符('\n')
fo=open('foo.txt','r')
fo.write('Hello,world\nPython is great')
read()方法
read()方法从一个打开的文件中读取一个字符串.需要重点注意的是,Python字符串可以使二进制数据,而不仅是文字
当文件未关闭时可以连续阅读直到文件末尾
fo=open('foo.txt','r')
str=fo.read(5)
print('读取的内容为:',str)
fo.close()
执行命令得
读取的内容为: Hello
注意:不能边写边读5.文件定位
tell()法法
tell()方法告诉你文件内的当前位置, 换句话说,下一次的读写会发生在文件开头这么多字节之后。
例:使用循环读取文件,将文件每7字节读取一次并且报出当前所在未知直到读取到文件末尾
fo=open('foo.txt','r')
txt=fo.read(5)
print('读取的内容为:',txt)
i=1
while(len(txt)>0):
print('第'+str(i)+'次读取到的数据:',txt,'当前位置:',fo.tell())
i=i+1
txt=fo.read(7)
fo.close()
print('读取完毕')
执行命令得
读取的内容为: Hello
第1次读取到的数据: Hello 当前位置: 5
第2次读取到的数据: ,world
当前位置: 13
第3次读取到的数据: Python 当前位置: 20
第4次读取到的数据: is grea 当前位置: 27
第5次读取到的数据: t 当前位置: 28
读取完毕
seek()方法
seek(offset [,from])方法改变当前文件的位置。
Offset变量表示要移动的字节数。
From变量指定开始移动字节的参考位置。如果from被设为0,这意味着将文件的开头作为移动字节的参考位置。如果设为1,则使用当前的位置作为参考位置。如果它被设为2,那么该文件的末尾将作为参考位置。
例:读取文件时将指针再次重新定位到文件开头第一个字节
fo=open('foo.txt','r')
txt=fo.read(5)
print('读取的内容为:',txt)
position = fo.seek(1, 0)#设置偏移量 括号内第一个字符:偏移几个字节 第二个字符 0,1,2三种选择分别代表开始,当前,结尾
str = fo.read(10)
print("重新读取字符串 : ", str)
fo.close()
print('读取完毕')
执行命令得
读取的内容为: Hello
重新读取字符串 : ello,world
读取完毕
6.重命名和删除文件
Python的os模块提供了帮你执行文件处理操作的方法,比如重命名和删除文件。
要使用这个模块,你必须先导入它,然后才可以调用相关的各种功能。
rename()方法:
rename()方法需要两个参数,当前的文件名和新文件名。
例:将重命名一个已经存在的文件test1.txt。
import os
# 重命名文件test1.txt到test2.txt。
os.rename( "test1.txt", "test2.txt" )
remove()方法
你可以用remove()方法删除文件,需要提供要删除的文件名作为参数。
例:将删除一个已经存在的文件test2.txt。
import os
# 删除一个已经存在的文件test2.txt
os.remove("test2.txt")
7.python里的目录
所有文件都包含在各个不同的目录下,不过Python也能轻松处理。os模块有许多方法能帮你创建,删除和更改目录。
mkdir()方法
可以使用os模块的mkdir()方法在当前目录下创建新的目录们。你需要提供一个包含了要创建的目录名称的参数。
例:将在当前目录下创建一个新目录test。
import os
# 创建目录test
os.mkdir("test"
chdir()方法
可以用chdir()方法来改变当前的目录。chdir()方法需要的一个参数是你想设成当前目录的目录名称。
例:将进入"/python/obj"目录。
import os
# 将当前目录改为"/python/obj"
os.chdir("/python/obj")
getcwd()方法:
getcwd()方法显示当前的工作目录。
例:给出当前目录
import os
# 给出当前的目录
print os.getcwd()
rmdir()方法
rmdir()方法删除目录,目录名称以参数传递。
在删除这个目录之前,它的所有内容应该先被清除。
例:
以下是删除" /python/test"目录的例子。目录的完全合规的名称必须被给出,否则会在当前目录下搜索该目录。
import os
# 删除”/python/test”目录
os.rmdir( "/python/test" )