兔C同学的一篇关于python 函数博文

朋友们,大家好,我是兔C。

我不知道你有没有看过我的文章,我一直在写我的炙爱,与其说是写,不如说是整理,
我的学习过程,都是从书里学来的,写在博客里的,都是我整理过的知识点,
其实完全是一个学习和搬运的过程。

现在是2023年的二月份,我打算把 《python 编程从入门到实践》 这本书啃完。
关于这本书的内容很清晰,没有过多的赘述,就好像一个数学老师,教你解方程,他先告诉你天秤的原理,然后一点点的去实现解方程的过程。
其实我想说,这本书不错,用来 python 入门,确实很好。

如果你看到我的文章,想学一下 python 可以看一下个人主页的叫 《python集》专栏,这里面写的内容都是python的文章,如果你喜欢我的文章,可以关注我,因为我日更文章。

关于本篇文章内容,请看下方目录:


1. 定义函数

函数:
.
函数是带名字的代码块,用于完成具体的工作。
要执行函数定义的特别任务,可调用该函数。需要在程序中多次执行同一任务时,你无需反复编写完成该任务的代码,而只需要调用要执行该任务的函数,让python运行其中的代码。

1.1 定义第一个函数

现在,我们知道了函数的概念,来开始尝试定义我们的第一个函数。

#定义函数
def message():
	print('Hello  World !')
	
#调用message函数
message()

当调用我们自己定义的这个 message函数(它的里面只有一行代码)的时候,正确的情况下应该能够输出 helloworld,
我们来看一下输出结果:

在这里插入图片描述

1.2 向函数传递信息

我们将message函数稍作修改,让其名字不在是固定的world,而是通过调用方传递,传递什么名字,就实现向谁问好。

def message(username):
	print('hello '+username)

message('兔c')

更改之后,我们在调用处传递一个参数,而方法入口处,接收到我们传递的参数,在执行内部的print函数时,将hello语句和接收到的参数拼接在一起,输出。

1.3 实参和形参

拿上述的示例说明,message函数的username参数就是一个形参,形参是函数完成工作所需的一项信息。而meesage调用处传递的参数就是实参,也就是兔C这个参数,它的作用是调用函数时传递给函数的信息。

我们调用message函数时,将实参写在调用处的括号内,然后调用处将自己括号内的实参传递给函数message,这个值就保存在 username 这个变量中。

2. 传递实参

在函数的定义过程中,可能定义多个形参,从而在调用时,也可能包含多个实参。向函数传递实参的方式有很多,下面我们逐个示例。

2.1 位置实参

什么叫位置实参呢。它的定义是这样说的:

调用函数时,python 必须将函数调用中的每个实参都关联到函数定义中的一个形参。最简单的关联方式是基于实参的顺序。这种关联方式称为位置实参。

我们写个demo示例:

#定义一个函数,该函数负责显示宠物信息
def pet(pet_type,pet_name):
	print('我有一只'+pet_type+',它的名字叫:'+pet_name)

#调用 pet 并传递函数
pet('小兔子','兔C')

调用pet函数时,调用处将传递该函数所需的参数数量,也就是小兔子和兔c这两个实参,
当函数中接收到这两个参数后,就可以根据逻辑使用接收到的函数了,至于使用一个还是两个都根据需求所需进行,可能是一个,可能两个都用,至于用几个都没有关系,要想使用,都必须根据函数定义过程中的参数顺序进行传递,使用时也同理,都在遵守着这个顺序。这就是位置实参的好处。

2.2 关键字实参

关键字实参是传递给函数的名称-值对。直接在实参中将名称和值关联起来,因此向函数传递实参时不会混淆。无需考虑实参顺序。

知道了概念,在看一眼示例代码就明白概念的意思了。

# 定义 显示宠物信息函数
def pet(pet_type,pet_name):
	print('我有一只'+pet_type+',它的名字叫:'+pet_name)

#这里进行调用
pet(pet_name ='兔c',pet_type ='小兔子')

看一下调用处的参数顺序的代码是怎么写的?
是不是没有考虑顺序?

