Python函数概述、使用函数,函数定义、函数返回,函数参数。
几乎每种编程语言都有函数,Python中函数也是非常重要的内容。简单讲函数就是一段代码,然后我们给这段代码起个名字,通过名字来使用这段代码(调用)。
为什么需要函数呢?
看个例子,当我们程序中多个地方都要使用功能相同的一段代码时怎么处理呢?是每个使用这段代码的地方都复制一份吗?如图:
图:代码复制与复用
从例子我们可以看到,简单考虑有两种想法:一是每个用到的地方都复制一份;二是把这段代码放到一个地方,使用时都执行这段代码,这段代码执行完毕,继续执行其他处理。
如果把代码复制多份:
1、增加了代码量(占用更多的内存);
2、如果需要修改代码,比如把 a > b 改成 a>
方法二改善了这种情况,方法二的缺点是增加代码的跳转,对于流水线执行的指令来讲,会降低效率,这种降低大多数情况可以忽略不计,整体而言优点大于缺点。采用函数就可以实现方法二的效果。
函数作用:代码模块化设计,提高可读性;提高代码复用率;提高开发效率;使代码便于维护,降低出错率等等。
Python函数也是对象(一切皆对象),具有可执行属性,函数名就是一个变量,绑定到函数对应的代码。
关于Python函数主要需要了解:定义函数(创建对象),使用函数(调用)两方面内容。
Python 函数分类:Python函数可分为,Python内建函数、开发者自己编写的函数、其他开发者编写的函数。另外,Python中对象的方法其实也是函数。
使用函数称为函数调用,调用函数需要遵循函数的使用规则。如之前使用过的函数:
print("Hello Python")
r = len([1, 2, 3])
a = [1, 2, 3]
a.append(4)
print(),len(), a.append() 都是函数,上面都是函数调用。
Python函数的几个要素:函数名、函数参数、函数返回值。
Python使用关键字 def 定义函数。
Python自定义函数语法:
def 函数名 (参数列表):
"函数文档字符串"
函数语句块
1、def 必须写(大小写一致)
2、函数名要有,用户自定义,命名规则同变量(标识符命名规则),通常建议:小写字母+下下划线,如: goods_add()
3、() 必须有,英文
4、: 必须有,英文
5、参数列表:可选
6、"函数文档字符串":可选,如有需要缩进
7、语句块:至少一条语句,可以使用pass,需要缩进
代码示例:
不带参数
def hello():
print("hello 1")
print("hello 2")
print("hello 3")
带参数
def test(a, b):
print(a + b)
调用语法:
[变量] = 函数名([实参列表])
变量 =:可选,需要接收函数返回值时,否则 变量 = 均不需要。
函数名:必须有,需要和定义时一致包括大小写。
实参列表:可选,这个情况多些,后续说明。
示例:
print("Hello Python")
r = len([1, 2, 3])
a = [1, 2, 3]
a.append(4)
几点说明:
1、定义是函数创建对象(可执行对象,callable()),并不执行
2、调用时执行,从调用处跳转到函数代码
3、函数执行到最后一条语句则返回调用处,继续执行下一条语句,或者执行到return 语句结束执行,返回调用处,继续执行下一条语句。
示例2:
def my_test(a, b):
print(a + b)
my_test(10, 20)
x = 100
y = 20
my_test(x, y)
函数返回语句,只要执行到return语句,函数即结束运行,返回调用处。
return 语句语法:
return [表达式]
表达式:可选,有表示函数返回的值(对象),可以是 None,没有时等同None。
示例
无返回值
def say_hello2():
print("hello aaa")
print("hello bbb")
return
print("hello ccc")
有返回值
def fun2():
print("fun2()函数的第一行被执行")
return [1,2,3]
print("fun2()函数的最后一行被执行")
返回多个值
def fun1():
a = 100
b = 50
return (a – b), (a + b)
带参数的函数定义举例
def my_add(a, b):
return (a+b)
a = my_add(1, 2)
几点说明:
定义函数时,需要确定函数名和参数个数
参数可以没有(根据需要确定)
如果有必要,可以检查参数的合法性(后续讲解)
函数必须先定义,再使用
Python函数声明和定义可以看作一回事
函数体内部可以使用 return
return 可以返回值,有可以不返回值
return 可以随时出现函数体中,执行return即返回,后续语句不再执行
函数执行完毕也没有return语句时,自动 return None
函数可以同时返回多个值,但其实就是一个元组。
形参与实参的概念:
函数定义时,参数列表中的参数为形式参数
函数调用时,给定的参数为实参
图-形参实参
Python函数参数传递:
传递方式有,位置传参、序列传参;
关键字传参、字典关键字。
调用函数时,给定的实参个数和位置均需和定义时的形参相符。
示例1:
def my_func(x, y):
print("x is", x)
print("y is", y)
my_func(100, 200)
my_func(200, 100)
示例2:
def myfun1(a, b, c):
"这是一个函数参数的示例"
print("a的值是", a)
print("b的值是", b)
print("c的值是", c)
myfun1(1,2,3) # 1->a, 2->b, 3->c
myfun1(4,5,6) # 4->a, 5->b, 6->c
计算3-2的结果
def my_sub(x, y):
return x – y
以下函数调用得到什么结果?
my_sub(3, 2) #?
my_sub(2, 3) #?
my_sub() #?
my_sub(3) #?
位置传参(序列传参:元组传参,*())
元组元素个数和参数个数相同
对应位置上的元素类型和函数参数类型相同
def my_sub(x, y):
return x - y
试验以下调用结果:
my_sub(*(3,2))
my_sub(*(2,3))
my_sub(*(2,3,4)) #?
my_sub(*(2)) #?
位置传参(序列传参:列表传参,*[])
def my_sub(x, y):
return x - y
试验以下调用结果:
my_sub(*[3,2])
my_sub(*[2,3])
my_sub(*[2,3,5]) #?
my_sub(*[2]) #?
位置传参(序列传参:字符串传参,*字符串)
def print_str(a1, a2):
print("a1是", a1)
print("a2是", a2)
测试以下调用结果:
print_str(*"AB")
print_str(*"ABC") #?
print_str(*"A") #?
关键字传参是从调用角度来说的,调用函数时以名字给形参传递实际的对象值
调用时实参和形参按名字匹配,不按位置匹配。
代码示例
def print_str(a, b, c):
print ("a 是", a)
print ("b 是", b)
print ("c 是", c)
测试以下调用:
#位置传参
print_str(1, 2, 3)
#关键字传参
print_str(b = 2, c = 3, a = 1)
print_str(c = 3, a = 1, b = 2)
print_str(1, c = 3, b = 2)
#正确?
print_str(c = 3, a = 1)
Traceback (most recent call last):
File "
", line 1, in
print_str(c = 3, a = 1)
TypeError: print_str() missing 1 required positional argument: 'b'
print_str(a=1, 2, 3)
File "", line 1
SyntaxError: positional argument follows keyword argument
print_str(1, c = 3, 2)
SyntaxError: positional argument follows keyword argument
关键字参数(通过字典进行传参 **字典)
def print_str(a, b, c):
print ("a 是", a)
print ("b 是", b)
print ("c 是", c)
d = {"b":2,"c":3,"a":1}
print_str(**d)
函数位置传参和序列传参可以混合使用,个数,类型
print_str(100, *[200, 300]) # 正确
print_str(*[100, 200], 300) # 正确
print_str(*[100], *[200], *[300]) # 正确
print_str(*[100], 200, *[300]) # 正确
print_str(*[100], 200, *[300]) # 正确
函数位置传参和关键字参数传参可以混合使用
print_str(100, c = 300, b = 200) # 正确
print_str(c = 300, b = 200, 100) # 错误
函数位置传参和字典传参可以混合使用
print_str(100, **{"c" : 300, "b" : 200})
print_str(**{"c" : 300, "b" : 200}, a=100)
在实参能唯一匹配到相应形参的情况下可以任意组合
未完,待续。
领取专属 10元无门槛券
私享最新 技术干货