python匿名函数、闭包、推导式和异常、捕获异常

159 阅读5分钟

目录

 

1.  匿名函数

2.  闭包

2.1Python创建闭包

2.2判断闭包

2.3Python中怎么创建闭包

3.  推导式

3.1  列表推导式

3.2  字典推导式

3.3  集合推导式

4   异常简介

5  捕获异常

5.1  基本语法

5.2  except捕获多个异常


1.  匿名函数

在定义函数的时候,不想给函数起一个名字。这个时候就可以用lambda来定义一个匿名函数

语法:

变量名= lambda 参数:表达式(block)

参数:可选,通常以逗号分隔的变量表达式形式,也就是位置参数

         表达式:不能包含循环、return,可以包含if...else...

注意:

1.表达式中不能包含 循环,return

2.可以包含 if...else...语句.

3.表达式计算的结果直接返回

1.1 创建一个匿名函数

func = lambda: 3 > 2
ret = func()  # 调用匿名函数
print(ret)   #输出:True

1.2  传递多个参数

func = lambda x, y: x + y
ret = func(1, 2)
print(ret)   #输出:3

1.3  使用if...else..语法

func = lambda x, y: y if x < y else x
ret = func(1, 2)
print(ret)   # 输出:2

练习1:输出字典中值最大的一项的key

dic = {'k1': 10, 'k2': 20, 'k3': 17}
ret = max(dic, key=lambda key: dic[key])
print(ret)    # 输出 k2

练习2: 输出最贵的一项

lst = [
    {'name': 'zxb', 'price': 35},
    {'name': 'wxw', 'price': 55},
    {'name': 'lxb', 'price': 30}

]
ret = max(lst, key=lambda dic: dic['price'])
print(ret)    # 输出: {'name': 'wxw', 'price': 55}

练习3:将原列表中奇数取出,并组成一个新的列表

lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]
ret = filter(lambda x: True if x % 2 == 1 else False, lst)  # 将返回 True 的元素放到新列表中。
print(list(ret))   #输出:  [1, 3, 5, 7, 9]

2.  闭包

闭包(closure)是函数式编程的重要的语法结构,Python也支持这一特性,下面就开始介绍Python中的闭包。

内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数

函数内部定义的函数称为内部函数

2.1Python 创建闭包

def outter():
    name = '赵四'

    def inner():
        print(name)  # 引用外层函数的变量

    return inner  # 返回地址


ret = outter()
ret()  #输出: '赵四'

2.2判断闭包

判断闭包函数的方法__closure__

输出的__closure__是一个cell对象表示是闭包函数,输出的是None 表示不是闭包函数。

def outter():
    name = '赵四'

    def inner():
        print(name)

    print(inner.__closure__)     #使用__closure__查看,有'cell'说明是闭包
    return inner  # 返回地址

f = outter()
f()

#输出:  (<cell at 0x00000000021595B8: str object at 0x0000000002155EA0>,)
#       赵四

2.3Python中怎么创建闭包

注意:

1.闭包函数必须有内嵌套函数

2.内嵌套函数必须引用外层函数的变量

3.闭包函数返回内嵌套函数的地址函数名称

3.  推导式

推导式comprehensions(又称解析式),是Python的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列。

推导式包括:

     1.列表(list)推导式 

    2.字典(dict)推导式 

   3.集合(set)推导式。

3.1  列表推导式

列表推导式(list comprehension)是利用其它列表创建新列表的一种方式,

工作原理类似for循环,即可对得到的元素进行转换或者筛选。

列表推导式的基本格式:

变量名=[表达式 for 变量 in 列表]    或者 

变量名= [表达式 for 变量 in 列表 if 条件]

执行流程:

遍历出列表中的内容给变量,表达式根据变量值进行逻辑运算。

或者遍历列表中的内容给变量,然后进行判断,符合的值在给表达式。

练习1:将lst中每一个元素进行平方后放入到一个新列表中

推导式方法:

lst = [1, 2, 3, 4]
lst2 = [i ** 2 for i in lst]
print(lst2)  # [1,4,9,16]