我们在看一下控制台的输出结果。
在这里插入图片描述

是不是也正常输出了呢?!

2.3 默认值

编写函数时,可以给每个形参指定默认值。

在函数的调用过程中给形参提供了实参,python将使用指定的实参值。否则,将使用形参的默认值。

我们看一下示例代码:

#定义一个函数,设置其中一个参数的默认值
def pet(pet_name,pet_type ='dog'):
	print('我有一只'+pet_type+',名字叫做:'+pet_name)

#调用函数,传递未设置默认值参数的参数值
pet(pet_name='小白')

有一点需要向大家说明,
在这段代码示例当中,修改了形参的排列顺序。由于给type指定了默认值,无需在通过实参来指定动物类型,在函数调用过程当中,也只包含一个实参,也就是宠物的名字。python自己依然会将这个实参视为位置实参,因此如果函数调用中只包含宠物的名字,这个实参将关联到函数中定义的第一个形参。这就是需要将 name设置在第一个的原因。

我们来看一下这段代码在控制台的输出结果:
在这里插入图片描述

2.4 等效的函数调用

鉴于可混合使用位置实参、关键字实参和默认值,通常有多重等效的函数调用方式。
我们一边写code一边写注释进行说明:

#定义函数过程中,定义的关键字实参 要放在默认值实参的前面,不然会报错
def pet(pet_name,pet_type ='小狗'):
	print('我的宠物是一只'+pet_type+',它的名字叫做:'+pet_name)

#调用时,可通过位置实参进行传递
pet('小白')
#也可以通过关键字实参形式传递
pet(pet_name='小黑')

# 默认值参数也是可以修改的,同样可以按照 关键字形参和位置实参方式修改
pet('小强','蟑螂')

来看一下控制台的输出结果:
在这里插入图片描述

其实等效的函数调用就是在说明:含有默认值实参的几种调用方式。使用哪种调用方式都无关紧要,只要函数调用能生成所需要的输出就行。


3. 返回值

函数并非总是直接显示输出,相反,它可以处理一些数据,并返回一个或一组值。函数返回的值被称为返回值。
在函数中可以使用 return 语句将值返回到调用函数的代码行。
返回值让我们能够将程序的大部分繁重工作转移到函数中去完成,从而简化主程序。

3.1 返回值的第一个示例
#定义函数
# 设置两个形参,形参1用于接收学生的姓,形参2用于接收学生的名
def student_info(first_name,last_name):
	#将学生的姓和名进行拼接
	name = first_name+''+last_name
	#再利用return 语句将拼接好的姓名返回
	return name

# 调用函数,传递姓和名,在将函数拼接返回来的姓名 存储在新的变量当中
stu_name = student_info('兔','c')
#打印输出该变量
print(stu_name)

这就是一个简单的 带有返回值函数的定义过程了。

3.2 让参数变成可选的

有时候我们需要让参数变成可选的,这样才能让使用函数的人就只需要在必要时在提供额外的信息。

可以通过使用默认值来让参数变成可选的:

def student_info(first_name,last_name,and_name=''):
	if and_name:
		name =first_name+''+ and_name+''+last_name
	else:
		name = first_name+''+last_name
	return name


name1 = student_info('兔','c','c')
print(name1)

name2 = student_info('兔','c')
print(name2)

在这段示例当中,我们设置了三个参数,因为不是每个人的姓名都是两个字的。进入函数以后,先进行if判断,判断第二个形参。第二个形参默认是一个空值,如果有值,就进入到if语句,如果没有值,就执行 else语句。最后返回拼接好的参数。

3.3 返回字典

函数可返回任意类型的值,包括列表和字典等复杂的数据结构。


def student_info(first_name,last_name):
	#返回一个字典,其中包含有关一个人的信息
	person ={'first_name':first_name,'last_name':last_name}
	return person
	
name = student_info('兔','c')
print(name)

我们来看一下,控制台的输出内容:
在这里插入图片描述

3.4 结合使用 函数 和 while 循环

