生成器中取值的三种方法
方法1:next()
方法2:for 循环
方法3:数据类型的强制转换
def func():
for i in range(20):
yield '赛车*{}'.format(i) ret = func()
print(ret.__next__()) for i in ret:
print(i) l1 = list(ret)
print(l1)
send() 方法
send 获取下一个值得时候给上一个yield位置传递一个数据
第一个 yiled 必须使用next 获取下一个值
最后一个yield 不能接受任何值
def func():
print(1)
con = yield 111
print('yield1 的返回值测试:',con) print(2)
con2 = yield 222 g = func()
ret1 = g.__next__()
print(ret1) ret2 = g.send('hello,world')
print(ret2)
1
111
yield1 的返回值测试: hello,world
2
222
send方法获取动态平均值小练习
简略版分析:
def avg():
sum = 0
count = 0
avg = 0
num = yield # next方法执行至此,执行yield之前的所有函数。下面执行send方法时,执行赋值给num
sum += num
count += 1
avg = sum/count
yield avg avg_g = avg()
avg_g.__next__()
last = avg_g.send(10)
print(last)
进阶版本:
def avg():
sum = 0
count = 0
avg = 0
while True:
num = yield avg # 直接传参,避免count = 0无法执行报错
count += 1
sum += num
avg = sum / count avg_g = avg()
avg_g.__next__()
last = avg_g.send(10)
print(last)
last1 = avg_g.send(20)
print(last1)
10.0
15.0
yield from 方法
在生成器函数中,可以替代 for 循环取值
def func():
a = 'abcde'
b = ''
yield from a
yield from b
g = func()
for i in g:
print(i)
列表推到式
记住就行了,不难
print([i for i in range(10)])
print(['倒数15个数:{}'.format(i) for i in range(5,0,-1)])
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
['倒数15个数:5', '倒数15个数:4', '倒数15个数:3', '倒数15个数:2', '倒数15个数:1']
生成器表达式
列表表达式会将结果全部打印出来,占内存。
print((i for i in range(10)))
<generator object <genexpr> at 0x00000244643515C8>
例:1到10 取每个数的平方
g = (i**2 for i in range(10))
for i in g:
print(i)
列表推导式
例1:30以内所有能被3整出的数,以及此数的平方
ret = [i for i in range(30) if i%3 == 0]
print(ret) ret = [i*i for i in range(30) if i%3 == 0]
print(ret)
例2:找到嵌套列表中名字含有两个 ‘e’ 的所有名字
嵌套列表有点意思,两个循环
names = [['tom','aa','aece'],['bob','bcde','edde']]
ret = [name for i in names for name in i if name.count('e') == 2]
print(ret)
字典推导式:
例1:将字典的 key 和 value 对调位置
shop = {'手机':1000,'电脑':3000,'鼠标':100}
shop2 = {shop[k]:k for k in shop}
print(shop2)
例2:合并字典大小写对应的value值,将k统一成小写
利用了一个字典的查找功能,找不到可以自定义返回值,很好用
mcase = {'a':10,'b':30,'A':7,'Z':3}
mcase2 = {k.lower():mcase.get(k.lower(),0) + mcase.get(k.upper(),0) for k in mcase}
print(mcase2)
字典的get 方法
a = {'a':10,'b':20}
ret1 = a.get('a',100)
ret2 = a.get('c',30)
print(ret1,ret2) 10 30
python3 集合
集合(set)是一个无序的不重复元素序列。
可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
>>>basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
>>> print(basket) # 这里演示的是去重功能
{'orange', 'banana', 'pear', 'apple'}
>>> 'orange' in basket # 快速判断元素是否在集合内
True
>>> 'crabgrass' in basket
False
>>> # 下面展示两个集合间的运算.>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a
{'a', 'r', 'b', 'c', 'd'}
>>> a - b # 集合a中包含而集合b中不包含的元素
{'r', 'd', 'b'}
>>> a | b # 集合a或b中包含的所有元素
{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
>>> a & b # 集合a和b中都包含了的元素
{'a', 'c'}
>>> a ^ b # 不同时包含于a和b的元素
{'r', 'd', 'b', 'm', 'z', 'l'}
集合推导式
集合推导式类似于列表推导式,自带去重功能
ret1 = {i**2 for i in [-1,1,2]}
print(ret1)
{1,4}