Python3 函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
可以通过 函数名.__doc__ 的方式来显示函数的说明文档,感觉这个如果在阅读比较大的程序时应该会有用,同时也在提示自己在写函数时注意添加文档说明。
def func(a, b):
"""
这是自定义说明文档。
只搬代码,不看文档,出事概不负责。
"""
return a + b
print(func.__doc__)
运行结果:
这是自定义说明文档。
只搬代码,不看文档,出事概不负责。
定义一个函数
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号起始,并且缩进。
-
return [exp] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
一般语法:
def fname():
funcbody
计算圆柱体的体积
import math
def calcv(r, h):
s = math.pi * r * r
v = s * h
return v
r = int(input("请输入半径r:"))
h = int(input("请输入高度h:"))
print("圆柱体的体积是:{:.2f}".format(calcv(r, h)))
指定函数参数和返回值类型
在编写函数的过程中,可以显式指定函数的参数类型及返回值类型:
def function_demo(param_A: int, param_B: float, param_C: list, param_D: tuple) -> dict:
pass
参数传递
在 python 中,类型属于对象,变量是没有类型的:
a = [1,2,3]
a = "Test"
- [1,2,3] 是 List 类型,“Test” 是 String 类型,而变量 a 是没有类型的。
-
a仅仅是一个对象的引用(一个指针),可以是指向 List 类型对象,也可以是指向 String 类型对象。
可更改(mutable)与不可更改(immutable)对象:
-
python 中一切都是对象(万物皆对象),严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。
-
在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。
-
函数内可以访问全局变量,但不能更新(修改)其值!
-
不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变 a 的值,相当于新生成了 a。
-
可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。
不可变变量传入到函数中进行操作,不会改变原来变量的值。
可变变量传入到函数中进行操作,会改变值。
传不可变变量 - numbers测试:
def change(a):
print(id(a))
a = 10
print(id(a))
a = 5
print(id(a))
change(a)
print(id(a))
print(a)
运行结果:
140714583267104
140714583267104
140714583267264 -> 函数内生成的a,不会对外界产生影响
140714583267104
5
传可变变量 - list测试:
def change(list):
print(list)
for i in list:
print(id(i))
list.append([4,5,6])
return
list = [1,2,3]
print(list)
for i in list:
print(id(i))
change(list)
print(list)
for i in list:
print(id(i))
运行结果:
[1, 2, 3]
140714583266976
140714583267008
140714583267040
[1, 2, 3]
140714583266976
140714583267008
140714583267040
[1, 2, 3, [4, 5, 6]]
140714583266976
140714583267008
140714583267040
1428048819776
参数
以下是调用函数时可使用的正式参数类型:
-
必需参数
必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样
def sumN(a, b):
return (a + b)
sumN(1, 2)
-
关键字参数
– 关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。
– 使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
def printme( str, age ):
print (str)
print(age)
return
printme( str = "小陈是猪", age = 10)
输出:
小陈是猪
10
-
默认参数
调用函数时,如果没有传递参数,则会使用默认参数。以下实例中如果没有传入 age 参数,则使用默认值
注意:默认参数必须放在形参的最后面,否则会报
def printinfo( name, age = 35 ): #这是设置默认age值为35
print ("名字: ", name)
print ("年龄: ", age)
return
printinfo( age=50, name="小陈" )
printinfo( name="小陈" )
-
不定长参数
– 当需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述参数不同,声明时不会命名。
– 形参前加*号,可以传入多个参数,也可以不写参数。
def functionname([formal_args,] *var_args_tuple ):
function_suite
return [expression]
加了 星号* 的参数会以元组(tuple) 的形式导入,存放所有未命名的变量参数。
def func2(name, *score):
print("姓名:",name)
sum = 0
print("各科成绩:",score)
for i in score:
sum += i
print("总分:",sum)
func2("小陈",99,88,77)
运行结果:
姓名: 小陈
各科成绩: (99, 88, 77)
总分: 264
还有一种就是参数带两个星号 **基本语法如下:
def functionname([formal_args,] **var_args_dict ):
function_suite
return [expression]
加了两个星号 ** 的参数会以字典的形式导入,把N个关键字参数转化为字典。
def printinfo(arg1, **vardict):
print("输出: ")
print(arg1)
print(vardict)
printinfo(1, a=2, b=3)
输出:
1
{'a': 2, 'b': 3}
特殊用法:
- 如果参数中单独出现星号 *,其后的参数必须用关键字传入
- 如果参数中出现了反斜杠/,其前的参数必须用指定位置参数,也称作强制位置参数
def test4me(a, b, /, c, d, *, e, f):
print(a, b, c, d, e, f)
test4me(11, 22, 33, 44, e=55, f=66)
匿名函数
python 使用 lambda 来创建匿名函数。所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。
- lambda 只是一个表达式,函数体比 def 简单很多。
- lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
- lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
语法:
lambda [arg1 [,arg2,.....argn]]:expression
sum = lambda arg1, arg2: arg1 + arg2
list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']
print(sum(list1, list2))
print(sum("Whose ", "there?"))
print(sum(arg1=2, arg2=3))
运行结果
[1, 2, 3, 'a', 'b', 'c']
Whose there?
5
return语句
- return [expression] 语句用于退出函数,选择性地 向调用方返回一个表达式。不带参数值的return语句返回None。
- 函数返回值的注意事项: 不同于 C 语言,Python 函数可以返回多个值,多个值以元组的方式返回: