由若干语句组成的语句块、函数名称、参数列表构成,具有独立功能的代码块称为函数
在结构化编程中,函数是对代码的最基本的封装,一般都是按照功能来封装,封装是为了可以开发程序可以重复使用,减少相同功能代码的冗余,提高编写代码的效率,代码更加简洁,可读性强。
def 函数名():
代码块
定义了函数之后,就相当于有了一个具有某些功能的代码,想要让这些代码能够执行,需要调用它,调用函数很简单的,通过 函数名() 即可完成调用
# 定义完函数后,函数是不会自动执行的,需要调用它才可以
函数名()
代码实例:
# 函数的定义
def printof():
print("---------------------")
print("人生苦短,我要学Python")
print("---------------------")
# 函数的调用
printof()
# 定义
def 函数名(参数1,参数2):
代码块
# 调用
函数名(参数1,参数2)
代码示例:
# 有参函数的定义
def add(a,b):
c = a + b
print(c)
# 调用有参函数
add(3, 5)
解决了如何将值传入函数中,但如何获得函数计算出来的结果呢,想要在函数把结果返回给调用者,需要在函数中使用return
代码示例:
# 有参函数的定义,并返回结果给调用者
def add(a,b):
c = a + b
return c
# 调用有参函数并获取结果
# 方式一:
print(add(3, 5))
# 方式二:
#调用函数,顺便保存函数的返回值
result = add(3,5)
#因为result已经保存了add的返回值,所以接下来就可以使用了
print(result)
可以,对于大多数语言,比如java,C++语言,是不可以,但Python可以
代码示例:
def add(a,b):
c = a + b
d = a*b
return c,d
c,d = add(3, 5)
print(a,b)
def 函数名():
执行语句
def 函数名():
执行语句
return 需要返回的数值
注意:
iii.有参无返回值
def 函数名(形参列表):
执行语句
注意:
在调用函数时,如果需要把一些数据一起传递过去,被调用函数就需要用参数来接收
参数列表中变量的个数根据实际传递的数据的多少来确定
def 函数名():
执行语句
return 需要返回的值
i.调用函数的方式:
函数名([实参列表])
ii.调用有参函数时,实参的个数和先后顺序应该和定义函数中的要求一致,不可不对等和顺序有变动,否则结果会出问题
iii.调用有返回值的函数,可以用一个变量来保存这个函数的计算结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9AQBVqox-1647784608364)(C:\Users\荔枝\AppData\Roaming\Typora\typora-user-images\image-20220304164056507.png)]
定义在函数内部的变量
def test1():
a = 200 # 局部变量
print("---------test1--修改前--a=%d"%a)
a = 300 # 局部变量可以修改值
print("---------test1--修改后--a=%d"%a)
def test2():
a = 400 # 局部变量,不同函数,局部变量名可以相同,互不影响
print("---------test2--a=%d"%a)
test1()
test2()
运行结果:
---------test1--修改前--a=200
---------test1--修改后--a=300
---------test2--a=400
小总结:
如果一个变量,既能在一个函数中使用,也能在其他的函数中使用,这样的变量就是 全局变量
# 定义一个全局变量
a = 100
# 定义两个函数
def test1():
print(a)
def test2():
print(a)
当全局变量和局部变量同名,如何修改全局变量的值?
代码如下:
# 定义一个全局变量
a = 100
def test1():
a = 200 # 局部变量
print("---------test1--修改前--a=%d"%a)
a = 300 # 局部变量可以修改值
print("---------test1--修改后--a=%d"%a)
def test2():
a = 400 # 局部变量
print("---------test2--a=%d"%a)
test1()
test2()
运行结果:
---------test1--修改前--a=200
---------test1--修改后--a=300
---------test2--a=400
和局部变量中的示例结果一样
修改全局变量方法:使用global
在变量名前进行声明
代码如下:
# 定义一个全局变量
a = 100
def test1():
global a #变量名a被global修饰之后,就变成了全局变量
a = 600 # 修改全局变量的值
print("---------test1--修改全局变量值后--a=%d"%a)
a = 300 # 局部变量变为全局变量,再次修改了全局变量的值
print("---------test1--全局变量--a=%d"%a)
def test2():
a = 400 # 局部变量不变
print("---------test2--局部变量a=%d"%a)
def test3():
print('---全局变量---a=%d'%a)
test1()
test2()
test3()
运行结果:
---------test1--修改全局变量值后--a=600
---------test1--全局变量--a=300
---------test2--a=400
---全局变量---a=300
小总结:
就近原则
**1.在一个函数中定义的变量,只能在本函数中用(局部变量)
2.在函数外定义的变量,可以在所有的函数中使用(全局变量)
在Python,使用open()函数,可以打开一个已经存在的文件或者创建一个新文件
语法格式:
open(文件名,访问模式)
访问模式是对文件的权限,是否可读,是否可写,具体如下:
访问模式 | 说明 |
---|---|
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式 |
w | 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头 |
w+ | 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写 |
代码示例:
f = open("test.txt",'w') # 打开文件,没有则新建,w是代表可对文件写入内容
注意:文件默认会新建并保留在当前项目文件目录下。
在Python,使用close()函数,可以关闭一个已经打开的文件
代码示例:
# 新建一个文件,文件名为:test.txt
f = open('test.txt', 'w')
# 关闭这个文件
f.close()
1234
在python中,使用write()可以完成向文件写入数据
代码示例:
f = open('test.txt', 'w')
f.write('hello world, i am here!')
f.close()
注意:如果文件不存在那么创建,如果存在那么就先清空,然后写入数据
在python中,使用read(number)函数以完成从文件中读取数据number表示要从文件中读取的数据的长度(单位是字节),如果没有传入number,那么就表示读取文件中所有的数据.
代码示例:
f = open('test.txt', 'r')
content = f.read(5)
print(content)
print("-"*30)
content = f.read()
print(content)
f.close()
注意:
如果open是打开一个文件,那么可以不用写打开的模式,即只写 open(‘test.txt’),默认是只读。
如果使用读了多次,那么后面读取的数据是从上次读完后的位置开始的。
一次性读取一行数据
代码示例:
file = open("test.txt","r")
content = file.readline() # 对文件读取一行
print(content)
content = file.readline() # 对文件读取下一行
print(content)
file.close()
按照行的方式把整个文件中的内容进行一次性读取,并且返回一个列表,其中每一行的数据为一个元素
#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()
对于文件操作看不懂的,请先学习Linux基础知识,[https://blog.csdn.net/QZP51ZX/article/details/108047995]
os模块中的rename()可以完成对文件的重命名操作
os.rename(需要修改的文件名, 新的文件名)
代码示例:
import os
os.rename("test.txt","test01.txt")
注意:需要修改的文件名一定要存在,否则报错!
os模块中的remove()可以完成对文件的删除操作,看清路径 ,不要误删。
remove(待删除的文件名)
代码示例:
import os
os.remove("test01.txt")
注意:需要删除的文件一定要存在,否则报错!
os模块中的mkdir()可以完成创建文件夹操作
mkdir(待创建的文件夹)
代码示例:
import os
os.mkdir('python')
注意:创建文件夹一定要保证之前不存在,否则报错!
os模块中的getcwd()可以查看文件所在的具体位置
getcwd()
代码示例:
import os
os.getcwd()
os模块中的chair()可以改变当前的所在路径
代码示例:
import os
os.chair("../") # 返回上一级目录
os模块中的listdir()可以查看当前目录列表
代码示例:
import os
os.listdir("./") # 查看当前目录的所有文件
os模块中的rmdir()删除指定文件夹
代码示例:
import os
os.rmdir("python")
注意:需要删除的文件夹一定要存在,否则报错!
异常是什么?什么时候会发生异常?话不多说,直接上代码。
当打开一个不存在的文件时,对文件操作比较熟悉就知道,一定会报错,不信的话,咱们试试?
print("----test1------")
f = open("123.txt","r") # 打开123.txt文件
print("----test2--------")
运行结果:
----test1------
Traceback (most recent call last):
File "F:/pythonProject/pythonProject/demo3-4.py", line 8, in <module>
f = open("123.txt","r")
FileNotFoundError: [Errno 2] No such file or directory: '123.txt'
说明:
打开一个不存在的文件123.txt,当找不到123.txt 文件时,就会抛出给我们一个IOError类型的错误,No such file or directory:123.txt (没有123.txt这样的文件或目录)
当Python检测到一个错误时,解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的"异常"
代码示例:
try:
print("----test1------")
f = open("123.txt", "r")
print("----test2--------")
except IOError:
pass
123456
运行结果:
----test1------
说明:
当出现多个异常时:
代码示例:
try:
print("----test1------")
f = open("123.txt", "r")
print("----test2--------")
print(num)
except (IOError,NameError): #捕获多个异常的写法
print("产生了异常")
代码示例:
try:
print("----test1------")
f = open("123.txt", "r")
print("----test2--------")
print(num)
except (IOError,NameError) as result: #捕获多个异常的写法,将异常信息存储在result中进行打印
print("产生了异常")
print(result)
在程序中,如果一个段代码必须要执行,即无论异常是否产生都要执行,那么此时就需要使用finally。 比如文件关闭,释放锁,把数据库连接返还给连接池等
代码示例:
import time
try:
f = open('test.txt')
try:
while True:
content = f.readline()
if len(content) == 0:
break
time.sleep(2)
print(content)
except:
#如果在读取文件的过程中,产生了异常,那么就会捕获到
#比如 按下了 ctrl+c
pass
finally:
f.close()
print('关闭文件')
except Exception as result:
print("发生异常")