非常详细非常零基础的Python教程:函数和lambda表达式

102 阅读5分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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 种,分别为值传递和引用(地址)传递

  1. 值传递:适用于实参类型为不可变类型(字符串、数字、元组)
  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右边冒号前是参数,冒号后就是具体的语句。