异常处理
try: 被监测的代码 except 错误类型 as e: ... else: 被监测的代码不报错的时候执行 finally: 无论是否报错最终都会执行
for循环本质
d={'name':'jason','pwd':'123','hobby':'red'}
res=d.__iter__() # 每次都需要重新获取一个迭代器对象
while True:
try:
print(res.__next__())
except StopIteration as e: # 捕捉异常终止循环
break
# for循环又称为迭代循环,in后面可以跟任意可迭代对象
for i in d:
print(i)
迭代取值与索引取值对比
""" 迭代取值 优点: 1.不依赖于索引的一种通用取值方式 缺点: 1.取值的顺序永远都是固定的从左往右,无法重复获取 索引取值 缺点: 1.需要提供有序容器类型才可取值(不是一种通用的方式) 优点: 1.可以重复取值 """
生成器对象

""" 生成器其实就是自定义迭代器 """ # 定义阶段就是一个普通函数 def my_ge(): print('first') yield 123,222,443 print('second') yield 456,456,555 """ 当函数体内含有yield关键字,那么在第一次调用函数的时候 并不会执行函数体代码,而是将函数变成了生成器(迭代器) """ # 调用函数:不执行函数体代码,而是将函数变成了生成器(迭代器) res=my_ge() ret=res.__next__() # 每执行一个__next__代码往下运行到yield停止,返回后面的数据 print(ret) ret=res.__next__() # 再次执行__next__接着上次停止的地方继续往后,遇到yield再停止 print(ret)
自定义range功能
# for i in range(1,10,2): # print(i) def my_range(start,stop=None,step=1): if not stop: stop=start start=0 while start<stop: yield start start += step res=my_range(1,10,2) for i in res: print(i)
yield传值
def eat(name): print('%s准备干饭!!!'%name) while True: food=yield print('%s正在吃%s'%(name,food)) res=eat('ldb') # 并不会执行代码,而是转换成生成器 res.__next__() # 代码运行到yield停止 res.send('肉包子') #send传值
yield与return对比
yield
1.可以返回值(支持多个并且组织成元祖)
2.函数体代码遇到yield不会结束而是“停住”
3.yield可以将函数变成生成器,并且还支持外界传值
return
1.可以返回值(支持多个并且组织成元祖)
2.函数体代码遇到return直接结束
生成器表达式
创建一个生成器对象有两种方式,一种是调用带yield关键字的函数,另一种就是生成器表达式,与列表生成式的语法格式相同只需要将[]换成(),如:
l=[11,22,33,44,55,66,77,88,99] # 列表生成式 res=[i+1 for i in l if i!=44] print(res) # 生成器表达式 res1=(i+1 for i in l if i!=44) """ 生成器表达式内部的代码只有在迭代取值的时候才会执行 """ print(res1.__next__()) print(res1.__next__()) print(res1.__next__()) """ 迭代器对象、生成器对象我们都可以看成是“工厂” 只有当我们所要数据的时候工厂才会加工出“数据” 上述方式是为了节省空间 """
面试题:

# 求和 def add(n,i): return n+i # 调用之前是函数,调用之后是生成器 def test(): for i in range(4): yield i g=test() # 初始化生成器对象 for n in[1,10]: g=(add(n,i) for i in g) """ 第一次for循环(test函数代码块没有执行,) g=(add(n,i) for i in g) 第二次for循环 g=(add(10,i) for i in (add(10,i) for i in g) """ res=list(g) print(res) # A.res=[10,11,12,13] # B.res=[11,12,13,14] # C.res=[20,21,22,23] 正确答案 # D.res=[21,22,23,24]
常见内置函数
# 1.abs() 绝对值
print(abs(123))
print(abs(-123))
# 2.all() any()
l=[11,22,33,0]
print(all(l)) # 所有的元素都为True结果才是True
print(any(l)) # 所有的元素只要有一个为True结果就为True
# 3.bin() oct() hex() 进制数
print(bin(123))
print(oct(123))
print(hex(123))
# 4.bytes() str()
res='金牌班 最牛逼'
res1=bytes(res,'utf8')
print(res1)
res2=str(res1,'utf8')
print(res2)
# 5.callable() 是否可调用(能不能加括号运行)
s1='jason'
def index():
pass
print(callable(s1),callable(index)) # False True
# 6.chr() ord()
print(chr(65)) # 根据ASCII码转数字找字符
print(ord('A')) # 65
# 7.complex() 复数
print(complex(123)) # (123+0j)
# 8.dir() 查看当前对象可以调用的名字
def index():
pass
print(dir(index))
print(index.__name__)
# 9.divmod()
print(divmod(101,10))
"""总数据100 每页10条 10页"""
"""总数据99 每页10条 10页"""
"""总数据101 每页10条 11页"""
num,more=divmod(233,10)
if more:
num+=1
print('总共需要%s业'%num)
# 10.eval()只能识别简单的语法 exec()可以识别复杂语法 都是将字符串中的数据内容加载并执行
res="""
你好啊
for i in range(10):
print(i)
"""
res="""
print('hello world')
"""
eval(res)
exec(res)
# 11.isinstance() 判断是否属于某个数据类型
print(isinstance(123,float)) #False
print(isinstance(123,int)) # True
# 12.pow()
print(pow(4,3)) # 4*4*4
# 13.round() 四舍五入
print(round(4.8))
print(round(4.6))
print(round(8.5))
# 14.sum() 求和
l=[11,22,33,44,55,66]
print(sum(l))