目录
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('程序出错了...')
输出结果: