for循环本质
d = {'name','lee', 'pwd', '123', 'hobby','read'}
res = d_iter_()
while True:
try:
print(res._next_())
excpet StopIteration as e:
baeak
for i in d
print(i)
迭代取值与索引取值对比
迭代取值
优点
不依赖索引取值的一种方法
缺点
取值顺序永远都是从左往右,无法重复取值
索引取值
优点
可以重复取值
缺点
需要有容器猜可以取值
生成器对象
生成器其实就是自定义迭代器
定义阶段就是一个普通函数
def my_age():
print('first')
yield 111, 222, 333
print('second')
yield 555 666 777
"""函数体有yield关键字,那么第一次调用函数时不会执行函数体代码
而是将函数变成了生成器"""
# 函数:不执行函数体代码 而是转换为生成器(迭代器)
# res = my_ge()
# ret = res.__next__() # 每执行一个__next__代码往下运行到yield停止 返回后面的数据
# print(ret)
# ret = res.__next__() # 再次执行__next__接着上次停止的地方继续往后 遇到yield再停止
# print(ret)
自定义range功能
# yield方法
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(10)
for i in res:
print(i)
# for循环
res = my_range(1, 10)
for i in res:
print(i)
补充yield传值
def eat(name):
print('%s 准备干饭!' % name)
while True:
food = yield
print('%s正在吃%s' % (name, food))
res = eat('jason') # 并不会执行代码,而是转换成生成器
res._next_()
res.send('包子')
res.send('胡辣汤')
yield与return对比
yield
1.可以返回值(支持多个并组织成元组)
2.函数体代码遇到yield不会结束只是停住
3.yield可以将函数变成生成器,并且可以传值
return
1.可以返回值(支持多个并组织成元组)
2.函数体代码遇return直接结束
生成器表达式
l = [11, 22, 33, 44, 55, 66, 77, 88, 99]
# 普通方法
# res = [i + 1 for i in l if i != 55]
# print(res)
# 生成器表达式
res1 = (i + 1 for i in l if i != 55)
# 生成器表达式内部代码只有在迭代取值的时候才会执行
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)
res = list(g)
print(res)
# 执行结果 [20,21,22,23]
常见内置函数
1 .abs() 绝对值
print(abs.(46))
print(abs.(-46))
2 .all() any()
l = [11,22,33,0]
print(all(l)) # 所有元素都为True结果才是True 0是None
pring(any(l)) # 所有元素只要有一个为True,结果就是True
3 .bin() .oct() .hex() 进制数
4 .bytes() str() # 解码编码
res = '我命由我不由天'
res1 = bytes(res,'utf8')
print(res1)
res2 = str(res1,'utf8')
print(res2)
res1 = res.encode('utf8')
print(res1)
res2 = res1.decode('utf8')
print(res2)
5 .callable() # 是否可以调用(能不能加括号运行)
6 .chr() ord()
print(chr(72)) # 根据ASCIIC码数字找字符
print(ord('A')) # 根据字符找数字
7 .complex() # 复数
8 .dir() # 查看当前对象可调用的名字
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() # 判断是否属于某个数据类型 布尔值的形式
12 .pow()
print(pow(4, 3)) # 4的3次方
13 .round() # 四舍五入的意思,在python 五舍六入
14 .sunm() # 求和