#列表推导式
# 旧的列表---》新的列表
'''
1.列表推导式: 格式1:[返回的东西 for 变量 in 旧列表]
格式2:[返回的东西 for 变量 in 旧列表 if 条件]
字典推导式
集合推导式
'''
#过滤长度小于等于3的人名
names=['tom','lily','abc','jack','steven','bob']
result=[name for name in names iflen(name)>3]print(result)#['lily','jack','steven']'''
def func(names):
newlist=[]for name in names:iflen(name)>3:
newlist.append(name)return newlist
'''
#for name in names iflen(name)>3 符合条件的元素的name.capitalize()添加到一个新列表里
result=[name.capitalize()for name in names iflen(name)>3]print(result)#['Lily','Jack','Steven']
#将1-20之间能被3整除,组成一个新的列表
result=[i for i in range(1,21)if i%3==0]print(result)#[3,6,9,12,15,18]
#元组第一个数字为0-5之间的偶数,第二个数字为0-5之间的奇数
#[(偶数,奇数),(),()][(0,1),(0,3),(0,5),(2,1),(2,3)]
newlist =[(x,y)for x in range(6)if x%2==0for y in range(6)if y%2!=0]print(newlist)
#[(0,1),(0,3),(0,5),(2,1),(2,3),(2,5),(4,1),(4,3),(4,5)]'''
def func():
newlist=[]for i in range(6):if i%2==0:for j in range(6):if j%2!=0:
newlist.append((i,j))return newlist
'''
#list1=[[1,2,3],[4,5,6],[7,8,9],[1,3,5]]-->[3,6,9,5]
list1=[[1,2,3],[4,5,6],[7,8,9],[1,3,5]]
newlist=[i[-1]for i in list1]print(newlist)
#如果薪资大于5000则加200,小于等于5000则加500
dict1={'name':'tom','salary':5000}
dict2={'name':'lucy','salary':8000}
dict3={'name':'jack','salary':4500}
dict4={'name':'lily','salary':3000}
list1=[dict1,dict2,dict3,dict4]
newlist=[employee['salary']+200if employee['salary']>5000else employee['salary']+500for employee in list1 ]print(newlist)#[5500,8200,5000,3500]'''
if单独使用只能放在后面
ifelse配套使用只能放在前面 if条件成立执行其前面的,不成立则执行其后面的
'''
集合推导式
#集合推导式
set1={1,2,1,3,5,2,1}
# print(type(set1))
set1={x+1for x in set1}print(set1)
set2={1,2,1,3,5,2,1,8,9,8,9,7}
set2={x for x in set2 if x>5}print(set2)'''
{2,3,4,6}{8,9,7}'''
#字典推导式
dict1={'a':'A','b':'B','c':'C','d':'C'}print(dict1.items())
newdict={value:key for key,value in dict1.items()}print(newdict)'''
dict_items([('a','A'),('b','B'),('c','C'),('d','C')]){'A':'a','B':'b','C':'d'}'''
生成器
#定义生成器得方式一 圆括号
'''
通过列表推导式,我们可以直接创建一个列表
但是,受到内存的限制,列表容量肯定是有限的
而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间
如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环过程中不断推算出后续的元素呢?
这样就不必创建完整的list,从而节省大量的空间
在python中,这种一边循环一边计算的机制,称为生成器
'''
#列表推导式
newlist =[x*3for x in range(5)]print(newlist)#[0,3,6,9,12]
#生成器用圆括号表示,#大括号有可能是集合推导式也可能是字典推导式,方括号是列表推导式,圆括号是生成器
g=(x*3for x in range(5))print(type(g))#<class'generator'>
#得到元素的两种方式
print(g.__next__())print(g.__next__())print(next(g))print(next(g))'''
0369'''
print(next(g))
#下面一句超过了能取得范围
# print(next(g))'''
Traceback (most recent call last):
File "D:/pythonFile/hanshu/generatorr7/func03.py", line 31, in <module>print(next(g))
StopIteration
'''
q=(x for x in range(6))while True:try:
e=next(q)print(e)
except:print('没有更多元素拉!')break'''
012345
没有更多元素拉!
'''