1.递归函数
- 什么叫递归函数
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
- 递归函数的作用
举个例子,计算阶乘n!=1*2*3*...*n
# 解决方法一:
n = 4
result = 1
i = 1
while i <= 4:
result *= i
i += 1
print(result)
# 解决方法二:
def test(n):
if n == 1:
return 1
else:
return n*(test(n-1))
print(test(4))
打印结果都为:24
例子2:斐波拉契数列,该数列中有n个数字
1 1 2 3 5 8
该数列中,从第三个数字开始,数值 = 前一个数字 + 前前一个数字
def numList(a):
arr = []
def getNun(b):
if b < 2:
return 1
else:
return getNun(b-1) + getNun(b-2)
for i in range(0,a):
arr.append(getNun(i))
print(arr)
numList(6)
打印结果为:[1, 1, 2, 3, 5, 8]
2.匿名函数
- 匿名函数
用lambda 关键词能创建小型匿名函数。这种函数得名于省略了用def 声明函数的标准步骤。
lambda 函数的语法只包含一个语句,如下:
lambda [arg1[,arg2,arg3,...argn]]: expression
如下实例:
sum = lambda arg1,arg2:arg1+arg2
print(sum(1,2))
print(sum(2,3))
打印结果就为:3 5
注意:
lambda 函数能接收任何数量的参数但是只能返回一个表达式的值
匿名函数不能直接调用print,因为lambda需要一个表达式
- 应用场合
函数作为参数传递
1.自己定义函数
def fun(a,b,opt):
print("a:",a)
print("b",b)
print("result:",opt(a,b))
fun(1,2,lambda x,y:x+y)
打印结果就为:
a: 1
b 2
result: 3
2.作为内置函数的参数
举例:
student = [{"name":"wangwu","age":"18"},{"name":"zhangshan","age":"19"},{"name":"lisi","age":"20"},]
student.sort(key=lambda x:x["age"])
print(student)
打印结果如下:
[{'name': 'wangwu', 'age': '18'}, {'name': 'zhangshan', 'age': '19'}, {'name': 'lisi', 'age': '20'}]
3.文件的打开和关闭
- 打开文件
在Python 中,使用open函数,可以打开一个已经存在的文件,或者创建一个新的文件:open(文件名,访问模式)
示例如下:
f=open(r'd:\nata\test.txt','w')
访问模式:
- r 以只读方式打开文件(read)。文件的指针将会放在文件的开头。默认模式。
- w 打开一个文件只用于写入(write)。如果该文件已存在则将其覆盖;若文件不存在,创建新文件
- a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建文件并写入。
- rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。默认模式。
- wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖;若文件不存在,创建新文件。
- ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建文件并写入。
- r+ 打开一个文件用于读写。文件指针将会放在文件的开头。文件若不存在,程序会crash。
- w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖;若文件不存在,创建新文件。
- a+ 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建文件用于读写。
- rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
- wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖;若文件不存在,创建新文件。
- ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾
- 关闭文件
close()
示例如下:
# 新建一个文件,文件名为:test.txt
f=open('test.txt','w')
# 关闭这个文件
f.close()
- 文件的读写
1.写数据(write)
使用write()可以完成向文件写入数据
f=open('test.txt','w')
f.write('hello world!')
f.close
# 注意:如果文件不存在那么创建,如果存在那么就先清空,然后写入数据
2.读数据(read)
使用read()可以从文件里读取数据,num表示要从文件里读取数据的长度(单位是字节),如果没有传入num,那么就表示读取文件中的所有数据
f = open('test.txt','r')
content = f.read(1024)
print(content)
print("-"*30)
content = f.read()
print(content)
f.close()
# 注意:如果open 是打开的一个文件,那么就可以不用写打开的模式,即只写open('test.txt'),如果使用读了多次,那么后面读取的数据是从上次读完后的位置开始的
3.读数据(readlines)
就像read没有参数时一样,readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素
f = open('test.txt','r')
c = f.readlines()
print(c)
i = 1
for temp in c:
print("%d:%s"%(i,temp))
i+=1
f.close()
4.读数据(readline)
f = open('test.txt','r')
s = f.readline()
print("1:%s"%s)
s = f.readline()
print("2:%s"%s)
f.close()
- 文件的定位读写
1.获取当前的读写位置 tell
在读文件的过程中 ,如果想知道当前的位置,可以使用tell()来获取
# 打开一个已经存在的文件
f = open("test.txt","r")
str = f.read(3)
print("读取的数据是:",str)
# 查找当前位置
pos = f.tell()
print("当前的位置:",pos)
str = f.read(3)
print("读取的数据是:",str)
# 查找当前位置
pos = f.tell()
print("当前的位置:",pos)
2.定位到某个位置
如果在读写文件的过程中,需要从另外一个位置进行操作的话,可以使用seek(),
seek(offset,from)有2个参数
offset:偏移量
from:方向
0:表示文件的开头
1:表示当前位置
2:表示文件的末尾
# 把位置设置为:从文件开头,偏移5个字节
# 打开一个已有的文件
f = open("test.txt","r")
str = f.read(30)
print("读取的数据是:",str)
# 查找当前位置
pos = f.tell()
print("当前的位置是:",pos)
# 重新设置位置
f.seek(5,0)
# 查找当前位置
pos = f.tell()
print("当前的位置是:",pos)
f.close()
# 打开一个已有的文件
f = open("test.txt","rb")
# 查找当前位置
pos = f.tell()
print("当前的位置是:",pos)
# 重新设置位置
f.seek(-3,2)
# 读取的数据为:文件最后3个字节数据
str = f.read()
print("读取的数据是:",str)
f.close()
- 文件的相关操作
有些时候,需要对文件重新命名、删除等操作,Python的os模块中都有这些功能
import os
Python 编程时,经常和文件、目录打交道,这时就离不开os模块,os模块包含普遍的操作系统功能,与具体的平台无关。以下列举常用的命令:
- 得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd()
- 返回指定目录下的所有文件和目录名:os.listdir()
- 函数用来删除一个文件:os.remove()
- 删除多个目录:os.removedirs(r“c:\python”)
- 检验给出的路径是否是一个文件:os.path.isfile()
- 检验给出的路径是否是一个目录:os.path.isdir()
- 判断是否是绝对路径:os.path.isabs()
- 检验给出的路径是否真地存:os.path.exists()
- 返回一个路径的目录名和文件名:os.path.split()
eg
os.path.split('/home/swaroop/byte/code/poem.txt')
结果:
('/home/swaroop/byte/code', 'poem.txt') - 分离扩展名:os.path.splitext()
- 获取路径名:os.path.dirname()
- 获取文件名:os.path.basename()
- 运行shell命令: os.system()
- 读取和设置环境变量:os.getenv() 与os.putenv()
- 给出当前平台使用的行终止符:os.linesep Windows使用'\r\n',Linux使用'\n'而Mac使用'\r'
- 指示你正在使用的平台:os.name 对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'
- 重命名:os.rename(old, new)
- 创建多级目录:os.makedirs(r“c:\python\test”)
- 创建单个目录:os.mkdir(“test”)
- 获取文件属性:os.stat(file)
- 修改文件权限与时间戳:os.chmod(file)
- 终止当前进程:os.exit()
- 获取文件大小:os.path.getsize(filename)
import os
os.getcwd() # 获取当前工作目录,即当前python脚本工作的目录路径
#os.chdir("dirname") # 改变当前脚本工作目录;相当于shell下cd
os.chdir('c:/')
os.curdir # 返回当前目录: ('.')
os.pardir # 获取当前目录的父目录字符串名:('..')
os.makedirs('dirname1/dirname2') # 可生成多层递归目录
os.removedirs('dirname1') # 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname') # 生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname') # 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir('dirname') # 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove() # 删除一个文件
os.rename("oldname", "newname") # 重命名文件/目录
os.stat('path/filename') # 获取文件/目录信息
os.sep # 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep # 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
os.pathsep # 输出用于分割文件路径的字符串
os.name # 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
os.system("bash command") # 运行shell命令,直接显示
os.environ # 获取系统环境变量
path = 'c:\a\b\c\d\e.txt'
# os.path.abspath(path) #返回path规范化的绝对路径
os.path.split(path) # 将path分割成目录和文件名二元组返回
os.path.dirname(path) # 返回path的目录。其实就是os.path.split(path)的第一个元素
os.path.basename(path) # 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
os.path.exists(path) # 如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path) # 如果path是绝对路径,返回True
os.path.isfile(path) # 如果path是一个存在的文件,返回True。否则返回False
os.path.isdir(path) # 如果path是一个存在的目录,则返回True。否则返回False
# os.path.join(path1[, path2[, ...]]) #将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path) # 返回path所指向的文件或者目录的最后存取时间
os.path.getmtime(path) # 返回path所指向的文件或者目录的最后修改时间