Python--(推导、枚举、文件)

一、推导

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"  )


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章