函数是用户可以进行自定义,函数的结构为:
def 函数名([变量1,变量2,变量3,....变量n]):
'''函数文档注释'''
函数体
函数定义需要注意以下几点:
• 函数定义以 def 关键词开头,后面接上函数名称和圆括号 ();
• 传入参数须放在圆括号之内,不同的参数用逗号隔开。即使一个参数也没有,这对圆括号也必须保留;参数是变量,会在函数体中用到它,目的在于提高函数的灵活性和可复用性。
• 函数的第一行语句可以选择性地使用注释文字,用于存放函数功能和使用说明;
• 函数体是以冒号起始的一个缩进统一的代码块,负责函数具体内容的执行;
• return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回None。若有多个返回值时,则返回值之间必须用逗号分隔,调用时要有多个变量来接收返回值。定义函数需要做到下面几点:函数创建后并不会执行,必须在程序中调用该函数才会执行。
形参和实参:
如果函数有返回值,可以使用变量来存储返回值,在函数的返回值对于调用不重要时可以忽略,即不使用变量存储函数返回值。函数定义时的参数称为形参,函数调用时的参数称为实参。
def function(n):# 此时这个n就是形参
sum = 0
for i in range(1,n):#for循环计算从1到n-1的和
sum += i
return sum #sum为1到n-1相加的值
x = 100 #x为实参
result = function(x)#向函数中传入100,函数计算1到99的值
print(result)#print #输出1到99相加的和
当实参类型是可变类型时,那么函数体修改形参的内容会影响到函数外作为实参的值;
而当实参类型是不可变类型时,那么函数体修改形参的值不会影响到函数外作为实参的值。
所谓可变对象是指,对象的内容可变,而不可变对象是指对象内容不可变;
可变数据类型的值改变,id值不变;不可变数据类型的值改变,id值随之改变。
目前我所知道的内置可变类型有:列表、集合、字典
内置不可变类型有:数值、字符串、元组、布尔、None类型
参数传递:
(1)位置传递:
定义阶段:用位置参数定义函数,比如
def add_fun(x,y):#x,y就是位置参数
return x +y
测试阶段:传入和函数定义时数量和顺序一致的参数,位置传递通过实参的位置给形参赋值
add_fun(100, 20)
(2)关键字传递:
定义阶段,与位置参数一样,使用形参定义。
def sub_fun(x,y):
retun x -y
调用阶段,使用定义时的形参作为关键词并赋予其相应的值组成关键字参数,比如
sub_fun(y = 20,x = 100)#关键字传递是根据每个参数的名字进行参数传递的,关键字可以不遵守位置的对应关系
sub_fun(x = 300,y = 100)
sub_fun(6,y = 4)#关键字传递可以和位置传递混用,但位置参数要出现在关键字参数之前
(3)参数默认值:
定义阶段,参数被预先赋予相应的默认值,称这个参数是默认参数。(注意,定义时默认参数的值的类型必须是不可变类型的,否则会带来很多大家现阶段很难理解的麻烦。)
def pow_fun(x,y = 2)
return x**y
调用阶段,可以对有默认值的参数重新赋值,也可以不赋值而使用默认的值。
pow_fun(8)
pow_fun(8, 3)
(4)包裹传递(包裹位置传递、包裹关键字传递):
在定义函数阶段,有时候并不知道调用的时候会传递多少个参数。这时候,包裹位置参数或者包裹关键字参数,来进行参数传递,会非常有用。
包裹位置参数:
定义阶段,参数的前加*代表使用包裹位置传递
def sum_fun(*numbers):
print(numbers)#查看numbers,一会儿会看到它是一个元组
sum = 0
for e in numbers:
sum +=e
return sum
在调用时参数可以有0到多个,比如:
sum_fun(1,2,3)
sum_fun(1,2,3,4,5,6)
包裹关键字传递定义阶段,
参数前加**表示使用的是包裹关键字参数
def func(**data):
print(data)
调用阶段,将所有的参数名和数值以key=value的形式传递,双星号后面的参数会收集打包所有的关键字参数,传递给函数,比如
func(x=100,y = 200,z=300)
执行,能看到打印的data是一个字典。
以上就是我对部分函数的理解,如有不对,请指点。