python开发函数进阶:生成器表达式&各种推导式
一,生成器表达式
#生成器表达式比列表解析更省内存,因为惰性运算
#!/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开发函数进阶:生成器表达式&各种推导式的更多相关文章
- Python-02 生成器表达式,列表推导式
列表推导式和生成器表达式 列表推导式,生成器表达式1,列表推导式比较直观,占内存2,生成器表达式不容易看出内容,省内存. [ 变量(加工后的数据) for 变量i in 可迭代的数据类型 ] 列表 ...
- python之迭代器、生成器及列表推导式
一.迭代器 迭代器就是迭代的工具,迭代是一个重复的过程,每次重复都是一次迭代并且每次迭代的结果都是下次迭代的初始值. lst=[1,2,3,4,5] count=0 while count<le ...
- Python进阶-VI 生成器函数进阶、生成器表达式、推导式
一.生成器函数进阶 需求:求取移动平均数 1.应用场景之一,在奥运会气枪射击比赛中,每打完一发都会显示平均环数! def show_avg(): print('你已进入显示移动平均环数系统!') a ...
- Python开发基础-Day10生成器表达式形式、面向过程编程、内置函数部分
生成器表达式形式 直接上代码 # yield的表达式形式 def foo(): print('starting') while True: x=yield #默认返回为空,实际上为x=yield No ...
- python基础学习Day12 生成器、列表推导式、字典的表达式、字典键值对的互换、集合推导式
一.生成器 1.1 生成器:就是(python)自己用代码写的迭代器,生成器的本质就是迭代器. 1.2 生成器函数 def func1(x): x += print() yield x print() ...
- 【python】 迭代器、生成器、列表推导式
一.可迭代对象.迭代器 1.可以被for循环的数据类型(可迭代对象): 字符串(str).列表(list).字典(dict).元祖(tuple).range() 2.迭代器 2.1 将可迭代对象==& ...
- python开发函数进阶:可迭代的&迭代器&生成器
一,可迭代的&可迭代对象 1.一个一个的取值就是可迭代的 iterable#str list tuple set dict#可迭代的 ——对应的标志 __iter__ 2.判断一个变量是不 ...
- python开发函数进阶:匿名函数
一,匿名函数 #简单的需要用函数去解决的问题 匿名函数的函数体 只有一行#也叫lambda表达式# cal2(函数名) = lambda n(参数) : n*n(参数怎么处理,并且返回值)#参数可以有 ...
- python开发函数进阶:装饰器
一,装饰器本质 闭包函数 功能:就是在不改变原函数调用方式的情况下,在这个函数前后加上扩展功能 作用:解耦,尽量的让代码分离,小功能之前的分离. 解耦目的,提高代码的重用性 二,设计模式 开放封闭原则 ...
随机推荐
- LeetCode第[5]题(Java):Longest Palindromic Substring 标签:String、动态规划
题目中文:求最长回文子串 题目难度:Medium 题目内容: Given a string s, find the longest palindromic substring in s. You ma ...
- 随机森林和adaboost算法(待更新)
Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器).
- Win10/Server2016镜像集成离线补丁
Win10镜像集成离线补丁 因为正常安装系统后再打补丁比较漫长,可以事先做好打过补丁的iso,备将来使用. 以管理员身份运行cmd,然后通过dism提取.挂载.集成补丁.保存install.wim镜像 ...
- 转载 IOS开发之---static变量
Objective-C 支持全局变量 主要有两种实现方式: (1)第一种和C/C++中的一样, 使用"extern"关键词: (2)另外一种就是使用单例实现. (比如我们经常会把一 ...
- 条款22:将成员变量声明为private
protected成员变量的封装性并非高于public变量. 如果有个public的成员变量,一旦其需要改变,那么所有使用它的代码都需要改变. 如果有个protected的成员变量,一点其需要改变,那 ...
- Python基础学习(第8天)
先补充些iter函数的用法:iter()其实就是一个迭代器,参数可传个list.dict等等,然后可通过调用next函数获取下一个元素,默认并未指向对象的第一个元素,可理解为指向了第一个元素的前面的位 ...
- 初识Linux(五)--VI/VIM编辑器
我们操作文件,终究离不开编辑文件,对文件内容的编辑,Linux系统下,我们通常使用VI/VIM来编辑文件.VI是每个Linux都会自带的文本编辑器,VIM是VI的增强版,可能有些发行版本没有自带,可以 ...
- Android常见面试笔试题目
Android常见面试笔试题目 1.在多线程编程这块,我们经常要使用Handler,Thread和Runnable这三个类,那么他们之间的关系你是否弄清楚了呢? 答:可以处理消息循环的线程,他是一个拥 ...
- 如何突破JAVA程序员三年的门槛
第一阶段:三年 我认为三年对于程序员来说是第一个门槛,这个阶段将会淘汰掉一批不适合写代码的人.这一阶段,我们走出校园,迈入社会,成为一名程序员,正式从书本 上的内容迈向真正的企业级开发.我们知道如何团 ...
- 初识django框架
django框架 1.框架介绍 根据第一部分内容介绍,我们可以总结出一个web框架应该包含如下三部分:a.sockect服务.b.根据不同的url调用不同函数(包含逻辑).c.返回内容(模板渲染).常 ...