函数可以和python当中的任何结构进行组合使用。

这里我们结合while进行使用:

def student_info(first_name,last_name):
	name = first_name + '' + last_name
	return name

while True:
	#存储姓氏
	first_name = input('请录入您的姓氏:')
	last_name = input('请录入您的名字:')
	name = student_info(first_name,last_name)
	print(name)

代码执行以后,控制台将会输出这样的信息:
在这里插入图片描述

此处,由于我们定义的循环条件是 True,也就是一个无限循环 == 死循环。我们的示例存在不能退出的问题,在用户录入的情况下,应该必须具备退出的选项。我们现在就进行修改,使其具备退出功能。

def student_info(first_name,last_name):
	name = first_name + '' + last_name
	return name

while True:
	#存储姓氏
	print('- - - - 请按照提示录入您的信息: - - - - ')
	first_name = input('请录入您的姓氏:')
	last_name = input('请录入您的名字:')
	name = student_info(first_name,last_name)
	print(name)
	
	if first_name and last_name !='':
		break

上面的内容我们没有动,可以分成两个部分进行理解,第一部分先定义函数,在函数中接收到的实参进行拼接,通过return语句进行返回。然后定义循环,在循环中,要求用户录入信息,将用户录入的信息通过调用上面定义的函数进行处理。处理之后成功进行输出。可以将这步理解成第一部分,然后第二部分,我们已经有了用户的信息,也走完了程序。就在后面加入一个if判断,如果接收到的两个参数不为空,就说明成功了,成功之后利用break语句结束循环。

4. 传递列表

列表可能包含很多信息,其中可能包含名字、数字或更多的对象,例如字典。
如果将列表传递给函数后,函数就能直接访问其内容。

4.1 第一个示例
def students(names):
	for name in names:
		print('你好!欢迎你学习python,'+name+'同学!')

students_names = ['张三','李四','王五','赵六']
students(students_names)

这行代码很好理解,只有组合以往学过的内容,就能把代码写出来了。
我们来看一下输出结果:
在这里插入图片描述

4.2 在函数中修改列表

将列表传递给函数后,在函数中也可以进行列表的修改。而且在函数中对这个列表做任何的修改都是永久性的。


我们先简单的写一个处理学生分班的小demo,
然后在将这个demo更改成用函数处理的形式:

# 创建存储学生姓名的列表
student_names = ['张三','李四','王五','赵六']

#创建一个空的用于存储分班后的学生信息
students_name =[]

#利用循环处理 旧班级中的学生信息
while student_names:
	name = student_names.pop()
	print('已进行分班的学生姓名:' +name)
	#将已经进行分班的学生添加到新的班级到中
	students_name.append(name)

#显示新班级中的学生信息
print('显示新班级中的学生信息')
for names in students_name:
	print(names)
#显示旧班级中的学生信息
print('显示旧班级中的学生信息')
for name in student_names:
	print(name)

现在开始改造demo:
我们需要定义两个函数,第一个函数用来处理学生的分班操作,第二个函数用来处理分班后的信息显示。

#定义为学生分班的函数
def student_info(names1,names2):
	print('程序正在处理学生的分班操作....')
	while names1:
		name = names1.pop()
		print('已进行分班的学生姓名:' +name)

		#将学生信息添加到第二个列表中
		names2.append(name)
		

#定义用于显示分班后学生信息的函数
def students_info(names):
	print('程序马上为您显示已进行分班后的学生信息:')
	for name in names:
		print(name)
		
#定义旧班级学生信息的列表
student_names =['张三','李四','王五','赵六']
#定义新班级学生信息的列表
students_names =[]

#调用第一个函数为学生进行分班
student_info(student_names,students_names )
#调用第二个函数,显示分班后的学生信息
students_info(students_names)

4.3 禁止函数修改列表

向上面示例的使用场景,可能会存在老师想查看某个学生过去所在的班级时,我们可以通过切片来创建副本,让函数操作副本,而不是列表本身,这样列表本身的数据也不会进行删除。

#调用第一个函数为学生进行分班
student_info(student_names[:],students_names )

