内容正文:
项目6 搭建自己的模块
项目内容
模拟计算器
获取兔子数列
01
02
项目目标
知识目标
熟悉函数的定义和调用
熟悉函数参数的传递方式
熟悉特殊函数的分类和应用
了解常用的内置函数
会定义并调用函数
会利用函数解决代码复用问题
会利用匿名函数和递归函数解决实际问题
技能目标
3
模拟计算器
01
众所周知,随着程序功能的提升,程序开发的难度在不断升级,程序的复杂度也变得越来越高,如果依旧按照以前的方法编写代码,那么程序代码的可读性和后期的维护管理会给开发人员带来更多的困扰。
为了解决以上问题,提高代码的复用性,更好地组织代码逻辑和结构,我们引入了“函数”,即“模块”。
对于函数,先要清楚什么是函数?如何定义和调用函数?弄清楚这些我们就可以求解问题,完成任务。
函数的概念
函数指被封装起来的、实现某种功能的一段代码。Python安装包、标准库中自带的函数统称为内置函数,用户自己编写的函数称为自定义函数,不管是哪种函数,其调用方式是一样的。
就像一个人站在装满镜子的房间中,看到的影像就是递归的结果。递归只需少量代码就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
函数的定义
Python中使用关键字def定义函数。
def 函数名([参数列表]):
["函数文档字符串"]
函数体
[return语句]
接收传入函数中的数据,可省略
函数的说明信息,可省略
将结果返回给函数调用者
若函数的参数列表为空,这个函数称为无参函数。
函数定义之时可以设置参数列表,以实现更灵活的功能。
def weather():
print("*" * 13)
print("日期:10月7日")
print("温度:14~28℃")
print("空气状况:良")
print("*" * 13)
def modify_weather(today, temp, air_quality):
print("*"*13)
print(f"日期:{today}")
print(f"温度:{temp}")
print(f"空气状况:{air_quality}")
print("*" * 13)
定义好的函数直到被程序调用时才会执行。
函数的调用格式如下:
函数名([参数列表])
例如,调用weather()函数。
weather()
*************
日期:10月7日
温度:14~28℃
空气状况:良
*************
调用modify_weather函数。
modify_weather(‘10月6日', '15~26℃', '优')
*************
日期:10月6日
温度:15~26℃
空气状况:优
*************
实例1:定义一个函数,用于判断输入的年份是否是闰年,具体要求如下:
(1)输出提示信息:请输入一个年份。
(2)输出判断结果:若是闰年,则输出“是闰年”,否则输出“不是闰年”。
def is_leapyear():
year = int(input("请输入一个年份:"))
if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:
print("是闰年")
else:
print("不是闰年")
is_leapyear()
根据题意,利用函数的定义格式定义一个无参函数,将输入的年份放在函数体内,其程序如下:
def is_leapyear(year):
if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:
print("是闰年")
else:
print("不是闰年")
year=int(input('请输入一个年份:'))
is_leapyear(year)
如果将输入的年份作为函数的参数,则可以定义一个有参函数,其代码如下:
函数的参数传递是指将实际参数传递给形式参数的过程。
当调用带有参数的函数时需要传入参数,这个传入的参数称为实际参数。而在定义有参函数时,函数名后面的参数则被称为形式参数。
根据参数传递形式的不同,函数的参数可分为:
位置参数
关键字参数
默认值参数
不定长参数
函数参数的传递
位置参数的传递
调用函数时,解释器会将函数的实际参数按照位置顺序依次传递给形式参数。
def division(num_one, num_two):
print(num_one / num_two)
division(6, 2)
关键字参数的传递
关键字参数是通过“形式参数=实际参数”的格式将实际参数与形式参数相关联,根据形参的名称进行参数传递。
def info(name, age, address):
print(f'姓名:{name}')
print(f'年龄:{age}')
print(f'地址:{address}')
info(name=“李婷婷”, age=21, address=“北京")
默认参数传递
定义函数时若指定形式参数的默认值。调用函数时,若未给默认参数传值:使用参数的默认值;若给默认参数传值:使用实际参数的值;
def connect(ip, port=3306):
print(f"连接地址为:{ip}")
print(f"连接端口号为:{port}")
print("连接成功")
connect('127.0.0.1')
connect(ip='127.0.0.1', port=8080)
实例2:编写函数,计算20×19×18×……×3的结果。
def prot(m,n=3):
pro = 1
for i in range(m,n-1,-1):
pro *= i
return pro
print(prot(m=20))
不定长参数的传递
如果传入函数中的参数的个数不确定,可以使用不定长参数。
不定长参数也称可变参数,此种参数接收参数的数量可以任意改变。
定义格式:
def 函数名([formal_args,] *args, **kwargs):
函数体
[return语句]
*args和**kwargs都是不定长参数,它们可搭配使用,亦可单独使用。
不定长参数*args用于接收不定数量的位置参数,调用函数时传入的所有参数被*args接收后以元组形式保存。
def test(*args):
print(args)
test(1, 2, 3, 'a', 'b', 'c')
(1, 2, 3, 'a', 'b', 'c')
**kwargs用于接收不定数量的关键字参数,调用函数时传入的所有参数被**kwargs接收后以字典形式保存。
def test(**kwargs):
print(kwargs)
test(a=1, b=2, c=3, d=4)
{'c': 3, 'd': 4, 'a': 1, 'b': 2}
实例3:给定一组成绩,求平均成绩。
def average(*a):
sum ,n = 0
for i in a:
sum += i
n=n+1
ave = sum/n
return ave
print(average(98,93,97,88,79,90))
函数的返回值
如果函数体经过处理以后有计算结果,除了直接利用print()函数输出,还可以在函数体中通过return语句返回主调函数。因此,函数中的return语句可以在函数结束时将数据返回程序,同时让程序回到函数被调用的位置继续执行。
def filter_words(words): # 定义过滤敏感词的函数
if '躺平' in words:
new_words=words.replace('躺平','***')
return new_words
>>> result=filter_words('目前情况我们不能躺平!')
>>> print(result)
目前情况我们不能***!
当return语句返回一个值时,会被保存在变量中,当return语句返回多个值时,这些值会被保存在元组中。
变量的作用域
变量的作用域是指变量的作用范围。根据作用范围,Python中的变量分为局部变量与全局变量。
局部变量
局部变量是在函数内定义的变量,只在定义它的函数内生效。
局部变量只能在函数内部使用,不能在函数外部使用。
def use_var():
name = 'python' # 局部变量
print(name) # 函数内访问
use_var()
print(name) # 函数外访问
python
NameError: name 'name' is not defined
全局变量
全局变量是在函数外定义的变量,它在程序中任何位置都可以被访问。
函数中只能访问全局变量,但不能修改全局变量。
count =10 # 全局变量
def use_var():
print(count) # 函数内访问
count=0 # 修改全局变量
use_var()
print(count) # 函数外访问
10
10
若要在函数内部修改全局变量的值,需先在函数内使用关键字“global”进行声明。
count = 10
def use_var():
global count # 声明全局变量
count = 0
use_var()
print(count)
0
全局变量的值变为0。
实例4:冰雹猜想。冰雹猜想是一种数学现象,它的具体内容是以一个正整数n为例,如果n为偶数,就将它变为n/2,若n/2为奇数,则将它乘以3加1,即3n/2+1。不断重复这样的运算,经过有限步后,必然会得到1。根据数学家们的攻关研究表明,所有小于7×1011的自然数都符合这个规律。本实例要求编写代码,计算用户输入的数据按照以上规律经过多少次运算后可以变成1。
# 冰雹猜想
def guess(number):
i = 0 # 统计变换的次数
original_number = number # 记录最初的number
while number != 1:
if number % 2 == 0: # number为偶数
number = number / 2
else: # number为奇数
number = number * 3 + 1
i += 1
print(f"{original_number}经过{i}次变换后回到1")
num = int(input("请输入一个大于1的正整数:"))
guess(num)
任务实践-模拟计算器
计算器极大地提高了人们进行数字计算的效率与准确性,平时的简单计算都离不开计算器。计算器最基本的功能是四则运算。本任务要求编写程序,利用函数实现计算器的四则运算功能。
任务实践-模拟计算器
根据题意,计算器的四则运算功能是指加、减、乘、除,它可实现计算两个数的和、差、积、商。因此,定义一个包含两个参数的函数,分别接收用户输入的任意两个数,而函数主要用来实现这两个数的加、减、乘、除4项运算,具体执行哪种运算需用户输入相应的运算符,然后根据运算符来计算结果即可。
代码如下:
# 模拟计算器
def oper(x, y):
operator = input('请选择要执行的运算:+、-、*、/' + '
')
if operator == "+":
print("计算结果为:", x + y)
elif operator == '-':
print("计算结果为:", x - y)
elif operator == '*':
print("计算结果为:", x * y)
elif operator == '/':
if y == 0:
print('被除数不能为0')
else:
print("计算结果为:", x / y)
a = int(input('请输入第一个数:'))
b = int(input('请输入第二个数:'))
oper(a, b)
根据函数定义和调用方法,程序如下:
$$