python学习笔记5-函数的定义
1.函数的定义:
# def 是英⽂ define 的缩写
def 函数名([参数1],[参数2]....[参数n]):
函数体
关于函数名的定义,有几项需要注意的地方:
•
函数名命名规则同变量名,要满⾜标识符命名规则
•
不能和系统函数重名,否则系统函数⽆法使⽤
•
命名⻛格:⼀般建议⽤下划线分隔的⼩写单词组成:say_hello
•
函数名称应该能够表达 函数封装代码 的功能,⽅便后续的调⽤
•
可以由 字⺟、下划线 和 数字 组成 ,不能以数字开头 ,不能与关键字重名
•
不能将函数调⽤放在函数定义 的上⽅
•
在python调试中,F8 Step Over 可以单步执⾏代码,会把函数调⽤看作是⼀⾏代码直接执⾏
•
F7 Step Into 可以单步执⾏代码,如果是函数,会
进⼊函数内部
2.函数的返回值:在python中,使用return返回函数的执行结果。
3.函数的参数
参数分类
• 位置参数,要求实参顺序必须和形参顺序完全⼀致,由形参顺序决定实参顺序
def say_hello(name,age,home):
print('⼤家好,我是{},我今年{}岁了,我来⾃{}'.format(name,age,home))
#实参个数、顺序必须和形参⼀致
say_hello('王佳',18,'湖北武汉')
• 关键字参数,函数调⽤时,实参可以是键值对,键就是形参名字,这样的调⽤,实参不必关⼼形参 的顺序。
def say_hello(name,age,home):
print('⼤家好,我是{},我今年{}岁了,我来⾃{}'.format(name,age,home))
#三个关键字参数
say_hello(name='王佳',home='⼤连',age=20)
#两个关键字参数
say_hello('⼤强',home='美国',age=30)
#⼀个关键字参数
say_hello('小强',24,home='何⽅')
• 默认值参数,如果形参在定义的时候给定⼀个值,那么函数在调⽤时就可以不传实参,可以简化调⽤,关于默认值参数,有几处需要注意的地方:
◦
默认值参数必须放到最右边
◦
如果传了实参,那么实参优先,不会使⽤默认值
◦
默认值只计算⼀次
◦
默认值必须是不可变对象
示例:
gl_num_list = [6, 3, 9]
# 默认就是升序排序,因为这种应⽤需求更多
gl_num_list.sort()
print(gl_num_list)# 只有当需要降序排序时,才需要传递 reverse 参数
gl_num_list.sort(reverse=True)
print(gl_num_list)
指定函数的缺省参数
•
在参数后使⽤赋值语句,可以指定参数的缺省值
def print_info(name, gender=True):
gender_text = "男⽣"
if not gender:
gender_text = "⼥⽣"
print("%s 是 %s" % (name, gender_text))
提⽰
1.
缺省参数,需要使⽤ 最常⻅的值 作为默认值!
2.
如果⼀个参数的值 不能确定,则不应该设置默认值,具体的数值在调⽤函数时,由外界传递!
缺省参数的注意事项:
1) 缺省参数的定义位置
•
必须保证 带有默认值的缺省参数 在参数列表末尾
•
所以,以下定义是错误的!
def
print_info
(name, gender=
True
, title):
2) 调⽤带有多个缺省参数的函数
•
在调⽤函数时,如果有 多个缺省参数,需要指定参数名,这样解释器才能够知道参数的对应关
系!
• 可变参数,传⼊的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。使⽤*接收任意数 量的位置参数
#注意:*的不定⻓参数被当做元组处理
def demo(a,b,*args):
print(a,b,args)
demo(12,33,90)
demo(1,2,3,4,5)
a=(1,2,3)
demo(*a)
#使⽤接收任意数量的关键字参数
#注意:不定⻓参数被当做字典处理
def demo1(a,args):
print(a,args)
demo1(1,name='kk',age=3)
b = {'a':20,'b':12,'c':32}
demo(b)
• 多值参数
• 有时可能需要一个函数能够处理的参数个数是不确定的,这个时候,就可以使用多值参数
• python 中有两种多值参数:
◦ 参数名前增加 一个 * 可以接收 元组
◦ 参数名前增加 两个 * 可以接收 字典
• 一般在给多值参数命名时,习惯使用以下两个名字
◦ *args 存放元组参数,前面有1个 *
◦ **kwargs 存放字典 参数,前面有两个 *
• args 是 arguments 的缩写,有变量的含义
• kw 是 keyword 的缩写, kwargs 可以记忆键值对参数
• python 中有两种多值参数:
◦ 参数名前增加 一个 * 可以接收 元组
◦ 参数名前增加 两个 * 可以接收 字典
• 一般在给多值参数命名时,习惯使用以下两个名字
◦ *args 存放元组参数,前面有1个 *
◦ **kwargs 存放字典 参数,前面有两个 *
• args 是 arguments 的缩写,有变量的含义
• kw 是 keyword 的缩写, kwargs 可以记忆键值对参数
参数组合
在Python中定义函数,可以⽤必选参数、默认参数、可变参数和关键字参数,这4种参数都可以⼀起 使⽤,或者只⽤其中某些,但是请注意,
参数定义的顺序必须是:必选参数、默认参数、可变参数和 关键字参数。
⽐如定义⼀个函数,包含上述4种参数:
def func(a, b, c=0, *args, **kw):
print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
最神奇的是通过⼀个tuple和dict,也可以调⽤该函数:
>>> args = (1, 2, 3, 4)
>>> kw = {'x': 99}
>>> func(*args, **kw)
a = 1 b = 2 c = 3 args = (4,) kw = {'x': 99}
匿名函数
不在使⽤def语句这样标准的形式定义函数,⽽是使⽤lambda来创建匿名函数
格式:
lambda [arg1[, arg2[, args,……]]]: exception
作⽤:作为参数传递,实现回调,简化代码
特点:
1.
lambda只是⼀个表达式,函数体⽐def简单的多
2.
lamdba主体是⼀个的表达,⽽不是代码块,仅能在lamdba表达式中封装有限的逻辑
3.
lamdba函数拥有⾃⼰的命名空间,且不能访问⾃有参数列表之外的或全局命名空间⾥的参数
f = lambda x, y: x + y
print(f(2,3))
函数名作为参数
函数也是⼀种数据,那么就可以⽤变量来保存(函数名也是⼀个特殊的变量)
应⽤:将函数作为参数传递(回调函数)
def func(x, y):
return x + y
f = func
print(f(1,2))
命令⾏参数
如果要获取命令⾏下传给python⽂件的参数可以使⽤体统模块sys的argv来获取
参数个数:len(sys.argv)
⽂件名:sys.argv[0]
参数:sys.argv[1],sys.argv[2].....
import sys
print(len(sys.argv))
print(sys.argv[0])
print(sys.argv[1])
参数传递(**)
python的参数传递是简单的值传递,当然这⾥的值是指变量的引⽤(地址),不是变量的值。不存在 值传递和引⽤传递的区分。简⽽⾔之,python的参数传递可以称之为对象引⽤传递,对象可以分为:
•
不可变对象:int、float、None、complex、bool、tuple、str,range
◦
在函数内部不可能修改函数外部的变量
•
可变对象: dict、list
◦
可以在函数内部修改
⼩结:
Python的函数具有⾮常灵活的参数形态,既可以实现简单的调⽤,⼜可以传⼊⾮常复杂的参数。
默认参数⼀定要⽤不可变对象,如果是可变对象,运⾏会有逻辑错误!
要注意定义可变参数和关键字参数的语法:
*args
是可变参数,args接收的是⼀个tuple;
**kw
是关键字参数,kw接收的是⼀个dict。
以及调⽤函数时如何传⼊可变参数和关键字参数的语法:
可变参数既可以直接传⼊:
func(1, 2, 3)
,⼜可以先组装list或tuple,再通过
*args
传⼊:
func(*(1, 2, 3))
;
关键字参数既可以直接传⼊:
func(a=1, b=2)
,⼜可以先组装dict,再通过
kw
传⼊:
func(
{'a': 1, 'b': 2})
。
使⽤
*args
和
**kw
是Python的习惯写法,当然也可以⽤其他参数名,但最好使⽤习惯⽤法。