函数进阶三
1. 匿名函数
1. 什么是匿名函数
匿名函数就是没有名字的函数,没法调用,他只能和某些方法联合起来使用
2. 匿名函数的语法
lambda 参数:返回值
#也可以通过赋值,让它变为有名函数
f = lambda x,y:x+y
res = f(1,2)
print(res)
3. 能和匿名函数联用的一些方法
(1)max 返回最大值
- 使用方法:
max(iterable,key = function)
salary_dict = {
'nick': 3000,
'jason': 100000,
'tank': 5000,
'sean': 2000,
'z': 1000
}
def func(name): # nick/jason/tank/sean/z
return salary_dict[name] # 3000/100000/5000/2000/1000
res = max(salary_dict, key=func) # 默认按key的首字母 这里是按工资排序
res = max(salary_dict, key=lambda name: salary_dict[name])
key=function默认做的事情
# 1. 循环遍历salary_dict,会取到所有的key值
# 2. 然后把所有的key值依次丢入function的形参中,返回薪资
# 3. 通过返回的薪资排序,得到最大值 #下面的方法中key同理
(2)min 返回最小值
- 使用方法:
min(iterable,key = function)
salary_dict = {
'nick': 3000,
'jason': 100000,
'tank': 5000,
'sean': 2000,
'z': 1000
}
def func(name): # nick/jason/tank/sean/z
return salary_dict[name] # 3000/100000/5000/2000/1000
res = min(salary_dict, key=lambda name: salary_dict[name])
print(res)
(3)fileter 返回筛选值
- 使用方法:
fileter(function,iterable)
- 返回的是布尔值为True的item
def function(item): # 1/2/3/4
if item < 5:
return True
else:
return False
res = filter(function, [1, 2, 3, 4])
res = filter(lambda item: item > 2, [1, 2, 3, 4])
print(res) # 迭代器
print(list(res))
#例二
salary_dict = {
'nick': 3000,
'jason': 100000,
'tank': 5000,
'sean': 2000,
'z': 1000
}
res = filter(lambda item: salary_dict[item] > 3000, salary_dict)
print(list(res))
(4)map 返回映射
- 使用方法:
map(function,iterable)
def function1(item):
return item + 2
res = map(function1, [1, 2, 3, ])
print(res) # <map object at 0x00000000029C6E80>
print(list(res)) # [3, 4, 5]
(5)sorted 排序并生成一个新的列表
-
使用方法:
sorted(iterable,key = function,reverse = ?)
def function2(item):
return salary_dict[item]
salary_dict = {
'nick': 3000,
'jason': 100000,
'tank': 5000,
'sean': 2000,
'z': 1000
}
res = sorted([2,3,4,1,0,5],key=lambda k:k,reverse=True)
res = sorted(salary_dict, key=function2, reverse=True)
print(res) # sorted 返回的就是一个列表类型,不是像上面的方法一样返回一个迭代器
print(list(res)) # 这里不用在强制类型转换了
#### (6)reduce 累积
- **reduce()** 函数会对参数序列中元素进行累积, 返回函数计算结果。
- 函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。
- `reduce(function, iterable, [initializer])`
- function -- 函数,有两个参数
- iterable -- 可迭代对象
- initializer -- 可选,初始参数,不写默认是0,写了会先把这个数和容器类型的第一个元素运算,得到的结果再与第二个元素运算。
- ```python
>>>def add(x, y) : # 两数相加
... return x + y
...
>>> reduce(add, [1,2,3,4,5]) # 计算列表和:1+2+3+4+5
15
>>> reduce(lambda x, y: x+y, [1,2,3,4,5]) # 使用 lambda 匿名函数
15
res1 = reduce(lambda x,y:x+y,[1,2,3,4],100)
print(res1) # 110
res2 = reduce(lambda x,y:x+y,[1])
print(res2) # 1
2. python解释器内置方法
方法名 | 使用方法 | 实例 |
---|---|---|
bytes |
转化为二进制码 | res = bytes('中国', encoding='utf8') # b'\xe4\xb8\xad\xe5\x9b\xbd' |
chr/ord |
将字母数字互转 | print(chr(97))print(ord('a')) # a 97 |
divmod |
取整和取余 | print(divmod(10, 4)) # (2,2) |
enumerate |
同时取索引和值 | lt = [1, 2, 3] for ind, val in enumerate(lt): print(ind, val) |
eval |
把字符串的引号去掉,留下来的是什么就是什么 |
s = '"abc"'print(type(eval(s)), eval(s)) #<class 'str'> abc
|
hash |
求哈希值 | print(hash(123123)) #123123 |
abs |
绝对值 | print(abs(-1)) # 1 |
all |
可迭代对象内的元素全部为True则为True | print(all([1, 2, 3, 3])) #True |
any |
可迭代对象内的元素有一个为True则为True | print(any([0, 1, ])) #True |
bin/oct/hex |
10进制转化为2/8/16进制 | print(bin(123)) # 0b1111011 |
dir |
列出模块(库)的所有方法 | import time print(dir(time)) |
frozenset |
不可变化的集合,类似于元组 | s = frozenset({1,2,3}) #frozenset({1,2,3}) |
globals/locals |
列出所有全局变量/列出所有当前位置的变量 | print(globals()) / print(locals()) |
pow |
幂 | print(pow(3,2)) # 9 |
slice |
切片 | s = slice(1, 5, 2) lt = [1, 2, 3, 4, 5, 6, 7] print(lt[s]) |
sum |
求和sum(iterable)
|
sum([1,2,3]) # 6 |
__import__ |
通过字符串导入模块 | time = __import__('time') |
- 其他进制转十进制:
int('进制数',n) # n表示前面的是几进制
3. 异常处理
-
语法:
try:
code1
except Exception as e:
print(e) #可加可不加
code2
finally: # 可加可不加
code3 异常处理就是当程序报了错,进行处理
报错之后,不执行下面的代码
异常捕捉只能捕捉逻辑错误
-
finally
方法的作用是无论你报不报错,都执行其缩进下的代码dic = {'a': 1}
try:
print(dic['b']) # KeyError
1 / int(num) # 报错之后,不运行下面的代码 except Exception as e: # 万能异常,只要有错误,就捕捉
print(e) # e存储的是错误的内容,而不是错误的类型
print('傻逼,不知道什么错误')
finally:
print('asdasf') -
assert +条件 ( 断言 +条件) 现在这种方法已经被淘汰
条件成立不报错,不成立报错
num = input('num:')
assert 1 == int(num) -
raise 主动报错误 (就是主动报错,没什么用处)
x = 1
raise(x = 1) # 报错
面向过程编程
面条版 --》 面向过程编程 --》 思想 --》面向对象编程
面向(代词--》使用) 过程(流程--》步骤) 编程(写代码,写文件)
-
IPO编程
I input 输入(定义的变量) P Process 过程(控制变量的改变) O output(新的变量) 输出编程 == 面向过程编程
面向过程编程:类似于流水线,一步一步往下走
一个步骤就是一个函数
-
面向过程编程
优点:逻辑非常清晰
缺点:上一步错了,下一步就跟着一起错