[转载]python之函数的使用及异常处理2021.1.30

python之函数的使用

⼀. 函数的作⽤

函数就是将⼀段具有独⽴功能的代码块 整合到⼀个整体并命名,在需要的位置调⽤这个名称即可完成对应的需求。
函数在开发过程中,可以更⾼效的实现代码重⽤。

⼆. 函数的使⽤步骤

2.1 定义函数

def 函数名(参数):
 代码1
 代码2
 ......

2.2 调⽤函数

函数名(参数)
注意:
1. 不同的需求,参数可有可⽆。
2. 在Python中,函数必须先定义后使⽤。

2.3 快速体验

需求:复现ATM取钱功能。
1. 搭建整体框架(复现需求)
print('密码正确登录成功')
# 显示"选择功能"界⾯
print('查询余额完毕')
# 显示"选择功能"界⾯
print('取了2000元钱')
# 显示"选择功能"界⾯
2. 确定“选择功能”界⾯内容
print('查询余额')
print('存款')
print('取款')
3. 封装"选择功能"
注意:⼀定是先定义函数,后调⽤函数。
复制代码
# 封装ATM机功能选项 -- 定义函数
def select_func():
 print('-----请选择功能-----')
 print('查询余额')
 print('存款')
 print('取款')
 print('-----请选择功能-----')
复制代码

 4. 调⽤函数

在需要显示“选择功能”函数的位置调⽤函数。
复制代码
print('密码正确登录成功')
# 显示"选择功能"界⾯ -- 调⽤函数
select_func()
print('查询余额完毕')
# 显示"选择功能"界⾯ -- 调⽤函数
select_func()
print('取了2000元钱')
# 显示"选择功能"界⾯ -- 调⽤函数
select_func()
复制代码

三.函数的参数作⽤

思考:完成需求如下:⼀个函数完成两个数1和2的加法运算,如何书写程序?
# 定义函数
def add_num1():
 result = 1 + 2
 print(result)
# 调⽤函数
add_num1()
思考:上述add_num1函数只能完成数字1和2的加法运算,如果想要这个函数变得更灵活,可以计算任何⽤户指定的两个数字的和,如何书写程序?
分析:⽤户要在调⽤函数的时候指定具体数字,那么在定义函数的时候就需要接收⽤户指定的数字。函数调⽤时候指定的数字和定义函数时候接收的数字即是函数的参数。
# 定义函数时同时定义了接收⽤户数据的参数a和b,a和b是形参
def add_num2(a, b):
 result = a + b
 print(result)
# 调⽤函数时传⼊了真实的数据10 和 20,真实数据为实参
add_num2(10, 20)

 四.函数的返回值作⽤

例如:我们去超市购物,⽐如买烟,给钱之后,是不是售货员会返回给我们烟这个商品,在函数中,如果需要返回结果给⽤户需要使⽤函数返回值。
def buy():
 return '烟'
# 使⽤变量保存函数返回值
goods = buy()
print(goods)
4.1 应⽤
需求:制作⼀个计算器,计算任意两数字之和,并保存结果。
def sum_num(a, b):
 return a + b
# ⽤result变量保存函数返回值
result = sum_num(1, 2)
print(result)

五.函数的说明⽂档

思考:定义⼀个函数后,程序员如何书写程序能够快速提示这个函数的作⽤?
答:注释
思考:如果代码多,我们是不是需要在很多代码中找到这个函数定义的位置才能看到注释?如果想更⽅便的查看函数的作⽤怎么办?
答:函数的说明⽂档
函数的说明⽂档也叫函数的⽂档说明。

5.1 语法

定义函数的说明⽂档
def 函数名(参数):
 """ 说明⽂档的位置 """
 代码
 ......
查看函数的说明⽂档
help(函数名)
5.2 快速体验
def sum_num(a, b):
 """ 求和函数 """
 return a + b
help(sum_num)

六.函数嵌套调⽤

所谓函数嵌套调⽤指的是⼀个函数⾥⾯⼜调⽤了另外⼀个函数。
  • 示例
复制代码
def testB():
 print('---- testB start----')
 print('这⾥是testB函数执⾏的代码...(省略)...')
 print('---- testB end----')
def testA():
 print('---- testA start----')
 testB()
 print('---- testA end----')
testA()
复制代码
  • 执⾏流程

如果函数A中,调⽤了另外⼀个函数B,那么先把函数B中的任务都执⾏完毕之后才会回到上次 函数A执⾏的位置。

七. 变量作⽤域

变量作⽤域指的是变量⽣效的范围,主要分为两类:局部变量和全局变量。
  • 局部变量
所谓局部变量是定义在函数体内部的变量,即只在函数体内部⽣效。
def testA():
 a = 100
 print(a)
testA() # 100
print(a) # 报错:name 'a' is not defined
变量a是定义在 testA 函数内部的变量,在函数外部访问则⽴即报错。
局部变量的作⽤:在函数体内部,临时保存数据,即当函数调⽤完成后,则销毁局部变量。
  • 全局变量
所谓全局变量,指的是在函数体内、外都能⽣效的变量。
思考:如果有⼀个数据,在函数A和函数B中都要使⽤,该怎么办?
答:将这个数据存储在⼀个全局变量⾥⾯。
复制代码
# 定义全局变量a 
a = 100

def testA():
 print(a) # 访问全局变量a,并打印变量a存储的数据

def testB():
 print(a) # 访问全局变量a,并打印变量a存储的数据

testA() # 100
testB() # 100
复制代码

 思考: testB 函数需求修改变量a的值为200,如何修改程序?

复制代码
a = 100
def testA(): print(a)
def testB(): a = 200 print(a)
testA() # 100 testB() # 200 print(f'全局变量a = {a}') # 全局变量a = 100
复制代码
思考:在 testB 函数内部的 a = 200 中的变量a是在修改全局变量 a 吗?
答:不是。观察上述代码发现,15⾏得到a的数据是100,仍然是定义全局变量a时候的值,⽽没有返回testB 函数内部的200。综上: testB 函数内部的 a = 200 是定义了⼀个局部变量。
思考:如何在函数体内部修改全局变量?
复制代码
a = 100

def testA():
 print(a)

def testB():
 # global 关键字声明a是全局变量
 global a
 a = 200
 print(a)
testA() # 100 testB() # 200 print(f'全局变量a = {a}') # 全局变量a = 200
复制代码

八. 多函数程序执⾏流程

⼀般在实际开发过程中,⼀个程序往往由多个函数(后⾯知识中会讲解类)组成,并且多个函数共享某些数据,如下所示:
  • 共⽤全局变量
复制代码
# 1. 定义全局变量
glo_num = 0
def test1(): global glo_num # 修改全局变量 glo_num = 100
def test2(): # 调⽤test1函数中修改后的全局变量 print(glo_num) # 2. 调⽤test1函数,执⾏函数内部代码:声明和修改全局变量 test1()
# 3. 调⽤test2函数,执⾏函数内部代码:打印 test2() # 100
复制代码
  • 返回值作为参数传递
复制代码
def test1():
 return 50
def test2(num): print(num)
# 1. 保存函数test1的返回值 result = test1()
# 2.将函数返回值所在变量作为参数传递到test2函数 test2(result) # 50
复制代码

九. 函数的返回值

思考:如果⼀个函数如些两个return (如下所示),程序如何执⾏?
复制代码
def return_num():
 return 1
 return 2

result = return_num() print(result) # 1
复制代码
答:只执⾏了第⼀个return,原因是因为return可以退出当前函数,导致return下⽅的代码不执⾏。
思考:如果⼀个函数要有多个返回值,该如何书写代码?
def return_num():
 return 1, 2

result = return_num() print(result) # (1, 2)
注意:
1. return a, b 写法,返回多个数据的时候,默认是元组类型。
2. return后⾯可以连接列表、元组或字典,以返回多个值。

十. 函数的参数

10.1 位置参数

位置参数:调⽤函数时根据函数定义的参数位置来传递参数。
def user_info(name, age, gender):
 print(f'您的名字是{name}, 年龄是{age}, 性别是{gender}')
user_info('TOM', 20, '男')
注意:传递和定义参数的顺序及个数必须⼀致。

10.2 关键字参数

函数调⽤,通过“键=值”形式加以指定。可以让函数更加清晰、容易使⽤,同时也清除了参数的顺序需求。
def user_info(name, age, gender):
 print(f'您的名字是{name}, 年龄是{age}, 性别是{gender}')
user_info('Rose', age=20, gender='⼥') user_info('⼩明', gender='男', age=16)
注意:函数调⽤时,如果有位置参数时,位置参数必须在关键字参数的前⾯,但关键字参数之间不存在
先后顺序。

10.3 缺省参数

缺省参数也叫默认参数,⽤于定义函数,为参数提供默认值,调⽤函数时可不传该默认参数的值(注意:所有位置参数必须出现在默认参数前,包括函数定义和调⽤)。
def user_info(name, age, gender='男'):
 print(f'您的名字是{name}, 年龄是{age}, 性别是{gender}')
