Python基础语法(7)——函数

本文详细介绍了Python函数的概念、定义与调用方法,以及参数类型、return语句和变量作用域等核心知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数是什么

Python中的函数与数学中的函数不同,它不再只是公式,而是实实在在有着自己特定功能的代码。其实在潜移默化中我们已经有所接触了。

比如print()函数,range()函数,type()函数等。

函数各式各样,或简单或复杂,但其本质却好是相通的:给函数一些数据,函数进行处理,输出你想要的东西。

函数名后面的括号里放参数,参数即要处理的数据。

函数的定义:函数是组织好的、可以重复使用的、用来实现单一功能的代码。

定义和调用函数

  • 定义函数:

语法如下:

def 函数名(参数1,参数2,...,参数n):
	函数体
	return 语句

第1行:

def的意思是定义(define),「函数名」需自己取,再是一个括号和冒号,括号里面的是参数,参数名也是自己取,最后是一个冒号。

第2行:

def下一行缩进的代码是函数要实现的功能,也叫「函数体」。

第3行:

return 语句。函数内部一旦遇到return语句,就会停止执行并返回结果。没有return语句的函数,Python也会在末尾隐性地加上return None,即返回None值(return None可以简写为return)。所以你会看到很多例子是省略return语句的。

注意事项:

  1. 函数名的选取要体现函数功能,一般用小写字母和单下划线、数字等组合;
  2. 根据函数功能,括号可能含有多个参数,也可不带参数,命名规则与函数名相同;
  3. 函数后面的冒号不能丢
  4. 函数体的缩进不能丢

定义函数是将函数的内部功能封装起来,等待被调用。

  • 调用函数:

在Python里,调用就是输入函数名和参数对应的值。

例子:

# 定义3个函数
def express():  
	print('我爱你')

def express1(name):
	print('我爱你'+ name)

def express2(name,person):
	print('我爱你'+name)
	print('我爱你'+person)

# 分别调用3个函数
express()
express1('中国')
express2('中国','中国人民')

调用函数最关键的是得清楚函数参数的个数,还有参数的赋值,即参数的传递。

为了便于理解函数的基本语法,举的例子很简单。其实大部分函数都很复杂,但我们只需明白函数能实现什么功能,懂的如何去给函数传递参数,会正确运用函数解决问题即可。

函数的重要概念

  • 参数类型

主要的参数类型有:位置参数默认参数不定长参数

举例说明:

假设你开了个饭馆,顾客可任意点菜。但因人手不足,所以只能为每个人提供一份开胃菜和一份主食。如果写成函数的形式,这个函数就会有两个参数。

def  menu(appetizer,course):

    print('开胃菜:'+ appetizer)
    print('主食:'+ course)

menu('果仁菠菜','兰州拉面')

这里的'果仁菠菜'和'兰州拉面'是对应参数appetizer和course的位置顺序传递的,所以被叫作「位置参数」 ,这也是最常见的参数类型。

如果用等号指定赋值,就可不用理会参数位置,如:

menu(course='牛肉拉面',appetizer='话梅花生')

接下来是「默认参数」,还用上述例子。

假如食堂为每位来客提供一道免费甜品冰淇淋,那么例子如下:

def  menu(appetizer,course,dessert='冰淇淋'):

    print('开胃菜:'+ appetizer)
    print('主食:'+ course)
    print('甜品:'+ dessert)

menu('果仁菠菜','兰州拉面')

因为已经默认把'冰淇淋'传递给dessert,调用时无需再传递一遍。

如果一个参数的值是相对固定的,那么设置默认参数就免去了每次都要传递的麻烦。

但默认参数并不意味着不能改变,如下:

def  menu(appetizer,course,dessert='冰淇淋'):

    print('开胃菜:'+ appetizer)
    print('主食:'+ course)
    print('甜品:'+ dessert)

menu('果仁菠菜','兰州拉面')
menu('果仁菠菜','兰州拉面','山楂羹')

