开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 19 天,点击查看活动详情
函数和lambda表达式
函数用法
python中函数有两种:内置函数和匿名函数。
内置函数是python中定义好的(内置好的),如input()、print()这些,可以直接使用。我们这个章节讲的是自定义函数。
函数的本质就是一段有特定功能、可以重复使用的代码,这段代码已经被提前编写好了,并且为其起一个“好听”的名字。在后续编写程序过程中,如果需要同样的功能,直接通过起好的名字就可以调用这段代码。
函数定义与调用
定义函数就是创建函数,用def
关键字,语法如下:
def 函数名(参数列表):
//实现特定功能的多行代码
[return [返回值]]
上述代码中[]
部分是可选的,可以有返回值也可以没有,这个要看具体功能需求。
函数名就不说了,就是起名字。形参列表:设置该函数可以接收多少个参数,多个参数之间用逗号( , )分隔。[return [返回值] ]:整体作为函数的可选参参数,用于设置该函数的返回值。举例如下:
#定义个空函数,没有实际意义
def pass_dis():
pass
#定义一个比较字符串大小的函数
def str_max(str1,str2):
str = str1 if str1 > str2 else str2
return str
第一个函数是一个空函数,什么也不做。第二个函数是一个比较字符串大小的函数,会返回一个字符串大的那个字符串(str1大,返回的str就是str1;str2大,返回的str就是str2)。对于上述代码的调用举例如下:
调用语法:函数名(参数),有参数写参数,没参数直接空括号。
pass_dis()
str_max = str_max("abc","acd")
print(str_max)
因为原始函数str_max定义的时候就设置了两个参数str1、str2,所以在调用的时候我们要传入两个参数,如上我们传的是abc和acd。函数str_max会返回传入的字符串abc与acd中较大的一个,字符串的比较一般是根据它的ASCII码大小来的,比如a是97,很明显acd是大过abc的。代码运行结果如下:
acd
这里是ASCII码表对照,具体可以按ctrl+左键查看。
函数参数
定义函数时都会选择有参数的函数形式, 如下面的strmax函数就有两个str1、str2参数(前面提到过)。函数参数的作用是传递数据给函数,令其对接收的数据做具体的操作处理。 如下面的代码,这个函数会对接收的数据做具体的操作处理(会接收两个字符串数据,并对两个字符串进行比较,返回较大的。)。
def str_max(str1,str2):
str = str1 if str1 > str2 else str2
return str
str_max("abc","acd")
代码中,函数定义位置的两个参数str1、str2叫形参(形式参数),函数调用位置的参数abc、acd叫做实参(实际参数)。
实参和形参的区别,就如同剧本选主角,剧本中的角色相当于形参,而演角色的演员就相当于实参。
Python中,根据实际参数的类型不同,函数参数的传递方式可分为 2 种,分别为值传递和引用(地址)传递:
- 值传递:适用于实参类型为不可变类型(字符串、数字、元组) ;
- 引用(地址)传递:适用于实参类型为可变类型(列表,字典) ;
值传递和引用传递的区别是,函数参数进行值传递后,若形参的值发生改变,不会影响实参的值;而函数参数继续引用传递后,改变形参的值,实参的值也会一同改变。
需要注意:在调用函数,指定的实际参数的数量,必须和形式参数的数量一致;在调用函数时,传入实际参数的位置必须和形式参数位置一一对应。
默认参数
初始化定义的时候,给一个参数赋了初始值如下,就是默认参数,如果没传str2,那默认就取123。如下面的例子,我们可以给dis_str传一个参数,也可以传两个。
#str1没有默认参数,str2有默认参数
def dis_str(str1,str2 = "123"):
print("str1:",str1)
print("str2:",str2)
dis_str("abc") #因为str2已经有默认值了,所以可以不传(不传就取默认值)
dis_str("456","789") #也可以传两个参数,str2就不取默认值了(取传入的实际值)
None空值
判断x是否为空:if x is None
局部变量和全局变量
局部变量一般指的是你在函数(for循环、while循环等代码块)里面定义的变量,这样的变量只能在函数内部使用,出了这个函数就用不了了,如:
def demo():
#=======这是函数内部=======#
add = 1
print(add)
#=======这是函数内部=======#
#=======这是函数外部=======#
demo() #会输出1
print(add) #访问不到,会报错的
全局变量指的是在哪里都能用,不管是函数内部还是外部。举例:
add = "http://c.biancheng.net/shell/"
def text():
print("函数体内访问:",add)
text()
print('函数体外访问:',add) #都可以访问到
这里再提一个局部函数,它是指在函数内部定义的函数。
lambda表达式(匿名函数)
lambda 表达式,又称匿名函数。常用来表示内部仅包含 1 行表达式的函数。如果一个函数的函数体仅有 1 行表达式,则该函数就可以用 lambda 表达式来代替。语法如下:
name = lambda [list] : 表达式
#解释:函数名 = lambda 参数1,参数2: 表达式
#上述转成普通函数长这样:
def name(list):
return 表达式
name(list)
举例:下面是一个求 2 个数之和的函数
#普通形式
def add(x, y):
return x+ y
print(add(3,4)) #输出结果7
#lambda表达式
add = lambda x,y:x+y
print(add(3,4)) #输出结果7
可以看出来lambda表达式必须用lambda
来声明定义,等号左边理解为函数名,lambda右边冒号前是参数,冒号后就是具体的语句。