一,生成器表达式

#生成器表达式比列表解析更省内存,因为惰性运算

 #!/usr/bin/env python
#_*_coding:utf-8_*_ new_2 = (i*i for i in range(100)) #生成器表达式
print(list(new_2))
#注意括号是小括号

对比

#!/usr/bin/env python
#_*_coding:utf-8_*_ # egg_list=['鸡蛋%s' %i for i in range(10)] 列表推倒式
# print(egg_list) # laomuji = ('鸡蛋%s' %i for i in range(1,11)) 生成器表达式
# print(laomuji)
# print(next(laomuji))
# print(next(laomuji))

小知识

 #!/usr/bin/env python
#_*_coding:utf-8_*_ #小知识
def func():
yield from 'ABC' #相当于下面的for i in
# for i in 'ABC':
# yield i
g = func()
print(next(g))

二,各种推导式

#推导式套路
# variable = [out_exp_res for out_exp in input_list if out_exp == 2]
# out_exp_res:  列表生成元素表达式,可以是有返回值的函数。
# for out_exp in input_list:  迭代input_list将out_exp传入out_exp_res表达式中。
# if out_exp == 2:  根据条件过滤哪些值可以。

1.列表推导式

 #!/usr/bin/env python
#_*_coding:utf-8_*_ #列表推导式
#普通版本
new_l = []
for i in range(100):
new_l.append(i*i)
list(range(100))
#进阶版本
new_l = [i*i for i in range(100)] #列表推倒式
print(new_l) print(len([ i+5 for i in range(100) if i % 3 == 0 ]))
#执行过程 for >> if >> i+5 >> append[i+5]
#详解过程
# new_l = []
# for i in range(100):
# if i % 3 == 0:
# new_l.append(i+5) print(len([i//2 if i%2==0 else i for i in range(100) if i % 3 == 0 ])) #三元运算肯定要返回个值
#执行过程 for >> 后if >> 前if >> append[i//2]
#详解过程
# for i in range(100):
# if i % 3 == 0:
# if i%2 == 0:
# new_l.append(i//2)
# else:
# new_l.append(i) # 30以内的数字,所有能被3整除的整数
print([i for i in range(30) if i%3 == 0])
# 30以内的数字,所有能被3整除的整数的平方
print([i*i for i in range(30) if i%3 == 0])
# 找到嵌套列表中名字含有2个'e'的所有名字
# names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
# ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
# print([name for lst in names for name in lst if name.count('e') >=2]) 从前往后看
# 执行过程
# 第一个for >> 第二个for >> if >> append[name]

2.字典推导式

 #!/usr/bin/env python
#_*_coding:utf-8_*_ #字典推导式
# 将一个字典的key和value对调
mcase = {'a': 10, 'b': 34}
for i in mcase:
print(i)
#[i for i in mcase] #列表推导式
print({key:key+'' for key in mcase}) #更改k
print({key:mcase[key] for key in mcase}) #取values
print({mcase[key]:key for key in mcase}) #kv 对调 #合并大小写对应的value值,将k统一成小写
mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
mcase_frequency = {k.lower(): mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0) for k in mcase}
print(mcase_frequency)
# 执行过程
# for k in mcase >> k.lower() : values >> mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0) >> {}
# mcase.get# (k.lower(), 0) get 到了就返回值,get不到就返回0

3.集合推导式

 #!/usr/bin/env python
#_*_coding:utf-8_*_ #集合推导式,自带去重功能
l = [-1,1,2,1]
print({i for i in l})
print({i*i for i in l})

小结:练习题

 #!/usr/bin/env python
#_*_coding:utf-8_*_ #练习题
# 例1:  过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
str_l = ['a','ab','abc','abcd','abcde']
print([i.upper() for i in str_l if len(i) > 3])
# 例2:  求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表
print([(x,y) for x in range(5) if x % 2 == 0 for y in range(5) if y % 2 == 1])
# 例3:  求M中3,6,9组成的列表M = [[1,2,3],[4,5,6],[7,8,9]]
M = [[1,2,3],[4,5,6],[7,8,9]]
print([i[2] for i in M])