我们只要改动这一行代码,传递给函数的就是一个副本了,而不在是列表本身。
这样列表本身的数据也不会被影响。

5. 传递任意数量的实参

有时候,我们可能预先不知道函数需要接受多少个实参,
好在python允许函数从调用语句中收集任意数量的实参。

5.1 第一个示例

例如,我们现在要编写一个 制作披萨的函数,它需要接受很多配料,但你无法预先确定顾客要多少种配料,我们怎么编写函数呢?

def pizzas(*toopings):
	print(toopings)

pizzas('榴莲','番茄','糖')

在这段示例代码当中,*toopings形参前面的星号表示的含义是一个空的元组,通过设置参数为空元组的形式,在调用处不管传递多少个实参,函数中都能进行接收。但是在 print语句中,不要拼接字符串进行接收,因为数据类型不一样。

我们也可以将输出方式进行修改,因为函数的参数是一个元组,所以可以将其内容进行遍历。

def pizzas(*toopings):
	print('该顾客已点配料:')
	for tooping in toopings:
		print('-'+tooping)

pizzas('番茄','牛肉','榴莲','糖')
  1. 遍历以后也是可以正常输出其内容的,所以在没有进行遍历时,直接拼接其内容才会报类型错误。
  2. 你还可以将位置实参和任意数量实参进行结合使用,或者还可以创建任意数量的关键字实参。
6. 将函数存储在模块中

函数的优点之一是,使用它们可将代码块与主程序分离。通过给函数指定描述性名称,可让主程序容易理解的多。还可以更近一步,将函数存储在被称为模块的独立文件中,再将模块导入到主程序中。import 语句允许我们在当前运行的程序文件中使用模块中的代码。

6.1 导入整个模块

要让函数是可导入的,需要先创建模块。模块是扩展名为 .py 的文件,包含要导入到主程序中的代码。

创建一个新的文件,文件名为 pizza.py,
在这里插入图片描述

其中写入一个名为 make_pizza() 的函数。

def make_pizza(size,*toppings):
	'概述要制作的披萨'
	print('我要定制一个尺寸为:'+str(size)+'寸大小的披萨,我的口味偏好是:')
	
	for topping in toppings:
		print(topping)

创建好了.py文件,也定义好了函数。
接下来,我们在同级目录下,随便创建一个.py文件然后尝试导入这个文件。

making_pizza.py文件

import pizza

pizza.make_pizza(16,'榴莲披萨')

导入之后,我们调用一下。
在来看一下执行结果:
在这里插入图片描述

python 读取这个文件时,代码行 import pizza让python打开文件 pizza.py,并将其中的所有函数都复制到这个程序中。你看不到复制的代码,因为这个程序运行时,python在幕后复制这些代码。我们只需要知道,在 making_pizzas.py中,可以使用pizza.py中定义的所有函数。

6.2 导入指定的函数

导入模块中的特点函数,语法:

from module_name import function_name

用逗号分隔函数名,可以根据需要从模块中导入任意数量的函数:

from module_name import function_name1,function_name2

就向上面的示例中,如果只要调用某个文件的指定函数,可以这样写:

from pizza import pizza

#使用这种语法,可以直接调用函数,无需在通过句点去调用
pizza.make_pizza(16,'榴莲披萨')
6.3 使用 as 起别名

如果要调用的某个函数,或者是某个名称,与程序中的现有内容名称冲突,可以通过as起别名来解决这个问题。

1. 给函数起别名
from pizza import make_pizza as mp

mp(16,'榴莲披萨')

#指定函数别名的语法
# from 文件名 import 函数名 as 别名

这样,将 make_pizza()函数起了别名,通过别名调用,就不会出现冲突现象了。

2. 给模块指定别名
from 文件名 as 别名
6.4 导入模块中的所有函数

使用 * 星号,可以让 python 导入模块中的所有函数:

from pizza import *

make_pizza(16,'榴莲披萨')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

兔C

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

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

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

打赏作者

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

抵扣说明:

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

余额充值