前两个参数已有对应的值传递,Python会自动将'山楂羹'传递给参数dessert。

下面是「不定长参数」,即不确定传递参数的数量。继续上述例子。

饭店晚上开始卖烧烤,每个人点串的数量不等,举例如下:

def menu(*barbeque):
	print(barbeque)

menu('烤肉串','烤韭菜','烤鳕鱼')

输出结果为:('烤肉串', '烤韭菜', '烤鳕鱼'),这种数据类型叫做元组(tuple)。

元组的写法是 把数据放在小括号()中,它的用法和列表用法类似,主要区别在于列表中的元素可以随时修改,但元组中的元素不可更改。

我们也可以先生成一个元组,再传入参数。上述代码等价于:

order = ('烤肉串','烤韭菜','烤鳕鱼')

def menu(*barbeque):
	print(barbeque)

menu(*order)

和列表一样,元组是可迭代对象,这意味着我们可以用for循环来遍历它,这时候的代码就可以写成:

def  menu(appetizer,course,*barbeque,dessert='冰淇淋'):

    print('开胃菜:'+ appetizer)
    print('主食:'+ course)
    print('甜品:'+ dessert)
    for i in barbeque:
    	print('烧烤:' + i)


menu('果仁菠菜','兰州拉面','烤肉串','烤韭菜','烤鳕鱼')

注意:此时默认参数要放在不定长参数的后面,即dessert=’冰淇淋'要放在*barbeque后面,否则传递的值会对应不上。

还有如下情况,默认参数被指定赋值时,位置能够呼应即可:

def  menu(appetizer,course,dessert='冰淇淋',*barbeque):

    print('开胃菜:'+ appetizer)
    print('主食:'+ course)
    print('甜品:'+ dessert)
    for i in barbeque:
    	print('烧烤:' + i)


menu('果仁菠菜','兰州拉面','山楂羹','烤肉串','烤韭菜','烤鳕鱼')
 
  • return语句

前面我们提到,return是返回值,当你输入参数给函数,函数就会返回一个值给你。每个函数都会有返回值。

就像len(), type()函数一样,会返回一个值,然后,我们可以调用这个值,比如用print()函数打印出来。

但print()函数本身比较特殊,它在屏幕上显示完相关的文本内容就完活儿了,并不会返回一个值。所以,它返回的是空值(None)。

在自定义函数的时候,我们就可以用return语句规定该函数要返回什么值给我们。

带return语句的函数是这样的:

def learn(grade):
	if grade < 60:
		return '学渣万岁!'
	elif 60 < grade < 90:
		return '随遇而安!'
	else:
		return '学霸!'
print(learn(50))

函数是可以互相嵌套的,在此例子中,learn()函数就嵌套在了print()函数里。

可能你会觉得在这个例子中,直接用print不就行了吗,为啥还要用return呢?还有,我们前面讲了那么多函数,好像都是省略了return的啊。

其实是因为在这些例题中,我们的函数功能都是第一时间把参数打印出来。而在很多时候,当多个函数之间相互配合时,我们并不需要第一时间就将结果打印出来,而是需要将某个返回值先放着,等到需要的时候再做进一步的处理。

下面来看个例子:

要求:

一、分别定义两个函数,参数为人名,分别返回字符串'XXX的脸蛋'和'XXX的身材';

二、将上述两个函数的返回值拼接在一起之后,再打印出来。

 

def face(name):
	return name + '的脸蛋'

def body(name):
	return name + '的身材'
	
print('我的女朋友:' + face('刘亦菲') + '+' + body('林志玲') )

这只是一个非常简单的例子,在类似这种多个函数相互配合的代码中,我们就会非常需要return语句,来帮我们先保留某个函数的返回值,等要用到的时候再调出来用。

 

但是这样的代码还有个问题,当我想多次调用函数的时候,就需要先复制print那行代码,再分别修改两个函数里的参数。这样的操作既不简洁,也不优雅。就像这样:

