生成器,yield传值,常用函数
目录
- for循环本质
- 迭代取值与索引取值对比
- 生成器对象
- 自定义range功能
- yield传值
- yield与return对比
- 生成器表达式
- 常见内置函数
for循环本质
d = {'name':'junjie', 'pwd':123, 'hobbuy':'read'}
res = d.__iter__() # 转换可迭代对象 | StopIteration
while True:
try:
print(res.__next__()) # 转换为迭代器
except StopIteration as e:
break
for i in d:
print(i)
# 输出结果:
name
pwd
hobby
name
pwd
hobby
# 两者结果一致
迭代取值与索引取值对比
迭代取值:
优点:
不依赖于索引的一种通用取值方式
缺点:
取值的顺序永远都是固定的从做往右,无法重复获取
索引取值:
缺点:
需要提供有序容器类型才可取值(不是一种通用方式)
优点:
可以重复取值
生成器对象
# 生成器就是自定义迭代器
定义阶段就是一个普通函数
def my_ge():
print('start')
yield 123, 223, 323
print('end')
res = my_ge()
ret = res.__next__()
print(ret)
res.__next__()
# 输出结果:
start
(123,223,323)
end
报错
'''
当函数体内含有yield关键字,那么在第一次调用函数的时候
并不会执行函数体代码,而是将函数变成了生成器(迭代器)
'''
自定义range功能
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)
# 0~9
res = my_range(1, 10)
for i in res:
print(i)
# 1 ~ 9
yield传值
def eat(name):
print('%s 准备干饭' % name)
while True:
food = yield
print('%s 正在吃 %s' % (name, food))
res = eat('junjie') # 并不会执行代码,转换成生成器
res.__next__()
res.send('肉包子')
res.send('盖浇饭')
# send 自带双下next
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 != 44]
print(res)
# [12, 23, 34, 56, 67, 78, 89, 100]
res = (i+1 for i in l if i != 44)
ret =res.__next__
print(ret)
# 12
'''
迭代器对象,生成器对象,都可以看成是'工厂'
只有当我们所要数据的时候工厂才会加工出'数据'
'''
- 生成表达式
# 求和
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)
-------------------------------
# 求和
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循环
g = (add(n, i) for i in g)
第二次for循环
g = (add(10, i) for i in (add(10, i) for i in g))
常见内置函数
- abs( ) 绝对值
print(abs(123))
print(abs(-123))
#
123
123
'''
计算机语言中,正数的二进制首位(即符号位)为0,负数的二进制首位为1。
32位系统下,4字节数,求绝对值的函数为abs(x)。
无论是绝对值的代数意义还是几何意义,都揭示了绝对值的以下有关性质:
(1)任何有理数的绝对值都是大于或等于0的数,这是绝对值的非负性。
(2)绝对值等于0的数只有一个,就是0。
(3)绝对值等于同一个正数的数有两种,这两个数互为相反数或相等。
(4)互为相反数的两个数的绝对值相等。
(5)正数的绝对值是它本身。
(6)负数的绝对值是它的相反数。
(7)0的绝对值是0。
'''
- all( ) any( )
l = [11, 22, 33, 0] # 0 是 False
print(all(l))
# False
所有的元素都是True的结果才是True
l = [11, 22, 33, 0]
print(all(l))
# 所有的元素 只要 有一个 是Trur结果就是True
- bin( ) , oct( ) , hex( )
print(bin(123))
print(oct(123))
print(hex(123))
0b1111011
0o173
0x7b
# 进制数
- Bytes( ) , str( )
res = '厉害'
res1 = bytes(res,'utf8')
print(res1)
# b'\xe5\x8e\x89\xe5\xae\xb3'
把字符串转换成二进制
res = '厉害'
res = bytes(res, 'utf8')
res1 = str(res,'utf8')
res2 = res.encode('utf8')
res3 = res1.decode('utf8')
print(res1)
# 厉害
- Callable( )
s1 = 'junjie'
def index():
pass
print(callable(s1), callable(index))
# False True
查看是否可调用(能不能加括号运行)
- chr( ), ord( )
print(chr(65)) # 根据ASCII码转数字找字符
print(ord('A')) # 65
- Complex( ) 复数
print(complex(123)) # (123+0j)
- Dir( )
def index():
pass
print(dir(index))
print(index.__name__)
# pycharm去看看
- divmod( )
def index():
print(dicmod(101, 10))
"""总数据100 每页10条 10页"""
"""总数据99 每页10条 10页"""
"""总数据101 每页10条 11页"""
# num,more = divmod(233,10)
# if more:
# num += 1
# print('总共需要%s页'%num)
- eval( ), exec( )
eval()只能识别简单的语法 exec()可以识别复杂语法 都是将字符串中的数据内容加载并执行
res = """
你好啊
for i in range(10):
print(i)
"""
res = """
print('hello world')
"""
eval(res)
exec(res)
- isinstance( )
isinstance() 判断是否属于某个数据类型
print(isinstance(123,float)) # False
print(isinstance(123,int)) # True
- pow( )
print(pow(a, b)) # a的b次方
- round ()
# print(round(4.8))
# print(round(4.6))
# print(round(8.5))
五舍六入
- sum()
sum()
# l = [11,22,333,44,55,66]
# print(sum(l))
# 求和