4 三元表达式 列表解析 生成器表达式
三元表达式
#!/usr/bin/env python3 # _*_ coding:utf-8 _*_ # @File : 三元表达式 # @Version : 1.0'''三元表达式能实现简单的 if else 语句 so....有那三元呢:自己理解1. 左边成立执行的代码 2. if 判断条件 3. esle 不成立所执行的代码-- 最后的结果用变量接收 '''# 简单的 if else 语句: num = 7if num > 10:print('大于10的数字') else:print('小于10的数字')# -------------------------def max2(x,y):if x > y:return xelse:return yprint(max2(3,7))# 三元表达式:将简单的 if els 写在一行,赋值给一个变量接受 ret = '大于10的数字' if num > 10 else '小于10的数字' print(ret)# ---------------------------------------------def max2(x,y):return x if x > y else yprint(max2(3,7))# --------------------------------------------- days = 45result = '必掀起大浪' if days >= 45 else 'select' print(result)
列表解析 生成器表达式
#!/usr/bin/env python3 # _*_ coding:utf-8 _*_ # @File : 列表解析 # @Version : 1.0from collections import Iterator''' 将迭代数据,利用列表解析,生成新的列表。但数量大的时不可用列表解析,会引爆内存。'''# 取得列表元素的平方 l = [11,22,33,44,55,66,77,88,99] new_l = []# 1 正常解析for k in l:new_l.append(k**2)print(new_l) # [121, 484, 1089, 1936, 3025, 4356, 5929, 7744, 9801]# -----------------------------------------------------------------------------------------# 2 列表解析 ret = [ k**2 for k in l ]print(ret) # [121, 484, 1089, 1936, 3025, 4356, 5929, 7744, 9801] 效果一样# 3 列表解析时也可加入条件'''[ 列表解析肯定要用list包起来 表达式之间空格即可 不需要写特殊分隔符 结果肯定也是个list ]列表解析的好处缩减代码两 ''' # [ 列表最左边对解析出的每一个元素处理 中间是解析语句 最右边是过滤条件 ] ret = [ k**2 for k in l if k > 44 ]print(ret) # [3025, 4356, 5929, 7744, 9801]# 再弄个例子 l2 = ['tony','seven','eggtea']new_l2 = [ k.capitalize() for k in l2 ]print(new_l2) # ['Tony', 'Seven', 'Eggtea']# -----------------------------------------------------------------------------------------# 将 [] 换成() 会是啥玩意呢 --- 生成器表达式 new_l2_ = ( k.capitalize() for k in l2 )print(new_l2_) # <generator object <genexpr> at 0x7f194c8982b0> 是个生成器print(type(new_l2_)) # <class 'generator'> 是个生成器print(isinstance(new_l2_,Iterator)) # True 迭代器 __iter__ ,__next__ print(next(new_l2_)) # Tony print(next(new_l2_)) # Seven print(next(new_l2_)) # Eggtea# so ... list_old = [1,2,3,4,5,6,7,8,9]new_list = ( k**2 for k in list_old if k > 4 ) # [] 换成了() 结果是 generatorprint(new_list) # <generator object <genexpr> at 0x7f2d59946410>for i in new_list:print(i)'''so ... 将列表解析的 [] 换成 () 结果是一个生成器(迭代器)不确定生成器里元素的数量时不要用next 取值 用 独有特性的 for 循环 取值 '''# 列表解析 [] 换成 () 后 结果是个生成器, 就成了生成器表达式,这样解析数量大的时就不会爆内存了 # 弄个例子# ret = [ 'egg%s' %k for k in range(100000000)] 这种情况内存吃不了 g = ('egg%s' %k for k in range(10000000000000000)) # 数据在大也无妨,next 只有一个值在内存中print(g.__next__()) print(g.__next__()) print(g.__next__()) print(g.__next__()) print(g.__next__()) # 可以无限next g1 = ('egg%s' %k for k in range(10000000000000000) if k == 9) # 后面加上过滤条件print(next(g1)) # 生成器里就一个过滤成功的一个值,只能next一次 #print(next(g1)) # StopIteration Error # ------------------------------------------------------------------------------------------# 生成器表达式应用场景于读取大文件比较好 with open('test.c',encoding='utf-8') as f_read:g=( line.strip() for line in f_read ) # 去掉换行符,整个文本搞成生成器print(next(g))print(next(g))for k in g:print(k)print(100*'{0}'.format('-'))'''这里循环生成器不行,此时文件已关闭,生成器不存在了for i in g:print(i) # ValueError: I/O operation on closed file'''# 在弄个例子 --如:数据库中的数据 ''' apple 10 3 tesla 100000 1 mac 3000 2 lenovo 30000 3 chicken 10 3 '''# 计数总消费 with open('db.txt',encoding='utf-8') as f:'''ret = [ float(line.split()[1]) * int(line.split()[2]) for line in f]print(ret) # [30.0, 100000.0, 6000.0, 90000.0, 30.0]print(sum(ret)) # 196060.0'''cont = sum(float(line.split()[1]) * int(line.split()[2]) for line in f)print(cont) # 196060.0# 格式化输出数据 [{'name':xxx,},{'price':xxxx},{'price':xxx}] with open('db.txt',encoding='utf-8') as f_read:goods_info = [ {'name':line.split()[0],'price':line.split()[1],'count':line.split()[2]} for line in f_read ]print(goods_info) # [{'count': '3', 'name': 'apple', 'price': '10'},# {'count': '1', 'name': 'tesla', 'price': '100000'},# {'count': '2', 'name': 'mac', 'price': '3000'},# {'count': '3', 'name': 'lenovo', 'price': '30000'},# {'count': '3', 'name': 'chicken', 'price': '10'}]
转载于:https://www.cnblogs.com/liushubao/p/7700729.html
4 三元表达式 列表解析 生成器表达式相关推荐
- 三元表达式列表解析生成器表达式
三元表达式 列表解析 生成器表达式 三元表达式 在作简单的判断时,三元表达式能简化代码: def max(x, y):if x > y:return xelse:return y # 这个函数可 ...
- python二十二:迭代,三元表达式,列表解析
迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代(只能往后走,不能往前退) 可迭代对象:实现了迭代器协议的对象( ...
- day13 生成器 三元运算 列表解析
本质上来说生成器迭代器都是一种数据类型,如果你直接打印生成器是无法得出值的,会得到一串内存地址,即一个对象想要得到生成器的值必须要用for或者next,list等来获取 生成器生成器就是一个可迭代对象 ...
- 列表生成式,生成器表达式,模块的使用
三元表达式 无论条件成立与否都要返回一个值, 用于简化仅有一个判断的函数(或代码块)递归 递归有循环调用的次数限制,调用函数时,函数相关数据要入栈,而栈区是有限的 二分查找法匿名函数 仅能在定义时使用 ...
- Python - 列表解析式/生成器表达式
列表解析式: [expr for iter_var in iterable if cond_expr] 生成器表达式: (expr for iter_var in iterable if cond_e ...
- 三元表达式,列表解析和生成器表达式
三元表达式 在以前,在诸如比较两个数大小的时候,通常的写法都是下面的样子 if x > y:print("the max is x") else:print("th ...
- 初学者python笔记(迭代器、生成器、三元表达式、列表解析、send()与yield())
文章目录 迭代器与for循环的关系 1. 迭代器协议 2. 可迭代对象 3. for循环的本质 4. 强大的for循环机制 5. 迭代器如何工作的 6. while循环模拟for循环与迭代器的结合 7 ...
- Python开发——函数【迭代器、生成器、三元表达式、列表解析】
递归和迭代 小明问路篇解释说明 递归:小明-->小红-->小于-->小东:小东-->小于-->小红-->小明 小明向小红问路,因小红不知道,所以向小于问路,因小于不 ...
- python迭代器和生成器(3元运算,列表生成式,生成器表达式,生成器函数)
1.1迭代器 什么是迭代器: 迭代器是一个可以记住遍历的位置对象 迭代器对象从集合的第一个元素元素开始访问,直到所有元素被访问完结束,迭代器只能往前不会后退. 迭代器有两个基本方法:iter ,nex ...
最新文章
- zabbix 乱码的问题
- 自然语言处理NLP之文本摘要、机器翻译、OCR、信息检索、信息抽取、校对纠错
- 金融类APP不得强制读取通讯录
- js如何判断字符串里面是否含有某个字符串
- python安装完后无法打开运行_安装Python完成后无法正确运行
- oracle 日期格式转换 ‘ddMONyyyy’ 'ddMMMyyyy'
- VS2010 发布网站时文件丢失解决办法
- 【转载】关于 Google Chrome 中的全屏模式和 APP 模式
- SmartTemplate学习入门一
- python list保存至csv文件
- 学习如何看懂SQL Server执行计划(一)——数据查询篇
- 下载UltraEdit UE 破解版方法
- 04【副词】(Adverb)位置,形态,时间/频度副词,强调?
- 刘洪波《英文字根词源精讲》完整目录
- 泉城济南——三妮儿暴走一日游
- 程序员如何增加收入?
- python isidentifier_【我们一起自学Python】-字符串操作
- 主流操作系统的开发语言
- 后端人眼中的Vue(五)
- PEO-b-PTMPM的嵌段共聚物复合囊泡/具有pH响应性的纳米颗粒/卤化银纳米粒子/聚合物纳米