函数
有时候,我们还要给 一件事情,一串动作起名字,指代 某个流程。
定义一个名字 对应多个语句操作, 称之为定义函数
所以:定义函数 就好像是给 一段代码 起了个名字
Python中,我们是这样定义函数的:
def interview():
print("把求职者带到3号会议室")
print("请求职者 完成答卷")
print("让测试经理来面试 求职者")
print("让技术总监面试 求职者")
def 是关键字 表示定义一个函数
后面是函数的名字,紧接着后面需要一个括号 ,这个括号中间,根据需要还可以有 参数,这里我们先不讲它
最后是一个冒号,下面的缩进的代码表示这个函数名字代表的具体动作是什么,称之为函数体。
函数体的代码是需要缩进的。我们建议缩进四个空格。
这样定义好了以后,后面的代码要指代这个面试的流程,只需要写名字 interview 就行了。 比如:
print(interview)
<function interview at 0x05292468>
表示这个 interview 是 一个函数类型的对象。
特别要注意的是,解释器执行到 定义函数 的语句时,并不会执行函数体里面的代码。
要执行函数体里面的代码,必须 调用函数。
Python代码怎么调用函数呢?就是在 函数名后面加上括号。
比如,要执行 interview 这个名字代表的动作,就在后面加上括号 interview()
interview() 就叫 调用函数 interview ,有时也叫做 执行函数 interview。
执行函数 interview 的时候,会执行 interview 函数体里面的代码。
当解释器 执行到 这行调用函数的代码时,就会跑到 函数 interview 里面,去执行函数里面的语句。
函数必须先定义,后面才能调用。
调用后返回
注意,当解释器执行完被调用函数内部的代码后,还会 返回 到调用它的代码处,继续执行后面的代码。
内置函数
Python内置了很多函数,可以直接使用。
函数的参数
函数调用括号里面的内容 称之为函数的 参数。
有的函数要完成功能,需要告诉它一些信息。
比如print函数,如果你不告诉它要打印的内容是什么,它怎么能打印信息到屏幕上呢?
参数的作用 就是: 提供 函数完成功能 所必须的信息
有参数的函数像这样
def func(para1,para2):
...
函数的参数都是放在函数定义的括号里面的。
比如上面示例代码中的 para1,para2
参数其实也是一个变量,所以他们的命名规则和变量的命名规则一样。
参数可以没有,可以是一个,也可以是多个。参数之间用逗号隔开。
调用有参数的函数时,需要传入对应个数的参数。
是一个参数,就传入一个,两个就是传入两个
我们上面interview的例子里面,如果我们要加上显示出面试者的名字,就可以这样
def interview(interviewee):
print("求职者是 " + interviewee)
print("把求职者带到3号会议室")
print("请求职者 完成答卷")
print("让测试经理来面试 求职者")
print("让技术总监面试 求职者")
interview('王小五')
函数的返回值
有的函数执行一个流程就完了,并不需要返回什么信息,比如 print 函数,就是打印一下参数字符串,就完成了它的任务。
但是有的函数,需要返回一个结果给调用者。
比如 计算两个数字平方和的函数,必须要返回一个结果,告诉调用代码,平方和的计算结果。
函数要返回结果,就必须要使用 return 关键字,后面加上返回的结果对象
def squarep(num1,num2):
return num1**2 + num2**2
ret = squarep(1,2)
print(ret)
语句ret = squarep(1,2) 等号右边的 就是函数调用的表达式。
解释器在执行这条语句的时候,会执行squarep函数对应的代码,函数代码最后返回一个平方和的计算结果。
这个计算结果(是一个数字对象) 就被赋值给了变量 ret
所以接下来的语句print(ret),就可以打印出1 和 2 的平方和 计算结果 5
解释器执行代码的时候,一旦执行了函数中的 return 语句,就会立即从函数中返回到调用的地方,该函数下面还有代码,也不会再执行了。
def squarep(num1,num2):
return num1**2 + num2**2
print('这条语句在return后面,不会执行')
ret = squarep(1,2)
print(ret)
如果一个函数定义,里面并没有写return语句,像这样
def func1():
print('你好')
print(func1())
那么该函数调用后会返回一个None对象。 None对象是Python内置的,表示没有数据内容的对象。
缺省值参数
假设,我们要实现一个函数,统计考试得分超过指定分数的人数。
def overScoreStudents(studentScoreList, score):
count = 0
# 下面的代码用到了循环和判断,后面章节会学习到
for ss in studentScoreList:
if ss >= score:
count += 1
return count
在调用这个函数的时候,大部分时候 都是统计超过及格分数线60的人数。像这样
overScoreStudents(ssList,60)
所以,我们调用该函数的时候,第二个参数通常都是填写 60 。
这样显得就有些麻烦。这时候,可以在定义函数的时候,给它加上缺省值,像下面这样:
def overScoreStudents(studentScoreList, score=60):
...
这样,在调用这个函数的时候,如果score参数还是传入60 就可以不用写了,像这样
overScoreStudents(ssList)
如果传入了其他的值,比如90,那么就会使用传入的值。
overScoreStudents(ssList, 90)
关键字参数
关键字参数,就是指调用函数的时候,传入的参数,使用关键字来表示。
def overScoreStudents(studentScoreList, score=60):
...
overScoreStudents(ssList, score=90)
关键字参数,可以简化调用函数的代码。
命名关键字参数
关键字参数,可以简化调用函数的代码。
def overScoreStudents(studentScoreList, score=60):
...
overScoreStudents(ssList, score=90)
关键字参数,可以简化调用函数的代码。
变量的有效范围
在Python中,变量的有效范围,指的是变量可以被访问的范围。
局部变量
def func(num1,num2):
ret = num1 + num2
return ret
func(1,2)
print(ret)
在函数func中,变量ret是局部变量。局部变量,只能在函数内部访问。
函数的参数变量 也是 局部变量。
局部变量有效范围只能是该函数内部。
因为 ret 是 func 函数内部的 局部变量 , 有效范围只能是 func函数内部, 不能在外部使用。
同样的,参数变量, 比如上面的 num1, num2 也是函数 内部的局部变量,这两个变量名也只能在 func函数内部使用。
全局变量
# 获取数字对应的汉字
upChars = '零壹贰叁肆伍陆柒捌玖'
def getZh(num):
print('对应的汉字是:' + upChars[num])
getZh(5)
定义在所有函数外部的变量,称之为 全局变量 。
全局变量的有效范围是整个模块文件。
上面的例子中 upChars 就是一个 全局变量。
函数内部代码 可以访问 全局变量的。
范围覆盖
upChars = '零壹贰叁肆伍陆柒捌玖'
def getZh(num):
upChars = '零一二三四五六七八九'
print('对应的汉字是:' + upChars[num])
getZh(5)
在函数内部,如果 局部变量 和 全局变量同名,使用的是 局部变量。
如果在函数内部要对全局变量进行重新赋值,不能直接这样
upChars = '零壹贰叁肆伍陆柒捌玖'
def change():
upChars = '零一二三四五六七八九'
change()
print(upChars)
应该这样做
upChars = '零壹贰叁肆伍陆柒捌玖'
def change():
global upChars
upChars = '零一二三四五六七八九'
change()
print(upChars)
通过 global upChars 这行声明,表示 upChars 这个名字对应的是全局变量 upChars
常用 内置函数
我们通常会把常用的代码放到函数里面,这样要使用这些代码 ,只需要调用那些函数就可以了。
Python的设计者 为我们总结了一些常用的函数,放到了Python解释器中,这些函数我们直接就可以使用。
前面我们学过的print 就是其中之一。
内置函数可以在Python的官方文档查看到
abs() dict() help() min() setattr()
all() dir() hex() next() slice()
any() divmod() id() object() sorted()
ascii() enumerate() input() oct() staticmethod()
bin() eval() int() open() str()
bool() exec() isinstance() ord() sum()
bytearray() filter() issubclass() pow() super()
bytes() float() iter() print() tuple()
callable() format() len() property() type()
chr() frozenset() list() range() vars()
classmethod() getattr() locals() repr() zip()
compile() globals() map() reversed() __import__()
complex() hasattr() max() round()
delattr() hash() memoryview() set()