Python函数
函数
一、什么是函数(function)
函数是可以重复利用的、用来实现单一功能的代码。
比如当你使用print()函数时,可以把文本显示出来;当使用int()函数时,可以把某些数据转换为整数。
函数一般都带括号(),括号里放的是参数。
比如print()函数的括号里可以放不同的文本内容,print()函数会帮你在屏幕上显示不同的内容
print('字符')
函数也可以没有参数,比如:exit()函数,可以不用输入参数,(当然,里面也是可以加参数的:exit(‘再见’)
二、定义和调用函数
虽然Python里面有很多内置函数,但我们可以定义函数。
试想,如果有一段代码,常常会被用到,难道每次当我们需要它的时候就又复制粘贴一遍?虽然复制粘贴也不累,但是代码追求的是简洁和清晰。
那么这时,我们就可以定义一个新的函数了。
def greet(name):
print(name+'早上好')
def的意思是定义(define),greet是函数名(自己取名),括号里面的name是参数(自己取名)
第二行要缩进(:代表下一行缩进),第二行是函数内部的代码(函数体)。
但是定义完成后,并不会显示任何东西,因为还没有调用函数。
def greet(name):
print(name+'早上好')
greet('老师')
三、参数
这里的’李莫愁’和’赤练神掌’是对应参数person和skill的位置顺序传递的,所以被叫作位置参数,这也是最常见的参数类型。
每个人都有自己的爱好,是默认的,这里就可以用到默认参数。'作恶’是对应默认参数 hobby
#默认参数必须在位置参数之后
def fight(person,skill,hobby = '作恶'):
print(person + '的技能:' + skill)
print('爱好:' + hobby + '\n')
#因为已经默认将'作恶'传递给hobby,调用时无须再传递
fight('李莫愁','赤练神掌')
fight('公孙止','闭穴功')
#如果采用下面这种形式传递,就不需要理会参数位置
fight(person = '张无忌',skill = '乾坤大挪移')
如果一个参数的值是相对固定的,那么设置默认参数就免去了每次都要传递的麻烦。但默认参数并不意味着不能改变
#一个萝卜一个坑,因为前两个参数已经有对应的值传递,Python会自动将'侠义之事'传递给参数hobby。
fight('张无忌','乾坤大挪移','侠义之事')
每个人的爱好都不可能只有一个,而且你又不好限定数量,为解决这个问题不定长参数就能派上用场,即不确定传递参数的数量。
它的格式比较特殊,是一个星号*加上参数名,来看下面的例子。
def man(*hobby):
print(hobby)
man('吃饭','睡觉','打豆豆')
#这几个值都会传递给参数barbeque
输出的结果是元组类型,所以可以遍历
def fight(person, skill, *hobby):
print(person + '的技能:' + skill)
for i in hobby:
print('爱好:' + i)
fight('李莫愁', '赤练神掌','吃饭','睡觉','打豆豆')
需要注意的是,这时候默认参数也需要放在不定长参数的后面,否则会报错
def fight(person, skill, *hobby,doing='练功'):
print(person + '的技能:' + skill)
print('正在:' + doing)
for i in hobby:
print('爱好:' + i)
fight('李莫愁', '赤练神掌','吃饭','睡觉','打豆豆')
三、Return
return的意思是返回,就是你给一个参数给函数,函数会返回一个值给你。刚刚的greet() 函数是没有给你返回值的,它只是执行了一个打印的功能,它没给回你一个值。
1、return和print()的区别
有 return语句
def greet(name):
return name+'早上好'
n = greet('老师')
print(n)
无 return语句
def greet(name):
print(name+'早上好')
n = greet('老师')
print(n)
可以看到定义的语法是一致的,不同只在于函数内部没有return。这里的函数只是把文本内容打印在屏幕上,但并没有返回一个值给我们,所以我们之后是使用不了什么数据的,而return是有返回一个字符串给我们的。
四、变量的作用域
当定义一个函数时候,很重要的事情就是要理解变量的作用域。
局部变量:一个函数内定义的变量,只能在该函数里使用。
全局变量:在函数外定义的变量,能在程序任何位置使用。
#局部变量
def test():
score = 95
test()
print(score)
NameError: name ‘quantity’ is not defined
翻译成中文:变量quantity未定义,其实,我们定义了,只不过是在函数test() 内定义的,但问题是我们不能在定义的函数外面使用这个变量。
#全局变量
score = 95
def test():
print(score)
test()
局部变量和全局变量的优先级
局部变量的优先级大于全局变量的优先级
为了让程序更易读以及避免可能会出现的麻烦,建议局部变量和全局变量不要取相同的名字,以免混淆。
score = 95
def test():
score = 100
print(score)
def test2():
print(score)
test()
test2()
函数内修改全局变量的值
global 变量名
score = 95
def test():
global score #修改全局变量
score = 90
print(score)
def test2():
print(score)
test()
test2()