def face(name):
	return name + '的脸蛋'

def body(name):
	return name + '的身材'
	
print('我的女朋友:' + face('刘亦菲') + '+' + body('林志玲') )

#要再次调用就要复制一遍,然后改参数
print('我的女朋友:' + face('新垣结衣') +' + ' + body('林志玲'))

所以更常见的做法是:再定义一个主函数main(),参数调用前两个函数的返回值。

def face(name):
    return name + '的脸蛋'

def body(name):
    return name + '的身材'

def main(dream_face,dream_body):
    return '我的女朋友:' + face(dream_face) + ' + ' + body(dream_body)


print(main('李若彤','林志玲'))

print(main('新垣结衣','林志玲'))

main()函数内部分别调用了face()和body()函数,参数dream_face和dream_body传递给了face()和body()函数的参数name,得到返回值,并打印。

So, 需要多次调用函数时,可以再定义一个主函数main(), 调用非主函数的返回值。

接下来要讲的是return的一个特别的用法,我们看到前面所有的return语句,都是返回1个值,如果要返回多个值,我们该怎么办呢?

def friend(name1,name2):
	face = name1 + '的脸蛋'
	body = name2 + '的身材'
	return face, body

a = friend('刘若菲','林志玲')
print('我的女朋友:'+ a[0] + '+' + a[1])

为什么要这样写,最后一行代码是啥意思?怎么看上去像是列表?

 

我们先来看看,一次性返回的两个值,是什么数据类型。

def friend(name1,name2):
	face = name1 + '的脸蛋'
	body = name2 + '的身材'
	return face, body

a = friend('刘若菲','林志玲')
print(a)

终端运行后,得到的是('刘若菲的脸蛋', '林志玲的身材')这样一个元组。

而元组与列表其实都是数据的“序列”,元组取某个位置的值的操作,与列表是一模一样,即tuple[]。

So, 我们知道了Python的函数返回值可以是多个,多个返回值的数据类型是元组(tuple)。

最后需要再强调的是,没有return语句的函数会默认返回None值。

def hi():
	a = 'I am a girl.'
print(hi())

def hi():
	a = 'I am a girl.'
	return a 
print(hi())

第一个函数因为没有return语句,返回None值,所以打印出None。

此外,return还有一个“副作用”:一旦函数内部遇到return语句,就会停止执行并返回结果。

举例:

def fun():
  return 'I am coding.'
  return 'I am not coding.'

print(fun())

函数内部遇到第一个return就会返回,所以只会打印出'I am coding'。

  • 变量作用域

当我们定义一个函数的时候,很重要的事情就是理解函数中变量的作用域

 

  1. 在一个函数内定义的变量仅能在函数内部使用(局部作用域),它们被称作「局部变量」。
  2. 在所有函数之外赋值的变量,可以在程序的任何位置使用(全局作用域),它们叫「全局变量」。

 

举例如下:

x = 0 # 全局变量x
def num():
	x = 1 # 局部变量x
	print(x)

# 打印局部变量x
num() 

# 打印全局变量x
print(x)

虽然变量的名字相同(都是x),但因为全局变量和局部变量处在不同的“作用域”下,所以都能打印出相应的结果。为了让程序更易读以及避免可能会出现的麻烦,建议局部变量和全局变量不要取相同的名字,以免混淆。

简单一句:当变量处于被定义的函数内时,就是局部变量,只能在这个函数内被访问;当变量处于被定义的函数外时,就是全局变量,可以在程序中的任何位置被访问。

如果你非要将局部变量变成全局变量,就像把私人房间的东西挪到公共区域,可不可以呢?

答案是:可以!只不过要用到一种语句——global语句,举例如下:

def dog():
	global quantity #global语句将变量quantity声明为全局变量
	quantity = 20
dog()
print(quantity)

这就是就把局部变量声明为全局变量的方法。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

太阳少阴天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值