一、文件
文件的打开与关闭
在python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件
open(文件名,访问模式)
示例如下:
f = open('test.txt', 'w')
说明:
访问模式 | 说明 |
---|---|
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
w | 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
w+ | 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
<2>关闭文件
close( )
示例如下:
# 新建一个文件,文件名为:test.txt f = open('test.txt', 'w') # 关闭这个文件 f.close()
文件的读写
<1>写数据(write)
使用write()可以完成向文件写入数据
demo: f = open('test.txt', 'w') f.write('hello world, i am here!') f.close()
<2>读数据(read)
使用read(num)可以从文件中读取数据,num表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,那么就表示读取文件中所有的数据
demo: f = open('test.txt', 'r') content = f.read(5) print(content) print("-"*30) content = f.read() print(content) f.close()
注意:
- 如果open是打开一个文件,那么可以不用谢打开的模式,即只写
open('test.txt')
- 如果使用读了多次,那么后面读取的数据是从上次读完后的位置开始的
<3>读数据(readlines)
就像read没有参数时一样,readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素
#coding=utf-8 f = open('test.txt', 'r') content = f.readlines() print(type(content)) i=1 for temp in content: print("%d:%s"%(i, temp)) i+=1 f.close()
<4>读数据(readline)
一行一行读
#coding=utf-8 f = open('test.txt', 'r') content = f.readline() print("1:%s"%content) content = f.readline() print("2:%s"%content) f.close()
文件的随机读写
<1>获取当前读写的位置
在读写文件的过程中,如果想知道当前的位置,可以使用tell()来获取
# 打开一个已经存在的文件 f = open("test.txt", "r") str = f.read(3) print( "读取的数据是 : ", str) # 查找当前位置 position = f.tell() print "当前文件位置 : ", position str = f.read(3) print( "读取的数据是 : ", str) # 查找当前位置 position = f.tell() print( "当前文件位置 : ", position) f.close()
<2>定位到某个位置
如果在读写文件的过程中,需要从另外一个位置进行操作的话,可以使用seek()
seek(offset, from)有2个参数
- offset:偏移量
- from:方向
- 0:表示文件开头
- 1:表示当前位置
- 2:表示文件末尾
demo:把位置设置为:从文件开头,偏移5个字节
# 打开一个已经存在的文件 f = open("test.txt", "r") str = f.read(30) print( "读取的数据是 : ", str) # 查找当前位置 position = f.tell() print ("当前文件位置 : ", position) # 重新设置位置 f.seek(5,0) # 查找当前位置 position = f.tell() print( "当前文件位置 : ", position) f.close()
demo:把位置设置为:离文件末尾,3字节处
# 打开一个已经存在的文件 f = open("test.txt", "r") # 查找当前位置 position = f.tell() print ("当前文件位置 : ", position) # 重新设置位置 f.seek(-3,2) # 读取到的数据为:文件最后3个字节数据 str = f.read() print ("读取的数据是 : ", str) f.close()
文件的重命名、删除
有些时候,需要对文件进行重命名、删除等一些操作,python的os模块中都有这么功能
<1>文件重命名
os模块中的rename()可以完成对文件的重命名操作
rename(需要修改的文件名, 新的文件名)
import os os.rename("毕业论文.txt", "毕业论文-最终版.txt")
<2>删除文件
os模块中的remove()可以完成对文件的删除操作
remove(待删除的文件名)
import os os.remove("毕业论文.txt")
文件夹的相关操作
实际开发中,有时需要用程序的方式对文件夹进行一定的操作,比如创建、删除等
就像对文件操作需要os模块一样,如果要操作文件夹,同样需要os模块
<1>创建文件夹
import os os.mkdir("张三")
<2>获取当前目录
import os os.getcwd()
<3>改变默认目录
import os os.chdir("../")
<4>获取目录列表
import os os.listdir("./")
<5>删除文件夹
import os os.rmdir("张三")
函数
函数定义和调用
<1>定义函数
定义函数的格式如下:
def 函数名(): 代码
demo:
# 定义一个函数,能够完成打印信息的功能 def printInfo(): print( '------------------------------------') print (' 人生苦短,我用Python') print( '------------------------------------')
<2>调用函数
定义了函数之后,就相当于有了一个具有某些功能的代码,想要让这些代码能够执行,需要调用它
调用函数很简单的,通过 函数名() 即可完成调用
demo:
# 定义完函数后,函数是不会自动执行的,需要调用它才可以 print (Info())
4种函数的类型
函数根据有没有参数,有没有返回值,可以相互组合,一共有4种
- 无参数,无返回值
- 无参数,有返回值
- 有参数,无返回值
- 有参数,有返回值
<1>无参数,无返回值的函数
此类函数,不能接收参数,也没有返回值,一般情况下,打印提示灯类似的功能,使用这类的函数
def printMenu(): print('--------------------------') print(' xx涮涮锅 点菜系统') print('') print(' 1. 羊肉涮涮锅') print(' 2. 牛肉涮涮锅') print(' 3. 猪肉涮涮锅') print('--------------------------')
<2>无参数,有返回值的函数
此类函数,不能接收参数,但是可以返回某个数据,一般情况下,像采集数据,用此类函数
# 获取温度 def getTemperature(): #这里是获取温度的一些处理过程 #为了简单起见,先模拟返回一个数据 return 24 temperature = getTemperature() print('当前的温度为:%d'%temperature)
<3>有参数,无返回值的函数
此类函数,能接收参数,但不可以返回数据,一般情况下,对某些变量设置数据而不需结果时,用此类函数
<4>有参数,有返回值的函数
此类函数,不仅能接收参数,还可以返回某个数据,一般情况下,像数据处理并需要结果的应用,用此类函数
# 计算1~num的累积和 def calculateNum(num): result = 0 i = 1 while i<=num: result = result + i i+=1 return result result = calculateNum(100) print('1~100的累积和为:%d'%result)
函数的嵌套调用
- 一个函数里面又调用了另外一个函数,这就是所谓的函数嵌套调用
- 如果函数A中,调用了另外一个函数B,那么先把函数B中的任务都执行完毕之后才会回到上次 函数A执行的位置
局部变量
- 局部变量,就是在函数内部定义的变量
- 不同的函数,可以定义相同的名字的局部变量,但是各用个的不会产生影响
- 局部变量的作用,为了临时保存数据需要在函数中定义变量来进行存储,这就是它的作用
全局变量
- 在函数外边定义的变量叫做
全局变量
- 全局变量能够在所有的如果一个函数在内部不调用其它的函数,而是自己本身的话,这个函数就是递归函数。函数中进行访问
- 如果在函数中修改全局变量,那么就需要使用
global
进行声明,否则出错 - 如果全局变量的名字和局部变量的名字相同,那么使用的是局部变量的。
- 对于不可变类型的全局变量来说,因其指向的数据不能修改,所以不使用global时无法修改全局变量。
- 对于可变类型的全局变量来说,因其指向的数据可以修改,所以不使用global时也可修改全局变量
递归函数
如果一个函数在内部不调用其它的函数,而是自己本身的话,这个函数就是递归函数。
匿名函数
用lambda关键词能创建小型匿名函数。这种函数得名于省略了用def声明函数的标准步骤。
lambda函数的语法只包含一个语句,如下:
lambda [arg1 [,arg2,.....argn]]:expression
如下实例:
sum = lambda arg1, arg2: arg1 + arg2 #调用sum函数 print "Value of total : ", sum( 10, 20 ) print "Value of total : ", sum( 20, 20 )
以上实例输出结果:
Value of total : 30
Value of total : 40
定义类
定义一个类,格式如下:
class 类名: 方法列表
demo:定义一个Car类
# 定义类 class Car: # 方法 def getCarInfo(self): print('车轮子个数:%d, 颜色%s'%(self.wheelNum, self.color)) def move(self): print("车正在移动...")
- 定义类时有2种:新式类和经典类,上面的Car为经典类,如果是Car(object)则为新式类
- 类名 的命名规则按照"大驼峰"
创建对象
创建对象的格式为:
对象名 = 类名()

