python函数
- 函数的作用
- 函数定义
- 函数调用
- 参数传递
- 函数返回值
一般代码都是从上到下依次去执行的,如果某段代码需要重复的去使用的话,就得把这段代码赋值很多次,这种做法影响开发效率,不推荐这么做,
使这段代码多次被使用的话,可以用函数解决这样的问题。
什么是形参
就是“形式参数”是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传递的参数。
在调用函数时,给形参分配存储单元,实参可以是常量、变量或者表达式,且要与形参类型一致!而且实参要有确定的值,在调用过程中实参将值赋给形参,并将实际参数对应的数值传递给形式参数;
自定义函数中的“形参”全称为"形式参数" 由于它不是实际存在变量,所以又称虚拟变量。实参和形参可以重名。是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数.
形参和实参的特点
1、形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量。
2、实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值。
3、实参和形参在数量上,类型上、顺序上应严格一致,否则就会发生类型不匹配的错误。
1. 函数的作用
函数是组织好的,可重复使用的,用来实现单一或相关联功能的代码段。
函数能提高应用的模块性和代码的重复利用率。
python 内置函数:https://docs.python.org/zh-cn/3.8/library/functions.html 主要看一下提供什么功能和怎么用
2. 函数定义
def:函数定义关键词
function_name:函数名称
():参数列表放置的位置,可以为空
parameter_list:可选,指定向函数中传递的参数 参数可以传递参数,参数可以传递多个,每个参数用逗号相隔开即可。也可以不传,不传为空。为空调用时不传入。
comments:可选,为函数指定注释,一般来说用来说明函数的功能的。比如传进来的函数的用处、函数的功能等。
function_body:可选,指定函数体
语法:
def function_name([parameter_list]):
[''' comments (注释)'''] # 三引号之间可以写上一个文档型注释,注释下面写函数体。
2.1 定义函数
def func_demo(): # 函数体的定义 print("这是一个函数")
2.2 定义传递参数的函数(这里注释了打印函数)
def func_demo():
# 函数体
print("这是一个函数")
def func_with_params(a,b,c):
'''
这是一个携带参数的注释
'''
print(f"传入的参数为:a={a},b={b},c={c}")
# 打印函数的 comments 的内容
# print(func_with_params.__doc__) # 打印函数的comments内容
# help(func_with_params) # 效果是一样的,这个也可以打印,用help直接把函数名称传进去,不同小括号
2.3 定义空函数
def filer_char(s):
pass # 占位符,还没想好里面实现逻辑,用pass占住,没有pass会报错的;也可以用comments加注释进行占位。
'''
功能:过滤铭感词 # 也可以用注释进行占位
'''
3. 定义函数的注意事项
缩进:python 是通过严格的缩进来判断代码块儿
函数体和注释相对于 def 关键字必须保持一定的缩进,一般都是 4 个空格
pycharm 自动格式化快捷键:ctrl+alt+L
定义空函数
使用 pass 语句占位
写函数注释 comments
4. 函数调用
function_name:函数名称
parameter_value:可选,指定各个参数的值
语法:
function_name ([parameter_value])
定义的函数没有去调用的话是不会生效的。调用函数也就是执行函数
接例2.1: 调用函数(这个函数没有传参数)
def func_demo():
# 函数体
print("这是一个函数")
func_demo() # 调用函数。 调用了之后函数体就执行了,把print打印到了控制台上。没有调用不会打印。
返回
接例2.2: 调用函数(这个函数有传参数)
def func_with_params(a,b,c): print(f"传入的参数为:a={a},b={b},c={c}") func_with_params(1,2,3) # 调用函数,调用了传入进来的对应的值
返回
5. 参数传递
形式参数:定义函数时,函数名称后面括号中的参数
实际参数:调用函数时,函数名称后面括号中的参数
# a, b, c 为形式参数
def demo_func(a, b, c):
print(a, b, c)
# 1, 2, 3 为实际参数
demo_func(1, 2, 3)
返回:
6. 位置参数
数量必须与定义时一致
位置必须与定义时一致
def demo_func(a, b, c):
print(a, b, c)
# 1 赋值给 a, 2 赋值给 b, 3 赋值给 c
demo_func(1, 2, 3)
返回:
6.1 位置参数错误例子,数量错误
def demo_func(a, b, c):
print(a, b, c)
demo_func(1, 2) # 数量错误(这里举少传例子,多传也会错误)
返回
6.2 位置不对的话,得到的结果是错误的。如果是不同数据类型还可能报别的错误。这种传参参数多时容易出错
例子:位置传参中,错误位置
def person(name,age):
print(f"姓名为{name}")
if age >= 18:
print(f"{name} 已成年")
else:
print(f"{name} 未成年")
person(20,"lily") # 错误位置
# person("lily",20) # 正确位置
返回的错误
7.关键字参数
使用形式参数的名字确定输入的参数值
不需要与形式参数的位置完全一致
后面学习大部分用这种方式传参
def demo_func(a, b, c):
print(a, b, c)
demo_func(a=1, b=2, c=3)
返回
例子:用关键字传参,不容易出错
def person(name,age):
print(f"姓名为{name}")
if age >= 18:
print(f"{name} 已成年")
else:
print(f"{name} 未成年")
person(age=12,name= "tom") # 调换位置,使用关键字传参
返回
8. 为参数设置默认值
定义函数时可以指定形式参数的默认值
指定默认值的形式参数必须放在所有参数的最后,否则会产生语法错误
param=default_value:可选,指定参数并且为该参数设置默认值为 default_value
默认值一定要用不可变对象,否则的话默认值可能会随着调用发生变化:
我们在定义函数的时候,如果你要给形式参数设置默认值的话,这个默认值一定要用不可变对象。比如:字符串、数字、布尔值,元祖等等不可变对象。可变对象,比如:列表、字典等这些可变对象不要去用。
使用场景:有的时候,有的参数不想让它每次都传,因为它可能基本上是个固定的值,这个时候可以给参数设定一个默认值。
这个默认值怎么设定呢?我们可以直接在定义函数的时候,直接在传参的列表里面,把它的默认值加上即可。
指定默认值的参数要放在最后面,没有指定默认值的参数放在前面,这样才不会报错。
def function_name(..., [param=default_value]):
[function_body]
返回
例子:
def person(name,age,nationality="中国"):
print(f"姓名为{name}")
print(f"国籍为:{nationality}")
if age >= 18:
print(f"{name} 已成年")
else:
print(f"{name} 未成年")
person("lily",20) # 正确位置
返回
错误例子1:指定参数默认值没放在最后面
def wrong_demo(a=1,b,c):
pass
返回的错误提示
错误例子2:默认值为可变对象举例,默认值为空列表时,举例子
# 默认值一定要不可变对象,否则的话默认值会随着调用发生变化这样的话代码就会不可控了
def wrong_demo2(a,b,c=[]): # 设置默认值为空列表
c.append(a)
c.append(b)
print(a,b,c)
wrong_demo2(1,2) # 我希望c为默认值,但是现在c已经不是默认值了,把1,2添加了进来
wrong_demo2(3,4) # c还在继续往里面添加,默认值发生变化了
返回
9. 函数返回值
- value:可选,指定要返回的值
def function_name([parameter_list]):
[''' comments ''']
[function_body]
return [value]
在函数体里面使用return这样的关键字,就可以指定函数的返回值。如果一个函数里面没有return语句或者只写了return语句但是后面没有跟对应的一个值的话,那么函数会默认返回None也就是空值。
例子1:返回一个值
# 定义加法函数
def sum(a,b): # 传入两个参数
result = a+b # 定义result,让a和b相加
# 函数的返回值
return result # 把相加的结果返回出去,让其他的地方用到这个结果,这个时候就可以用return跟返回的值即可。到这里整个函数体没有执行任何打印操作,只是执行了一个加法操作,并且把最终的结果返回回来了
r = sum(1,2) # 要用到这个函数的话,定义一个变量,用这个变量接收函数的返回值。这里先变量调用这个函数,然后在函数里面传入1和2,之后result就会被赋值给r.
print(r) # 之后打印r,也就是1和2相加的结果
返回
例子2:返回多个值。所有的返回值都会保存在一个元祖之中。
def sum(a,b):
result = a+b
# 函数的返回值
return result,a,b # 把a和b一并返回回来。返回回来之后result就会是一个元祖。所有的返回值会保存在一个元祖当中。
r = sum(1,2)
print(r)
返回
例子3:没有retuen举例。如果没有return语句,你去打印调用的结果的话,默认返回空值
def sum(a,b):
result = a+b
r = sum(1,2)
print(r)
返回
例子4:函数体里面打印举例
def sum(a,b):
result = a+b
print(result) # 直接在函数体里面打印
# 函数的返回值
# return result,a,b # 把a和b一并返回回来。返回回来之后result就会是一个元祖。所有的返回值会保存在一个元祖当中。
r = sum(1,2) # 在外面不打印,在函数体打印,直接调用函数,可以打印计算结果,因为这是函数体当中所做的操作
# print(r) # 这里取消注释,非要再次去打印函数哦调用结果的话,这里部分打印的是none,因为前面定义的函数没有return,没有返回值,所以他会打印默认的返回值None
返回
如果打印函数调用的结果的话,一定要保证函数是有返回值的才能去打印出来;如果没有返回值,打印的就只能是默认返回值None。
图解函数:
https://blog.csdn.net/qq_39314932/article/details/83051973?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-1-83051973-blog-110344213.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-1-83051973-blog-110344213.pc_relevant_default&utm_relevant_index=1