一、三元运算(三目运算)
简单的条件语句
if 条件成立:
a = 1
else:
a = 2
改成三元运算:
a = 1 if 条件成立 else 2
列表解析
list_eggs = []
for i in range(10):
list_eggs.append('鸡蛋%s' % i)
print(list_eggs)
改成三元
list_eggs = ['鸡蛋%s' % i for i in range(10)]
print(l)
生成器表达式
laomuji = ('鸡蛋' % i for i in range(10)) #生成器表达式
print(laomuji) #迭代器对象
print(laomuji.__next__()) # 下蛋咯
print(next(laomuji)) #本质调用 __next__()
总结:
1.把列表解析的[]换成()得到的就是声称其表达式
2.列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存
迭代器协议:是指对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个,StopIteration
生成器
(1)语法上与函数类似,生成器函数和常规函数几乎是一样的,都是使用def语句进行定义,差别在于,生成器使用yield语句返回一个值,而常规函数使用return返回一个值
(2)自动实现迭代器协议,对于生成器,python会自动实现迭代器协议,所以可以调用next()方法,并且在没有值返回时,生成器自动产生Stopiteration异常,以终止迭代。
(3)状态挂起,生成器使用yield语句返回一个值,yield语句挂起该生成器函数的状态,保留足够的信息,以便之后它离开的地方继续执行。
(4)优点:生成器的好处是延迟计算,一次返回一个结果,不会一次生成所有的结果,这对于大数据处理,非常有用;
列表解析
sum([i for i in range(100000000000000)])#内存占用大,机器容易卡死
#生成器表达式
sum(i for i in range(100000000))#几乎不占内存
还能有效提高代码的可读性。
#不使用生成器
def func():
ret = []
for i in range(100):
ret.append('user%s' % i)
return ret
#使用生成器
def func():
for i in range(100):
yield 'user%s' % i
注:生成器只能遍历一次
例子 获取城市人口占总人口百分比
人口信息.txt文件内容
{'name': '北京','population': 100000000}
{'name': '上海','population': 10000000}
{'name': '天津','populati