Python中如何自定义函数
作者:棉猴
Python自定义函数
在Python编程中,可以使用已经定义好的函数,也可以自定义函数实现某些特殊的功能。
自定义函数的语法
在Python中,自定义函数的语法如下所示
def 函数名(参数):
函数体
其中,def是关键字;之后跟的是函数名,通过函数名来调用该函数;函数名之后是一个圆括号,圆括号内部是函数的参数,通过参数可以将数据传递到函数内部;函数体是函数实现的功能。
需要注意的是(1)在圆括号之后有冒号(2)函数体要有缩进。
自定义函数的实现
图1的代码中代码自定义了一个名为func的函数。
图1 自定义函数func
其中,该自定义函数的函数名是func,i是func的参数。func()函数的功能是打印出从0到i-1的数字,i的值由外部传递到函数内部。
自定义函数的调用
通过图2中的代码调用自定义函数func()。
图2 调用func()函数
其中,func()函数的参数设置为3,此时输出的是0-2的数字;修改func()的参数值,如图3所示。
图3 修改func()函数的参数值
此时输出的是0-4的数字。
Python自定义函数基础概念
函数定义语法
def 函数名(形参列表):
语句块
函数定义语句(def 语句) 的完整语法:
[@装饰器1] [@装饰器2] [...]
def 函数名([位置形参], [*元组形参], [命名关键字形参], [**字典形参]):
'''文档字符串'''
语句块
注: [] 中括号代表其内部可以省略
函数文档字符串
函数内第一次未被赋值给任何变量的字符串是此函数的文档字符串。
说明:
1. 文档字符串通常用来说明本函数的功能和使用方法
2. 在交互模式下输入: help(函数名) 可以查看函数的'文档字符串'
3. 函数的文档字符串绑定在函数的 __doc__ 属性上
函数定义规则
1. 函数的名字就是语句块的名称
2. 函数名的命名规则与变量名相同(函数名必须是标识符)
3. 函数名是一个变量(不要轻易对其赋值)
4. 函数有自己的名字空间,在函数外部不可以访问函数内部的变量,在函数内可以访问函数外部的变量,但不能修改此变量。
5. 函数如果不需要传入参数,形参列表可以为空
6. 语句块部分,内容不能为空,如果为空需要填充pass
形参定义方式
形参:函数调用时,接收调用时传递的数据
【1】位置形参
【2】关键字形参
【3】缺省参数
def 函数名(形参名=默认实参1, 形参名2=默认实参2, ...):
pass
缺省参数必须自右至左依次存在,如果一个参数是缺省参数,则其右侧的所有参数都必须是缺省参数。
【4】*args
星号元组形参,收集多余的位置传参
def 函数名(*元组形参名):
pass
【5】**kwargs
双星号字典形参,收集多余的关键字传参
def 函数名(**字典形参名):
pass
【6】不定长形参
星号元组形参,双星号字典形参
可以接受任意的位置传参和关键字传参
def fun(*args,**kwargs):
pass
位置形参,缺省参数,星号元组形参,双星号字典形参可以混合使用.
函数形参自左至右的顺序为:
- 位置形参
- 星号元组形参
- 命名关键字形参
- 双星号字典形参
函数调用
函数名(实参)
注:
1. 函数调用是一个表达式
2. 如果函数内部没有return语句,函数调用完毕后返回None对象
3. 如果函数需要返回其它的对象需要用到 return 语句
4.函数名是一个变量,绑定的是函数对象
函数调用时参数的传递形式
【1】位置传参
实参和形参的位置对应,将实参数据传递给函数形参。
实参和形参按位置一一对应。
实参个数和形参个数必须一致。
【2】序列传参
位置传参的一种。
用 * 将序列拆解后按位置进行传递的传参方式
【3】关键字传参
按形参的名称将实参数据传递给形参。
实参和形参按形参名称匹配。
【4】字典关键字传参
实参为字典,将字典用 '**' 拆解后再进行关键字传参的传参方式。
字典的键名必须和形参一致,切数量相同。
字典的键必须为字符串。
全局变量与局部变量
【1】全局变量
① 定义在函数外部,模块内部的变量称为全局变量
② 全局变量所有函数都可以直接访问(但函数内不能将其直接赋值)
【2】局部变量
① 定义在函数内部的变量称为局部变量(函数的形参也是局部变量)
② 局部变量只能在函数内部使用
③ 局部变量在函数调用时才能够被创建,在函数调用之后会自动销毁
函数的功能性
① 一个函数可以作为另一个函数调用时的实参,传递给此函数
def f1(): print("f1被调用") def f2(): print("f2被调用") def fx(fn): print(fn) fn() # 此时这是调用什么呢? fx(f1) fx(f2) #结果 <function f1 at 0x7f7a52ed6f28> f1被调用 <function f2 at 0x7f7a51757c80> f2被调用 #--------------------- def goodbye(L): for x in L: print("再见:", x) def hello(L): for x in L: print("你好:", x) def operator(fn, L): fn(L) operator(hello, ['Tom', 'Jerry', 'Spike']) #结果 你好: Tom 你好: Jerry 你好: Spike
② 一个函数可以作为另一个函数的返回值
def fx(): return max fn = fx() print(fn([1, 3, 5, 7])) #结果 7
③ 函数可以嵌套
函数式编程
用一系列函数解决问题。
优点:
【1】用每一个函数完成细小的功能,一系列函数的任意组合可以完成大问题
【2】函数仅接受输入并产生输入,不包含任何能影响输出的内部状态
要求:
def 语句创建的函数最好不要访问局部作用域以外的变量,这样可以保证返回结果的唯一性(可重入性)
函数的 可重入性(结果唯一性)
如果一个函数的输入参数一定,则返回结果必须一定的函数称为可重入函数
【1】 可重入函数,传入参数一定.结果必然一定
def myadd(x, y): return x + y
【2】不可重入函数:
y = 200 def myadd2(x): return x + y print(myadd2(10)) # 210 y = 300 print(myadd2(10)) # 310
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。