user_info('TOM', 20) user_info('Rose', 18, '⼥')】
注意:函数调⽤时,如果为缺省参数传值则修改默认参数值;否则使⽤这个默认值。

十一. 函数应⽤

11.1 打印图形

1. 打印⼀条横线
def print_line():
 print('-' * 20)
print_line()
2. 打印多条横线
复制代码
def print_line():
 print('-' * 20)
def print_lines(num):
 i = 0
 while i < num:
 print_line()
 i += 1
print_lines(5)
复制代码

11.2 函数计算

1. 求三个数之和
def sum_num(a, b, c):
 return a + b + c
result = sum_num(1, 2, 3)
print(result) # 6

2. 求三个数平均值

def average_num(a, b, c):
 sumResult = sum_num(a, b, c)
 return sumResult / 3
result = average_num(1, 2, 3)
print(result) # 2.0

python之异常处理

⼀. 了解异常

当检测到⼀个错误时,解释器就⽆法继续执⾏了,反⽽出现了⼀些错误的提示,这就是所谓的"异常"。
例如:以 r ⽅式打开⼀个不存在的⽂件。
open('test.txt', 'r')

⼆. 异常的写法

2.1 语法

try:
 可能发⽣错误的代码
except:
 如果出现异常执⾏的代码

2.2 快速体验

需求:尝试以 r 模式打开⽂件,如果⽂件不存在,则以 w ⽅式打开。
try:
 f = open('test.txt', 'r')
except:
 f = open('test.txt', 'w')

2.3 捕获指定异常

2.3.1 语法
try:
 可能发⽣错误的代码
except 异常类型:
 如果捕获到该异常类型执⾏的代码
2.3.2 体验
try:
 print(num)
except NameError:
 print('有错误')
注意:
1. 如果尝试执⾏的代码的异常类型和要捕获的异常类型不⼀致,则⽆法捕获异常。
2. ⼀般try下⽅只放⼀⾏尝试执⾏的代码。
2.3.3 捕获多个指定异常
当捕获多个异常时,可以把要捕获的异常类型的名字,放到except 后,并使⽤元组的⽅式进⾏书写。
try:
 print(1/0)
except (NameError, ZeroDivisionError):
 print('有错误')
2.3.4 捕获异常描述信息
try:
 print(num)
except (NameError, ZeroDivisionError) as result:
 print(result)
2.3.5 捕获所有异常
Exception是所有程序异常类的⽗类。
try:
 print(num)
except Exception as result:
 print(result)

2.4 异常的else

else表示的是如果没有异常要执⾏的代码。
try:
 print(1)
except Exception as result:
 print(result)
else:
 print('我是else,是没有异常的时候执⾏的代码')

2.5 异常的finally

fifinally表示的是⽆论是否异常都要执⾏的代码,例如关闭⽂件。
复制代码
try:
 f = open('test.txt', 'r')
except Exception as result:
 f = open('test.txt', 'w')
else:
 print('没有异常,真开⼼')
finally:
 f.close()
复制代码

三. 异常的传递

体验异常传递
需求:
1. 尝试只读⽅式打开test.txt⽂件,如果⽂件存在则读取⽂件内容,⽂件不存在则提示⽤户即可。
2. 读取内容要求:尝试循环读取内容,读取过程中如果检测到⽤户意外终⽌程序,则 except 捕获异常并提示⽤户。
复制代码
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
     print('意外终⽌了读取数据')
 finally:
     f.close()
     print('关闭⽂件')
except:
 print("没有这个⽂件")        
复制代码

 四. ⾃定义异常(拓展)

在Python中,抛出⾃定义异常的语法为 raise 异常类对象 。
需求:密码⻓度不⾜,则报异常(⽤户输⼊密码,如果输⼊的⻓度不⾜3位,则报错,即抛出⾃定义异常,并捕获该异常)。
复制代码
# ⾃定义异常类,继承Exception
class ShortInputError(Exception):
 def __init__(self, length, min_len):
     self.length = length
     self.min_len = min_len
 # 设置抛出异常的描述信息
 def __str__(self):
     return f'你输⼊的⻓度是{self.length}, 不能少于{self.min_len}个字符'

def main():
 try:
     con = input('请输⼊密码:')
     if len(con) < 3:
         raise ShortInputError(len(con), 3)
 except Exception as result:
     print(result)
 else:
     print('密码已经输⼊完成')
main()
复制代码
作者:拾瑾
个性签名:愿历经千帆,归来仍少年.
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
原文地址:https://www.cnblogs.com/ayoung/p/14351582.html