十、函数
本章内容运行环境:
Jupyter Notebook
本单元视频链接:
10.1 定义函数
定义一个函数要使用def
语句,参数
不是必须的
# def 函数名(参数):
def my_abs(x):
函数体
在函数名
下方,需要缩进。这里定义一个判断绝对值的函数my_abs
。
def my_abs(x):
if x >= 0:
return x
else:
return -x
空函数
如果想定义一个什么事也不做的空函数,可以用pass
语句:
def my_abs(x):
pass
pass
语句什么都不做,那有什么用?
pass
可以用来作为占位符,比如现在还没想好怎么写函数的代码,就可以先放一个pass
,让代码能运行起来。
10.2 调用函数
# 函数名(参数)
my_abs(2)
注意: 刚刚的代码是在调试窗口写的,所以可以直接输出结果
当你在文档中写代码,并且你需要屏幕上输出结果,你需要加Print
,或者你在调试窗口调用它
调用函数的时候,参数也不是必须的,比如你可以直接my_abs()
,这时候,我们就需要函数设定一个默认参数。
10.3 参数
默认参数
- 函数的参数可以有一个默认值
- 默认参数以赋值语句的形式提供
- 函数调用时如果没有提供这个参数, 它就取这个值做为默认值
刚刚定义过的my_abs
函数,我们重新修改一下
def my_abs(x=3):
if x >= 0:
return x
else:
return -x
如果调用函数的时候,没有输入任何参数,那默认x就是3
如果输入了参数,那以输入的参数为准,忽略默认值
10.4 传递参数
位置参数
- 一个函数可以有多个参数,各个参数用逗号隔开
- 在定义函数时有N个参数,在调用时,也需要提供N个参数
举例,我们定义一个求最大值的参数
def my_max(number1, number2):
if number1 > number2:
print(number1 )
else:
print(number2)
在这个例子中,我们看到,输入的参数,默认第一个就是number1
,第二个就是number2
,这是位置参数
关键字参数
比如我函数里面,定义了10个参数,那每次必须都要按照位置写,挺容易搞错的。这时候,我们可以用关键字参数。
举个列子,输出我的名字和爱好
def my_hobby(name, hobby):
print(name+"喜欢"+hobby)
可以看到,没有指定关键词的时候,默认就是按照位置来选择参数(看第二行的输出)
如果我们指定name
是YangYang
,那么就是按照指定的关键字来对应参数
my_hobby("YangYang","Python")
# 输出:YangYang喜欢Python
my_hobby("Python","YangYang")
# 输出:Python喜欢YangYang
my_hobby(hobby="Python",name="YangYang")
# 输出:YangYang喜欢Python
10.5 返回
def my_max(number1, number2):
if number1 > number2:
return number1
else:
return number2
在我们刚刚的代码中,已经看到,用return
返回我们要的值
return
后面可以直接加计算
def my_add(number1, number2):
return number1+number2
my_add(3,4)
# 输出:7
多值返回
我们可以一口气返回很多个值
def my_cal(number1, number2):
my_add = number1+number2 # 加法
my_minus = number1-number2 # 减法
return my_add,my_minus
my_cal(5,3)
# 输出:(8, 2)
10.6 作用域
最后,我们讲一下全局作用域和局部作用域
简单来说,定义在函数内部的,就是局部作用域
- 全局变量,在函数的外面,在整个代码中都有作用
- 局部变量,在函数的里面,只在局部作用域有作用
- 在函数内部,你可以调用全局变量
- 在函数外部,你无法使用局部变量
global_str = 'foo'
def foo():
local_str = 'bar'
return global_str + local_str
global_str
是一个全局变量
local_str
是一个局部变量
来个例子
a = 2
def my_cal():
a = 3
print(a)
# 输出:2
- 在函数外部,我定义了一个全局变量
a
,a
的值是2 - 在函数内部,我定义了一个局部变量
a
,a
的值是3
我在函数外,输出a
,a
的值还是2。所以,函数内的操作,和全局变量没关系。那我在函数内定义这个a
,有什么用?
a = 2
def my_cal():
a = 3
print(a)
my_cal() #调用函数
# 输出:3
在这个函数内部,值确实变成3了。当我调用这个函数的时候,内部的值发生了变化
最后,就记住:
局部变量,只能用在函数里面,在函数里面,是有作用的
但是到了函数外面,局部变量就没作用了,只看全局变量
怎么判断是不是在函数里面?
看缩进。缩进很重要。
缩进的位置相同,代表它们是一个等级的
10.7 传递任意数量的参数
*args
传入0个或任意个参数,*args
表示任意个无名参数,类型为 tuple
def function(a,*args):
pass
举个例子
def number(*num):
print(num)
number(1,2,3)
number(1,2,3,4,5,6)
# 输出:
# (1, 2, 3)
# (1, 2, 3, 4, 5, 6)
**kwargs
**kwargs
表示关键字参数,类型为 dict
任意数量的参数可以和位置参数,或者关键词参数结合起来
比如统计班级学生的情况,有两个信息是必须要知道的,姓名和年龄,其他信息,可以由学生自己填写
def build_student(name,age,**other):
student = {}
student['name'] = name
student['age'] = age
for key,value in other.items():
student[key] = value
return student
print(build_student('yangyang', 18, hobby='Python'))
print(build_student('york', 20, hobby='Study', like='Wife'))
# 输出:
# {'name': 'yangyang', 'age': 18, 'hobby': 'Python'}
# {'name': 'york', 'age': 20, 'hobby': 'Study', 'like': 'Wife'}
10.8 内置函数
根据官网内容整理
https://docs.python.org/zh-cn/3.7/library/functions.html#any
Python 解释器内置了很多函数和类型,您可以在任何时候使用它们。以下按字母表顺序列出它们。
10.9 实践
【小练习】
定义一个除法函数,如果除数为0,输出“0不能作除数!”
回顾一下try
和 except
判断,帮助检查代码中可能存在的错误
计算机会先执行 try
条件下的语句,一旦出现例外情况,比如错误 NameError 或者 ValueError,计算机会终止执行 try
条件下的语句,并且当该例外情况满足 except
中指定的条件,计算机会执行except
中的语句。
def divide_num(num1,num2):
try:
result = num1 / num2
print (result)
except ZeroDivisionError:
print ("0不能作除数!")
其他小练习,可点击:Python:小练习
【实践】
用函数,重写【第九章】的实践题
比如:我可以构建一个函数bdc
,计算大家背单词的情况
def bdc(LearningData,days):
------
return bdc_num,bdc_used_time
完整代码
import requests # 导入requests模块
IDs = ['49793185','60782137','210260232','40793353','41273824','64839964','66470683','37166209',
'58575787','2492821'] # 扇贝ID
def bdc(LearningData,days):
bdc_num = 0
bdc_used_time = 0
for day in range(days):
LearningDataDaily = LearningData['data'][day]
checkin_date = LearningDataDaily['checkin_date']
try:
bdc_num += LearningDataDaily['stats']['bdc']['num_today']
bdc_used_time += LearningDataDaily['stats']['bdc']['used_time']
except:
bdc_num += 0
bdc_used_time += 0.0
return bdc_num,bdc_used_time
for ID in IDs:
web = "https://www.shanbay.com/api/v1/checkin/user/"+str(ID)+"/" # 网址:打卡记录
res = requests.get(web) # requests发起请求,静态网页用get
LearningData = res.json() # LearningData就是字典格式
NickName = LearningData['data'][0]['user']['nickname'] # 获取昵称
days = 8
bdc_num,bdc_used_time = bdc(LearningData,days)
if bdc_num > 60:
print("最近{}天,{}背单词{}个,用时{}分钟,学习认真".format(days,NickName,bdc_num,bdc_used_time))
else:
print("最近{}天,{}背单词{}个,用时{}分钟,需要继续努力呀".format(days, NickName,bdc_num,bdc_used_time))