__init__()
方法
使用方式
def 类名: #初始化函数,用来完成一些默认的设定 def __init__(): pass
__init__()
方法,在创建一个对象时默认被调用,不需要手动调用__init__(self)
中,默认有1个参数名字为self,如果在创建对象时传递了2个实参,那么__init__(self)
中出了self作为第一个形参外还需要2个形参,例如__init__(self,x,y)
__init__(self)
中的self参数,不需要开发者传递,python解释器会自动把当前的对象引用传递进去
__str__()
方法
class Car: def __init__(self, newWheelNum, newColor): self.wheelNum = newWheelNum self.color = newColor def __str__(self): msg = "嘿。。。我的颜色是" + self.color + "我有" + int(self.wheelNum) + "个轮胎..." return msg def move(self): print('车在跑,目标:夏威夷') BMW = Car(4, "白色") print(BMW)
- 在python中方法名如果是
__xxxx__()
的,那么就有特殊的功能,因此叫做“魔法”方法 - 当使用print输出对象的时候,只要自己定义了
__str__(self)
方法,那么就会打印从在这个方法中return的数据
self
- 所谓的self,可以理解为自己
- 可以把self当做C++中类里面的this指针一样理解,就是对象自身的意思
- 某个对象调用其方法时,python解释器会把这个对象作为第一个参数传递给self,所以开发者只需要传递后面的参数即可
一个飞机大战的雏形(用到了pygame,挺好学的,学累了可以用它弄点自己简单的小游戏。练练Python的基本语法)
1 #coding=utf-8 2 import time 3 import random 4 import pygame 5 from pygame.locals import * 6 7 8 class HeroPlane(object): 9 10 def __init__(self,screen): 11 12 #设置飞机默认的位置 13 self.x = 230 14 self.y = 600 15 16 #设置要显示内容的窗口 17 self.screen = screen 18 19 self.imageName = "./feiji/hero.gif" 20 self.image = pygame.image.load(self.imageName).convert() 21 22 #用来存储英雄飞机发射的所有子弹 23 self.bulletList = [] 24 25 def display(self): 26 #更新飞机的位置 27 self.screen.blit(self.image,(self.x,self.y)) 28 29 #判断一下子弹的位置是否越界,如果是,那么就要删除这颗子弹 30 # 31 #这种方法会漏掉很多需要删除的数据 32 # for i in self.bulletList: 33 # if i.y<0: 34 # self.bulletList.remove(i) 35 36 #存放需要删除的对象信息 37 needDelItemList = [] 38 39 for i in self.bulletList: 40 if i.judge(): 41 needDelItemList.append(i) 42 43 for i in needDelItemList: 44 self.bulletList.remove(i) 45 46 # del needDelItemList 47 48 #更新及这架飞机发射出的所有子弹的位置 49 for bullet in self.bulletList: 50 bullet.display() 51 bullet.move() 52 53 #修改所有子弹的位置 54 # for bullet in self.bulletList: 55 # bullet.y -= 2 56 57 def moveLeft(self): 58 self.x -= 10 59 60 def moveRight(self): 61 self.x += 10 62 63 def sheBullet(self): 64 newBullet = Bullet(self.x,self.y,self.screen) 65 self.bulletList.append(newBullet) 66 67 class Bullet(object): 68 def __init__(self,x,y,screen): 69 self.x = x+40 70 self.y = y-20 71 self.screen = screen 72 self.image = pygame.image.load("./feiji/bullet-3.gif").convert() 73 74 def move(self): 75 self.y -= 2 76 77 def display(self): 78 self.screen.blit(self.image,(self.x,self.y)) 79 80 def judge(self): 81 if self.y<0: 82 return True 83 else: 84 return False 85 86 class EnemyPlane(object): 87 88 def __init__(self,screen): 89 90 #设置飞机默认的位置 91 self.x = 0 92 self.y = 0 93 94 #设置要显示内容的窗口 95 self.screen = screen 96 97 self.imageName = "./feiji/enemy-1.gif" 98 self.image = pygame.image.load(self.imageName).convert() 99 100 #用来存储敌人飞机发射的所有子弹 101 self.bulletList = [] 102 103 self.direction = "right" 104 105 def display(self): 106 #更新飞机的位置 107 self.screen.blit(self.image,(self.x,self.y)) 108 109 #判断一下子弹的位置是否越界,如果是,那么就要删除这颗子弹 110 # 111 #这种方法会漏掉很多需要删除的数据 112 # for i in self.bulletList: 113 # if i.y<0: 114 # self.bulletList.remove(i) 115 116 #存放需要删除的对象信息 117 needDelItemList = [] 118 119 for i in self.bulletList: 120 if i.judge(): 121 needDelItemList.append(i) 122 for i in needDelItemList: 123 self.bulletList.remove(i) 124 125 # del needDelItemList 126 127 #更新及这架飞机发射出的所有子弹的位置 128 for bullet in self.bulletList: 129 bullet.display() 130 bullet.move() 131 132 133 def move(self): 134 135 #如果碰到了右边的边界,那么就往左走,如果碰到了左边的边界,那么就往右走 136 if self.direction == "right": 137 self.x += 2 138 elif self.direction == "left": 139 self.x -= 2 140 141 if self.x>480-50: 142 self.direction = "left" 143 elif self.x<0: 144 self.direction = "right" 145 146 def sheBullet(self): 147 num = random.randint(1,100) 148 if num == 88: 149 newBullet = EnemyBullet(self.x,self.y,self.screen) 150 self.bulletList.append(newBullet) 151 152 class EnemyBullet(object): 153 def __init__(self,x,y,screen): 154 self.x = x+30 155 self.y = y+30 156 self.screen = screen 157 self.image = pygame.image.load("./feiji/bullet-1.gif").convert() 158 159 def move(self): 160 self.y += 2 161 162 def display(self): 163 self.screen.blit(self.image,(self.x,self.y)) 164 165 def judge(self): 166 if self.y>890: 167 return True 168 else: 169 return False 170 171 172 if __name__ == "__main__": 173 174 #1. 创建一个窗口,用来显示内容 175 screen = pygame.display.set_mode((480,890),0,32) 176 177 #2. 创建一个和窗口大小的图片,用来充当背景 178 background = pygame.image.load("./feiji/background.png").convert() 179 180 #3. 创建一个飞机对象 181 heroPlane = HeroPlane(screen) 182 183 #4. 创建一个敌人飞机 184 enemyPlane = EnemyPlane(screen) 185 186 #3. 把背景图片放到窗口中显示 187 while True: 188 screen.blit(background,(0,0)) 189 190 heroPlane.display() 191 192 enemyPlane.move() 193 enemyPlane.sheBullet() 194 enemyPlane.display() 195 196 #判断是否是点击了退出按钮 197 for event in pygame.event.get(): 198 # print(event.type) 199 if event.type == QUIT: 200 print("exit") 201 exit() 202 elif event.type == KEYDOWN: 203 if event.key == K_a or event.key == K_LEFT: 204 print('left') 205 heroPlane.moveLeft() 206 #控制飞机让其向左移动 207 elif event.key == K_d or event.key == K_RIGHT: 208 print('right') 209 heroPlane.moveRight() 210 elif event.key == K_SPACE: 211 print("space") 212 heroPlane.sheBullet() 213 214 #通过延时的方式,来降低这个while循环的循环速度,从而降低了cpu占用率 215 time.sleep(0.01) 216 217 pygame.display.update()