函数方法:

def square(x):
    return x ** 2

lst3 = [square(i) for i in lst]
print(lst3)  #[1,4,9,16]

练习2.求出lst 中是奇数的值,然后放入到一个新列表中

普通方法:

lst = [1, 2, 3, 4, 5, 6, 7, 8]
lst2 = []
for i in lst:
    if i % 2 == 1:
        lst2.append(i)
print(lst2)   # [1,3,5,7]

 推导式方法:

lst = [1, 2, 3, 4, 5, 6, 7, 8]
lst3 = [i for i in lst if i % 2 == 1]
print(lst3)   # [1,3,5,7]

3.2  字典推导式

字典推导式是该思想的延续,语法差不多,只不过产生的是字典而已。

字典推导式格式:

变量名={返回key:返回value for 临时变量 in 迭代 }

练习: 将字典中的key和value 进行对换。

普通方法:

dic = {'k1': 1, 'k2': 2}
new_dic = {}
for key,value in dic.items():
    new_dic[value]=key
print(new_dic)   # {1:'k1',2:'k2'}

推导式方法:

dic = {'k1': 1, 'k2': 2}
new_dic = {value:key for key,value in dic.items()}
print(new_dic)    # {1:'k1',2:'k2'}

3.3  集合推导式

集合推导式跟列表推导式非常相似,唯一区别在于用{}代替[]

L = [1,1,1,2,2,2,3,4,5,6,7]
set = {i for i in L}

练习1:计算列表中每个值的平方,自带去重功能 

lst = [-2, -3, 8, -1, 3]
new_set = {i ** 2 for i in lst}
print(new_set)  #{1,4,9,64}

4   异常简介

异常是指在语法正确的前提下,程序运行时报错就是异常。

当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。

print('程序开始')
print(1 / 0)    
print('程序结束')

'''
输出:  程序开始
    Traceback (most recent call last):
      File "D:/pycharm工作空间/day10/异常.py", line 2, in <module>
        print(1 / 0)     #   ZeroDivisionError: division by zero  0不能作为除数
    ZeroDivisionError: division by zero
'''

5  捕获异常

5.1  基本语法

try:
     ...代码1...    
     ...代码2... 
     ...代码3...
except 异常类型:
     try中一旦检测到异常,就执行这个位置的逻辑
try:
    print('程序开始了...')
    print(1 / 0)
    print('程序进行中...')
except ZeroDivisionError:
    print('你除数为0了')

print('程序结束了...')

输出结果:

执行流程:

先执行try中的代码,如果代码2报错,则不会执行代码3,执行执行exception中的异常代码。

注意:

如果发生的异常类型和捕获的异常类型不相同,还是不能捕获异常,程序还会结束。

try:
    print('程序开始了...')
    print(1 / 0)
    print('程序进行中...')
except IndexError:  # 索引越界异常
    print('你除数为0了')

print('程序结束了...')

5.2  except捕获多个异常

异常捕获流程: 依次捕获依次,直到捕获到对应的异常。

多分支结构格式:

try:

    执行的代码...

    except 异常类型:

    捕获异常1

except 异常类型 :

    捕获异常2

except 异常类型:

    捕获异常3

    ...

元组形式结构:

try:

    执行的代码...

except(异常类型1,异常类型2,异常类型3):

    捕获异常...

1.使用多分支结构

try:
    print('程序开始了')
    print(1/0)
    print('啊啊啊啊啊啊啊啊啊啊啊啊啊啊')
    lst = []
    print(lst[1])
    print('zzzzzzzz')
except IndexError:
    print('索引越界')
except ZeroDivisionError:
    print('除数为0')

输出结果:

2.使用元组结构

try:
    print('程序开始了')
    print(1/0)
    print('啊啊啊啊啊啊啊啊啊啊啊啊啊啊')
    lst = []
    print(lst[1])
    print('zzzzzzzz')
except (IndexError,ZeroDivisionError):
    print('程序出错了...')

输出结果: