day 14小结
1.匿名函数
匿名 -->没有名字 -->没办法调用 -->只能和某些方法联用
def f1()
pass
匿名函数的语法(通常与max() sorted() filter() sorted()方法联用)
lambda # 参数:返回值
# 如果非要用,也可以用,但是会变成有名函数
f = lambda x, y:x * y
res = f(1,2)
print(res)
max 返回最大值
res = max([1,2,3,4,5])
print(res)
res = max(1,2,3,4,5)
print(res)
min返回最小值
salary_dict = {
'nick': 3000,
'jason': 100000,
'tank': 5000,
'sean': 2000,
}
def func(name): # nick/jason/tank/sean
return salary_dict[name] # 3000/100000/5000/2000
res = max(salary_dict,key=func) # 默认key的首字符
res = max(salary_dict,key= lambda name:salary_dict[name]) # 默认key的首字符
print(res)
key = func # 默认做的事
# 循环遍历salary_dict,会取到所有的key值
# 然后把所有的key值一次丢到func中,返回薪资
# 通过返回薪资排序,得到最大值
res = min(salary_dict, key = lambda name: salary_dict[name])
print(res)
fileter -->筛选
# 首先将可迭代对象变成迭代器对象
# res = next(迭代器对象),将res当做参数传给第一个指定的函数,然后filter会判断函数的返回值的真假,如果为真则留下.
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(rse) # 迭代器
print(list(res))
salary_dict = {
'nick': 3000,
'jason': 100000,
'tank': 5000,
'sean': 2000,
}
res = filter(lambda item: salary_dict[item] > 3000, salary_dict)
print(list(res))
map -->映射 --> y = x+1
# 首先将可迭代对象变成迭代器对象
# res = next(迭代器对象),将res当作参数传给第一个参数的指定函数,然后将该函数的返回值作为map()方法的结果之一
def function1(item):
return item + 2
res = map(function1,[1,2,3])
print(res)
print(list(res))
sorted --> 排序
# 首先将可迭代对象变成迭代器对象
# res=next(迭代器对象),将res当作参数传给第一个参数指定的函数,然后该函数的返回值当作判断依据
def function2(item):
return salary_dict[item]
salary_dict = {
'nick': 3000,
'jason': 100000,
'tank': 5000,
'sean': 2000,
}
# res = sorted([2,3,4,5,1,5],key=function2,reverse=True)
res = sorted(salary_dict,key=function2, reverse=True)
print(list(res))
def sorted(iter,key=None,reverse=None):
iter,sort()
if key:
# key 是一个函数对象
lt = []
lt2 = []
for i in iter:
res = key(i)
lt.append(res)
lt2.append(i)
lt.sort()
lt3 = []
for i in lt:
for j in lt2:
if j[1] == i:
lt3.append(j)
if reverse:
lt3.reverse()
return lt3
if reverse:
iter.reverse()
return iter
salary_list = list(salary_dict.items())
print(salary_list)
print(sorted(salary_list, key=lambda i: i[1],reverse=None))
2.内置函数
bytes
解码字符
res = bytes('中国',encoding='utf8')
print(res)
chr/ord
chr()参考Ascall码表将数字转换成对应字符;ord()将字符转换成对应的数字
print(chr(97))
print(ord('a'))
divmod
分栏
print(divmod(10,4))
enumerate
带有索引的迭代
lt = [1,2,3]
for i in range(len(lt)
print(i,lt[i])
print(tp)
for ind,val in enumerate(lt):
print(ind,val)
eval
把字符串翻译成数据类型
s = '"abc"'
print(type(eval(s)),eval(s))
hash
可变不可哈希
print(hash(123123))
了解
abs
绝对值
print(abs(-1))
all
可迭代对象内的元素全部为True则为True
print(all([1,2,3,4]))
any
可迭代对象中有一元素为真,则为真
print(any([0,0, ]))
bin/oct/hex
二进制/八进制/十六进制转换
print(bin(123))
print(oct(123))
print(hex(123))
dir
列出模块的所有方法
import time
print(dir(time))
frozenset
不可变化的集合,类似于元组
s = frozenset({1,2,4})
pritn(s)
gloabals/locals
查看全局名字;查看局部名字
print(globals()) # 列出所有全局变量
print('locals():',locals())
def func():
s = 's1'
print(globals()) # 列出所有全局变量
print('locals():',locals()) # 列出当前位置所有变量
func()
pow
print(pow(3,2,3))
round
print(round(10.333))
slice
s = slice(1, 5, 2) # 1start,5stop,2step
lt = [1, 2, 3, 4, 5, 6, 7]
print(lt[s])
print(lt[1:5:2])
sum
print(sum(range(100)))
__import()__
import 'time'
time = __import__('time')
print(time.time())
3.异常处理
异常就是程序运行时发生错误的信号(在程序出现错误时,会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止
1.语法错误
语法错误根本过不了python解释器的语法检测,必须在程序执行前就改正
# 语法错误示范一
if
# 语法错误示范二
def test:
pass
# 语法错误示范三
class Foo
pass
2.逻辑错误
# TypeError:int类型不可迭代
for i in 3:
pass
# ValueError
num = input('>>:') # 输入hello
int(num)
# NameError
aaa
# IndexError
l = ['egon','aa']
l[3]
# AttributeError
class Foo:pass
Foo.x
# ZeroDivisionError:无法完成计算
res1 = 1/0
res2 = 1+'str'
异常的种类
在python中不同的异常可以用不用的类型(python中统一了类与类型,类型即类)去标识,一个异常标识一种错误
1.常用的异常
-
AttributeError试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
-
IOError输入/输出异常;基本上是无法打开的文件
- ImportError 无法引入模块或包;基本上是路径问题或名称错误
- IndentationError 语法错误(的子类) ;代码没有正确对齐
- IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
- KeyError 试图访问字典里不存在的键
- KeyboardInterrupt Ctrl+C被按下
- NameError 使用一个还未被赋予对象的变量
- SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
- TypeError 传入对象类型与要求的不符合
- UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
- ValueError 传入一个调用者不期望的值,即使值的类型是正确的
2.其他异常
- ArithmeticError
- AssertionError
- AttributeError
- BaseException
- BufferError
- BytesWarning
- DeprecationWarning
- EnvironmentError
- EOFError
- Exception
- FloatingPointError
- FutureWarning
- GeneratorExit
- ImportError
- ImportWarning
- IndentationError
- IndexError
- IOError
- KeyboardInterrupt
- KeyError
- LookupError
- MemoryError
- NameError
- NotImplementedError
- OSError
- OverflowError
- PendingDeprecationWarning
- ReferenceError
- RuntimeError
- RuntimeWarning
- StandardError
- StopIteration
- SyntaxError
- SyntaxWarning
- SystemError
- SystemExit
- TabError
- TypeError
- UnboundLocalError
- UnicodeDecodeError
- UnicodeEncodeError
- UnicodeError
- UnicodeTranslateError
- UnicodeWarning
- UserWarning
- ValueError
- Warning
- ZeroDivisionError
异常的处理
为了保证程序的健壮性与容错性,即在遇到错误时系统不会崩溃,我们需要对异常进行处理
1.提前预防
如果发生错误的条件是可以预知的,我们需要用if进行处理:在错误发生之前进行预防
AGE = 10
while True:
age = input('>>:').strip()
if age.isdigit(): # 只有在age为字符串形式的整数时,下列代码才不会出错,该条件是可预知的
age = int(age)
if age == AGE:
print('you got it')
break
2.之后的预防
如果发生错误的条件是不可预知的,则需要用到try...except:在错误发生之后进行处理
try:
被检测代码块
except 异常类型:
try中一旦检测到异常,就执行这个位置的逻辑
异常类只能用来处理指定的异常情况,如果非指定异常则无法处理.
s1 = 'hello'
try:
int(s1)
except IndexError as e: # 为捕获到异常,程序直接报错
print(e)
多分支
s1 = 'hello'
try:
int(s1)
except IndexError as e:
print(e)
except KeyError as e:
print(e)
except ValueError as e:
print(e)
万能的异常Exception
s1 = 'hello'
try:
int(s1)
except Exception as e:
print(e)
异常的最终执行
s1 = 'hello'
try:
int(s1)
except IndexError as e:
print(e)
except KeyError as e:
print(e)
except ValueError as e:
print(e)
# except Exception as e:
# print(e)
else:
print('try内代码块没有异常则执行我')
finally:
print('无论是否异常,都会执行该模块,通常是进行清理工作')
try...except总结
1.把错误处理和真正的工作分开来
2.代码更易组织,更清晰,复杂的工作任务更容易实现;
3.毫无疑问,更安全了,不至于由于一些小的疏忽而是程序意外崩溃了
抛出异常raise
try:
raise TypeError('抛出异常,错误类型')
except Exception as e:
print(e)
断言assert
assert 1 == 1
try:
assert 1 == 2
except Exception as e:
print(e)
4.面向过程编程
面条版--> 面向过程编程 --> 思想 -->面向对象编程
思想没有好坏
面向(代词-->使用) 过程 (流程-->步骤) 编程 (写代码,写文件)
面向过程编程:类似于流水线,一步一步往下走
优点:逻辑非常清晰
缺点:上一步错了,下一步就跟着错
为什么会报错
逻辑--> 控制变量改变的方向出错了
检查错误--> 打印变量的变化状态-->
x = 10
y = 20
z = x + y
print(1,z) # 30
z = z + 10
print(2,z) # 40
z = z - 20
print(z)
debug