函数就是一段「封装」起来的「代码」,目的是提高代码的「模块性」和「复用性」。
「模块性」:把具有「独立功能」的代码封装成一个模块,同时可以增加可读性
「复用性」:把需要「使用多次」的代码封装成一个模块(函数),后续直接调用函数,提高开发效率。
语法
def 函数名():
代码
- 使用 def 关键字定义函数,后面跟函数名,后面跟括号
()
- 括号里用来定义参数,多个参数之间使用逗号间隔
- 函数的内容以冒号
:
开始,并且缩进 - 最后可以选择用 return 结束函数,结束的同时返回一个值。
实例:创建一个函数
def function1():
print('hello pyton')
1、函数的调用
创建的函数默认「不执行」,需要「调用」才会执行;使用 函数名()
调用函数。
# 1、创建函数
def function1():
print('hello pyton')
# 2、调用函数
function1()
输出:
hello pyton
2、函数的参数
参数可以给函数「传递变量」,函数利用收到的变量进行具体的操作。
2.1、变量的就近原则
Python中的变量遵守「就近原则」,比如函数里面和外面有两个名字相同的变量,函数就会使用「里面」的变量,而不是外面的变量。
# 函数外面的变量
money = 18
def function1():
# 函数里面的变量
money = 20
print(money)
function1()
开发时,如果搞混了这些「名字相同」的变量,可能会出现意料之外的情况。为了避免出现这类问题,函数采用了参数传递的方式。
2.2、传递参数
给函数传两个参数,并在函数内调用
name = 'ZhangSan'
money = 18
def function1( name, money):
print('我的名字是', name, '我有', money, '块钱!')
function1( name, money)
输出:
我的名字是 ZhangSan 我有 18 块钱!
2.3、形参和实参
函数创建时,括号里的参数叫「形参」(形式参数),用来接收参数。
函数调用时,括号里的参数叫「实参」(实际参数),用来实际使用。
形参和实参的「名字」可以「不同」。
比如,我把参数名字随便改成其他的名字,仍然可以正常调用。当然,实际开发时,建议根据作用来命名参数。
name = 'ZhangSan'
money = 18
# 1、函数定义时,接收形参
def function1( a, b):
print('我的名字是', a, '我有', b, '块钱!')
# 2、函数调用时,传入实参
function1( name, money)
输出:
我的名字是 ZhangSan 我有 18 块钱!
2.4、位置参数
函数调用时,参数的「数量」和「位置」必须和函数创建时一样。
name = 'ZhangSan'
money = 18
def function1( a, b):
print('第一个参数:', a)
print('第二个参数:', b)
function1( name, money)
输出:
第一个参数: ZhangSan
第二个参数: 18
如果参数的「数量不对」,会报错 TypeError。
如果参数的「位置不对」,会不符合预期。
name = 'ZhangSan'
money = 18
def function1( a, b):
print('我的名字是:', a, '我有', b, '快钱!')
function1( money, name)
输出:
我的名字是: 18 我有 ZhangSan 快钱!
2.5、缺省参数
缺省参数也叫「默认参数」,在函数定义时,给参数指定「默认值」。
拥有默认值的参数,在函数调用时可以「不传值」:
- 如果传值,参数就会使用传入的新值
- 如果不传值,参数就会使用默认值
name = 'ZhangSan'
money = 18
# 1、参数设置默认值
def function1( a, b = 28):
print('我的名字是:', a, '我有', b, '块钱!')
# 2、传值
function1( name, money)
# 3、不传值
function1( name)
输出:
我的名字是: ZhangSan 我有 18 块钱!
我的名字是: ZhangSan 我有 28 块钱!
2.6、可变类型和不可变类型
Python变量的类型中,整型、字符串、元组属于「不可变类型」,列表、字典等属于「可变类型」。
- 函数接收「不可变类型」的参数,采用「值传递」,只是修改另一个复制的变量,不会改变原变量的值。
- 函数接收「可变类型」的参数,采用「引用传递」,会改变原变量的值。
str1 = 'ZhangSan'
list1 = [1, 2, 3]
# 修改传入的参数
def function1( str, list):
str * 2
list.append(4)
function1( str1, list1)
print(str1)
print(list1)
输出:
ZhangSan
[1, 2, 3, 4]
2.7、关键字参数
函数调用时,可以按照「参数关键字」给参数「赋值」。使用这种方式,可以不受参数顺序的限制。
name = 'ZhangSan'
money = 18
def function1( a, b):
print('我的名字是', a, '我有', b, '块钱!')
# 关键字参数传参
function1( b=money, a=name)
输出:
我的名字是 ZhangSan 我有 18 块钱!
3、匿名函数
匿名函数不需要 def 来声明函数,而是用 lambda 表达式来创建函数。常用于处理简单的场景。
语法
函数名 = lambda [参数] : 代码块
lambda 表达式的格式是固定的,因此只能封装有限的代码进去。
实例:创建一个匿名函数,返回两个数相加之和。
function1 = lambda num1, num2: num1 + num2
result = function1(1, 2)
print(result)
输出:
3
4、函数的返回值
关键字 return 可以让函数返回一个值,比如将函数的执行结果返回,或者返回一个自定义的值。
返回多个值需要用逗号间隔;如果不指定值,就返回None。
def function1(a, b):
return a + b
def function2(a, b):
return '自定义的值'
def function3(a, b):
return '第一个值', '第二个值'
def function4(a, b):
return
print(function1(1, 2))
print(function2(1, 2))
print(function3(1, 2))
print(function4(1, 2))
输出:
3
自定义的值
('第一个值', '第二个值')
None
return 还有退出函数的作用, return 后面的代码不会被执行;如果一个函数内有多个 return ,则只返回第一个 return 的返回值。
def function1(a, b):
return a + b
print('return后面的代码')
return '第二个返回值'
print(function1(1, 2))
输出:
3