python开发函数进阶:生成器表达式&各种推导式的更多相关文章

  1. Python-02 生成器表达式,列表推导式

    列表推导式和生成器表达式 列表推导式,生成器表达式1,列表推导式比较直观,占内存2,生成器表达式不容易看出内容,省内存. [ 变量(加工后的数据) for  变量i  in 可迭代的数据类型 ] 列表 ...

  2. python之迭代器、生成器及列表推导式

    一.迭代器 迭代器就是迭代的工具,迭代是一个重复的过程,每次重复都是一次迭代并且每次迭代的结果都是下次迭代的初始值. lst=[1,2,3,4,5] count=0 while count<le ...

  3. Python进阶-VI 生成器函数进阶、生成器表达式、推导式

    一.生成器函数进阶 需求:求取移动平均数 1.应用场景之一,在奥运会气枪射击比赛中,每打完一发都会显示平均环数! def show_avg(): print('你已进入显示移动平均环数系统!') a ...

  4. Python开发基础-Day10生成器表达式形式、面向过程编程、内置函数部分

    生成器表达式形式 直接上代码 # yield的表达式形式 def foo(): print('starting') while True: x=yield #默认返回为空,实际上为x=yield No ...

  5. python基础学习Day12 生成器、列表推导式、字典的表达式、字典键值对的互换、集合推导式

    一.生成器 1.1 生成器:就是(python)自己用代码写的迭代器,生成器的本质就是迭代器. 1.2 生成器函数 def func1(x): x += print() yield x print() ...

  6. 【python】 迭代器、生成器、列表推导式

    一.可迭代对象.迭代器 1.可以被for循环的数据类型(可迭代对象): 字符串(str).列表(list).字典(dict).元祖(tuple).range() 2.迭代器 2.1 将可迭代对象==& ...

  7. python开发函数进阶:可迭代的&迭代器&生成器

    一,可迭代的&可迭代对象 1.一个一个的取值就是可迭代的   iterable#str list tuple set dict#可迭代的 ——对应的标志 __iter__ 2.判断一个变量是不 ...

  8. python开发函数进阶:匿名函数

    一,匿名函数 #简单的需要用函数去解决的问题 匿名函数的函数体 只有一行#也叫lambda表达式# cal2(函数名) = lambda n(参数) : n*n(参数怎么处理,并且返回值)#参数可以有 ...

  9. python开发函数进阶:装饰器

    一,装饰器本质 闭包函数 功能:就是在不改变原函数调用方式的情况下,在这个函数前后加上扩展功能 作用:解耦,尽量的让代码分离,小功能之前的分离. 解耦目的,提高代码的重用性 二,设计模式 开放封闭原则 ...

随机推荐

  1. python学习笔记(excel+unittest)

    准备先利用之前整理的python自带的unittest框架 整合excel 实现接口自动化测试功能 先看看excel表格设置: 下来是对excel获取的代码: #!/usr/bin/env pytho ...

  2. 包嗅探和包回放 —tcpdump、tcpreplay--重放攻击

    攻击方式:tcpdump 进行嗅探,获取报文消息:然后用tcpreplay回放攻击 arp欺骗可以使用 arpspoof kali linux有这三个工具 转载地址https://www.cnblog ...

  3. appium自动化测试(五)

    1. 页面封装——理性判断 2. basepage——定位表达式的判断——要加上移动端的,加上上下左右滑动封装.toast可以封装.webview切换操作 3. 页面当中,所有元素定位——更换——移动 ...

  4. 51nod 1406 位运算/dp

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1406 1406 与查询 题目来源: CodeForces 基准时间限制: ...

  5. opencv:直方图操作

    示例程序: #include <opencv.hpp> using namespace cv; using namespace std; int main() { Mat src, dst ...

  6. Django restfull规范

    一. 什么是RESTful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角 ...

  7. react_webpack.prod.config

    const path = require('path'); const webpack = require('webpack'); const jquery = require('jquery'); ...

  8. android代码设置EditText只输入数字、字母

     如何设置EditText,使得只能输入数字或者某些字母呢? 一.设置EditText,只输入数字: 方法1:直接生成DigitsKeyListener对象就可以了. et_1.setKeyLis ...

  9. Sublime Text 3打开gbk编码的文件中文乱码的问题

    正在开发Wordpress主题,网上下载了一个博客模板,打开之后,发现里面的中文全是乱码 毕竟这玩意是外国人的东西,gbk是中文专用的编码,不支持很正常. 网上查了一下资料,需要安装一个Convert ...

  10. 特例模式(Special Case Pattern)与空对象模式(Null Pointer Pattern)—— 返回特例对象而非 null

    返回 null 值,基本上是在给自己增加工作量,也是给调用者添乱.只有一处没有检查返回的是否为 null,程序就会抛 NullPointerException 异常. 如果你打算在方法中返回 null ...