python推导式
for 后面是可迭代类型就可以
##列表推导式(list)
[输出表达式 for 临时变量 In iterable]
*[输出表达式 for 临时变量 In iterable if 条件表达式(条件成立的东西输出结果)] *
[输出表达式 for 临时变量 In iterable for 临时变量 In iterable if 条件表达式(条件成立的东西输出结果)]
[输出表达式1 if条件 else 输出表达式2 for 临时变量 In iterable for 临时变量 In iterable if 条件表达式(条件成立的东西输出结果)]
python推崇简单明了—对于复杂的内容封装成函数
#找出30以内能被3整除的数
a=[0-29]
c=[i for i in range(30) if i%3==0]
print(c)
a=[0-29]
c=[i*i for i in range(30) if i%3==0]
print(c)
从名字里找出符合条件的
传统方法
result=[]
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva', 'Elven']]
for item in names:
for i in item:
if i.count('e')==2:
print(i)
result.append(i)
print(result)
列表推导式方法
result=[i for item in names for i in item if i.count('e')==2]
print(result)
如果一个数能被2整除 且能被四整除返回字符串类型 不能被四整除返回 浮点类型
列表推导方法
c=[str(i) if i%4==0 else float(i) for i in range(100) if i%2==0 ]
print(c)
传统方法
for x in range(6):
if x%2==0:
for y in range(6):
if y%2==1:
result.append((x,y))
print(result)
result=[(x,y) for x in range(6) if x%2==0 for y in range(6) if y%2==1]
print(result)
##字典推导式(dict){key :value if 条件 else value2 for 临时变量 In iterable if 条件表达式}
#列表
[i for i in x if expres]
#字典
{key:value for item in obj}
dic={'a':1,'b':2,'c':3,'d':4}
result={key:dic[key] for key in dic if key!='a'}
print(result)
##集合推导式(set)set会去重
练习题
q3={'a':10,'b':34}
result={value:key for key,value in q3.items()}
print(result)
result={}
for key,value in q4.items():
result[key.lower()]=q4.get(key.lower(),0)+q4.get(key.upper(),0)
print(result)
q4 = {'B': 3, 'a': 1, 'b': 6, 'c': 3, 'A': 4}
result = {key.lower(): q4[key.lower()]+q4[key.upper()] if key.lower() in q4 and key.upper() in q4 else q4[key] for key in q4}
print(result)
容器
容器:把多个元素组织在一起的数据结构,in,not in
迭代器
可迭代对象:可返回迭代对象 (面试最佳:可迭代对象定义了一个_iter_方法,_iter_方法返回一个迭代器)
如何判断对象是不是迭代器
- iter,next(y),y.next()
- isinstance(obj,Iterable)
- from collections.abc import Iterable
print(isinstance(‘avb’,Iterable))
print(isinstance(a,Iterable))
迭代器特点----不占空间 惰性求值 lazy
- 将可迭代对象通过iter() ==》获取迭代器
- 只能通过next 向后取值,不能通过下标随机取值,不能往回去取值
- 迭代器所有类型的 列表 、元组类型
- 有状态==》内部会记录一些数据 告诉我们取到几了 不存储我们所有数据 只存储当前的状态和方法
- 生成无限序列 10~+
生成器
生成器是特殊的迭代器
生成器表达式
生成器函数 => 定义了一个函数,在这个函数中有yield关键字
生成器函数 => 调用该函数会创建一个生成器
产生字符串需要cup疯狂计算
数据超过缓冲区大小就会写入磁盘
面试问题:
(1)可迭代对象和迭代器的区别?
- 面试官更想听 实战 应用层面的东西
- 区别 各自的优缺点+应用场景
(2)迭代器和生成器的区别?
- 生成器是一种特殊的迭代器
- 迭代器 =》 定义一个类 =》 自己去实现__iter__,__next__方法
- 生成器 =》 生成器函数(yield自动生成__iter__,__next__方法),生成器表达式
为什么要使用生成器?因为效率。
使用生成器表达式取代列表推导式可以同时节省 cpu 和 内存(RAM)。
如果你构造一个列表(list)的目的仅仅是传递给别的函数,
比如 传递给tuple()或者set(), 那就用生成器表达式替代吧!
生成器表达式:类似于列表推导,只不过是把一对大括号[]变换为一对小括号()。但是,生成器表达式是按需产生一个生成器结果对象,要想拿到每一个元素,就需要循环遍历。