Python函数04/生成器/推导式/内置函数
Python函数04/生成器/推导式/内置函数
内容大纲
1.生成器
2.推导式
3.内置函数
1.生成器
迭代器:Python中内置的一种节省空间的工具
生成器的本质就是一个迭代器
迭代器和生成器的区别:一个是Python自带的,一个是程序员自己写的
写一个生成器:
# def func():
# print(123)
# return "你好"
# func()
# def func():
# if 3>2:
# yield "你好" # 停
# if 4>2:
# yield "我好"
# yield "大家好"
# g = func() # 产生一个生成器
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())
# for i in g:
# print(i)
# while True:
# try:
# print(g.__next__())
# except StopIteration:
# break
# def foo():
# for i in range(10):
# pass
# yield i
# count = 1
# while True:
# yield count
# count += 1
# g = foo()
# print(next(g)) # -- 推荐使用
# print(next(g)) # -- 推荐使用
# print(next(g)) # -- 推荐使用
# print(next(g)) # -- 推荐使用
# print(next(g)) # -- 推荐使用
# for i in g:
# print(i)
坑 -- 会产生新的生成器(g = foo()就不会是每次都产生一个生成器了)
print(foo().__next__())
print(foo().__next__())
# send() -- 了解
# def func():
# a = yield "俺是send"
# print(a)
# g = func()
# print(g.send(None))
# print(g.send(123))
#第一次获取yield值只能用next不能用send(其实是第一次可以用send(None))
#send可以给上一个yield传递值
生成器应用场景:
# def func():
# lst = []
# for i in range(100000):
# lst.append(i)
# return lst
# print(func())
# def func():
# for i in range(100000):
# yield i
# g = func()
# for i in range(50):
# print(next(g))
可以看出来明显的节省了内存
小坑:
# def func():
# lst = ["牛羊配","老奶奶花生米","卫龙","虾扯蛋","米老头","老干妈"]
# for i in lst:
# yield i
# g = func()
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
# def func():
# lst1 = ["牛羊配","老奶奶花生米","卫龙","虾扯蛋","米老头","老干妈"]
# lst2 = ["小浣熊","老干爹","亲嘴烧","麻辣烫","黄焖鸡","井盖"]
# yield from lst1
# yield from lst2
#
# g = func()
# print(next(g))
# print(next(g))
# print(next(g))
# for i in g:
# print(i)
# g.__iter__()
# g.__next__()
在函数中将return改写成yield就是一个生成器
yield会记录执行位置
return和yield都是返回
return可以写多个,但是只执行一次;yield可以写多个,还可以返回多次
一个__next__()对应一个yield
生成器可以采用for循环获取值
yield from -- 将可迭代对象元素逐个返回
在函数内部,yield能将for循环和while循环进行临时暂停
2.推导式
# lst = []
# for i in range(20):
# lst.append(i)
# print(lst)
list推导式
# print([i for i in range(20)])
# 循环模式
# [变量 for i in range(20)]
# print([i+1 for i in range(10)])
# 筛选模式
# lst = []
# for i in range(20):
# if i % 2 == 0:
# lst.append(i)
# print(lst)
# print([i for i in range(20) if i % 2 == 0])
# [变量(加工后的变量) for循环 加工方式]
# print([i for i in range(50) if i % 2 == 1])
# print([i for i in range(1,50,2)])
生成器表达式:
# 循环模式:
# g = (i for i in range(20))
# print(next(g))
# print(next(g))
# print(next(g))
# print(list((i for i in range(20))))
# 筛选模式
# g = (i for i in range(50) if i % 2 == 1)
# for i in g:
# print(i)
字典推导式:(了解)
# print({i:i+1 for i in range(10)})
# print({i:i+1 for i in range(10) if i % 2 == 0})
# {键:值 for循环 加工条件}
集合推导式:(了解)
# print({i for i in range(10)})
# print({i for i in range(10) if i % 2 == 0})
list推导式:
[变量(加工后的变量) for循环]
[变量(加工后的变量) for循环 加工条件]
生成器表达式:
(变量(加工后的变量) for循环)
(变量(加工后的变量) for循环 加工条件)
字典推导式:
{键:值 for循环 加工条件}
集合推导式:
{变量(加工后的变量) for循环 加工条件}
# 将10以内所有整数的平方写入列表
# 100以内所有的偶数写入列表.
# 从python1期到python24期写入列表lst
# print([f"pyhton{i}期" for i in range(1,25)])
# 将这个列表中大于3的元素留下来。
# print([i for i in [1,2,3,23,1234,4235,] if i > 3])
3.内置函数(一)
# s = """
# for i in range(10):
# print(i)
# """
# s1 = """
# def func():
# print(123)
# func()
# """
# print(eval(s))
# print(exec(s1)) # 厉害 不能用 (工作中尽量不要使用,容易出问题)
# print(hash("asdfas"))
# print(help(list))
# help(dict)
# def func():
# pass
# print(callable(func)) # 查看是否可调用
# print(float(2)) # 浮点数
# print(complex(56)) # 复数
# print(oct(15)) # 八进制
# print(hex(15)) # 十六进制
# print(divmod(5,2)) # (2, 1) 2商 1余
# print(round(5.3234,2)) # 四舍五入 -- 默认是整数,可以指定保留小数位
# print(pow(2,3)) # 幂
# print(pow(2,3,4)) # 幂,余
# s = "alex"
# print(bytes(s,encoding="utf-8"))
# print(ord("你")) # 当前编码
# print(chr(20320))
# s = "C:\u3000"
# print(repr(s))
# print("\u3000你好")
# lst = [1,2,3,False,4,5,6,7]
# print(all(lst)) # 判断元素是否都为真 相似and
# print(any(lst)) # 判断元素是否有真 相似or
# name = 1
# def func():
# a = 123
# # print(locals())
# # print(globals())
# func()
# print(globals()) # 全局空间中的变量
# print(locals()) # 查看当前空间的变量
4.今日总结
# 1.生成器
# 生成器的本质就是一个迭代器
# 生成器和迭代器的区别:
# 迭代器是Python自带的
# 生成器是咱们(程序员)写得
定义一个生成器:
基于函数
函数体中存在yield就是一个生成器
函数名()就是产生一个生成器
生成器:
节省空间 --惰性机制
不能逆行
一次性
一个next对应一个yield
yield能够进行返回内容,还能够返回多次
yield能够临时停止循环
yield能够记录执行的位置
yield from --将一个可迭代对象的元素逐个返回
# list:[变量(加工后的变量) for循环 加工条件]
# dict:{键:值 for循环 加工条件}
# set:{变量(加工后的变量) for循环 加工条件}
# 生成器表达式:(变量(加工后的变量) for循环 加工条件)
# 1.普通循环推导
# 2.筛选推导
# 3.内置函数一
"""
all() any() bytes()
callable()
chr() complex()
divmod() eval()
exec() format()
frozenset() globals()
hash() help() id() input()
int() iter() locals()
next() oct() ord()
pow() repr() round()
"""
5.今日练习
# 2.用列表推导式做下列小题
# 过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
# print([i.upper() for i in s if len(i) > 3])
# 求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表
# print([(i, i+1) for i in range(6) if i % 2 == 0])
# 求M中3,6,9组成的列表M = [[1,2,3],[4,5,6],[7,8,9]]
# print([i[-1] for i in M])
# 求出50以内能被3整除的数的平方,并放入到一个列表中。
# print([i for i in range(50) if i % 3 == 0])
# 构建一个列表:['python1期', 'python2期', 'python3期', 'python4期', 'python6期', 'python7期', 'python8期', 'python9期', 'python10期']
# print([f'python{i}期' for i in range(1,11) if i != 5])
# 构建一个列表:[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
# print([(i,i+1) for i in range(6)])
# 构建一个列表:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
# print([i for i in range(20) if i % 2 == 0])
# 有一个列表l1 = ['alex', 'WuSir', '老男孩', '太白']将其构造成这种列表['alex0', 'WuSir1', '老男孩2', '太白3']
# l1 = ['alex', 'WuSir', '老男孩', '太白']
# print([l1[i]+str(i) for i in range(len(l1)) ])
# 3.有以下数据类型:
# x = {
# 'name':'alex',
# 'Values':[{'timestamp':1517991992.94,
# 'values':100,},
# {'timestamp': 1517992000.94,
# 'values': 200,},
# {'timestamp': 1517992014.94,
# 'values': 300,},
# {'timestamp': 1517992744.94,
# 'values': 350},
# {'timestamp': 1517992800.94,
# 'values': 280}
# ],}
# 将上面的数据通过列表推导式转换成下面的类型:
# [[1517991992.94, 100], [1517992000.94, 200], [1517992014.94, 300], [1517992744.94, 350], [1517992800.94, 280]]
# print([em for i in x['Values'] for em in i.values()])
#
# 4.构建一个列表,列表里面是三种不同尺寸的T恤衫,每个尺寸都有两个颜色(列表里面的元素为元组类型)。
# colors = ['black', 'white']
# sizes = ['S', 'M', 'L']
# print([(a,b) for a in sizes for b in colors])
# 5.构建一个列表,列表里面的元素是扑克牌除去大小王以后,所有的牌类(列表里面的元素为元组类型)。
# l1 = [('A','spades'),('A','diamonds'), ('A','clubs'), ('A','hearts')......('K','spades'),('K','diamonds'), ('K','clubs'), ('K','hearts') ]
# print([(a,b) for a in ['A','2','3','4','5','6','7','8','9','10','J','Q','K'] for b in ['spades','diamonds','clubs','hearts']])
# 6.简述一下yield 与yield from的区别。
# yield yield只能由for循环,逐个返回
# yield from 可以将可迭代对象元素逐个返回
# 7.看代码求结果(面试题):
# v = [i % 2 for i in range(10)]
# print(v)
# [0,1,0,1,0,1,0,1,0,1]
#
# v = (i % 2 for i in range(10))
# print(v)
#<generator object <genexpr> at 0x000000F9C7CBFEB8> # 内存地址
#
# for i in range(5):
# print(i)
# print(i)
# 1
# 2
# 3
# 4
# 4
Python函数04/生成器/推导式/内置函数的更多相关文章
- 12.Python略有小成(生成器,推导式,内置函数,闭包)
Python(生成器,推导式,内置函数,闭包) 一.生成器初始 生成器的本质就是迭代器,python社区中认为生成器与迭代器是一种 生成器与迭代器的唯一区别,生成器是我们自己用python代码构建成的 ...
- 记录我的 python 学习历程-Day12 生成器/推导式/内置函数Ⅰ
一.生成器 初识生成器 生成器的本质就是迭代器,在python社区中,大多数时候都把迭代器和生成器是做同一个概念. 唯一的不同就是: 迭代器都是Python给你提供的已经写好的工具或者通过数据转化得来 ...
- Learn day5 迭代器\生成器\高阶函数\推导式\内置函数\模块(math.time)
1.迭代器 # ### 迭代器 """能被next调用,并不断返回下一个值的对象""" """ 特征:迭代器会 ...
- python之迭代器 生成器 枚举 常用内置函数 递归
迭代器 迭代器对象:有__next__()方法的对象是迭代器对象,迭代器对象依赖__next__()方法进行依次取值 with open('text.txt','rb',) as f: res = f ...
- Python进阶(四)----生成器、列表推导式、生成器推导式、匿名函数和内置函数
Python进阶(四)----生成器.列表推导式.生成器推导式.匿名函数和内置函数 一丶生成器 本质: 就是迭代器 生成器产生的方式: 1.生成器函数
- python函数(6):内置函数和匿名函数
我们学了这么多关于函数的知识基本都是自己定义自己使用,那么我们之前用的一些函数并不是我们自己定义的比如说print(),len(),type()等等,它们是哪来的呢? 一.内置函数 由python内部 ...
- 学习Python函数笔记之二(内置函数)
---恢复内容开始--- 1.内置函数:取绝对值函数abs() 2.内置函数:取最大值max(),取最小值min() 3.内置函数:len()是获取序列的长度 4.内置函数:divmod(x,y),返 ...
- Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
Python中字符串String的基本内置函数与用法 首先我们要明白在python中当字符编码为:UTF-8时,中文在字符串中的占位为3个字节,其余字符为一个字节 下面就直接介绍几种python中字符 ...
- python---基础知识回顾(一)(引用计数,深浅拷贝,列表推导式,lambda表达式,命名空间,函数参数逆收集,内置函数,hasattr...)
一:列表和元组(引用计数了解,深浅拷贝了解) 序列:序列是一种数据结构,对其中的元素按顺序进行了编号(从0开始).典型的序列包括了列表,字符串,和元组 列表是可变的(可以进行修改),而元组和字符串是不 ...
随机推荐
- Mybaties概述
- turtle绘制彩色螺旋线
代码实现: #绘制彩色螺旋线 import turtle import time turtle.pensize(2) turtle.bgcolor("black") colors ...
- Charles抓包1-Charles安装汉化(附正版注册码)
目录 1.下载&&安装 2.汉化 1.下载&&安装 charles官网 charles下载 下载后直接安装即可. 2.汉化 下载提供的汉化包charles.jar(加群 ...
- Java 从入门到进阶之路(二十三)
在之前的文章我们介绍了一下 Java 中的 集合框架中的Collection 的迭代器 Iterator,本章我们来看一下 Java 集合框架中的Collection 的泛型. 在讲泛型之前我们先来 ...
- Mac App破解之路九 vscode插件破解
破解对象: luaide 破解目的:学习如何破解vscode插件 破解背景: vsscode用了这么多年,安装了很多插件,其中luaide插件是收费的. 说实话,100块并不贵, 我本来准备买的. ...
- 深入理解JVM(③)虚拟机性能监控、故障处理工具
前言 JDK的bin目录中有一系列的小工具,除了java.exe.javac.exe这两个编译和运行Java程序外,还有打包.部署.签名.调试.监控.运维等各种场景都会用到这些小工具. 这些工具根据软 ...
- 深度解剖dubbo源码---01dubbo的架构原理-探索.mp4
02内核解剖-dubbo自己的SPI实现.mp4 https://blog.csdn.net/prestigeding/article/details/80795708 https://segment ...
- Jmeter系列(30)- 详解 JDBC Request
如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html 前言 JDBC Request 主要是 ...
- vue基础入门(1)
1.vue初体验 1.1.vue简介 1.1.1.vue是什么? Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架,什么叫做渐进式呢?通俗的讲就是一层一层的,一步一 ...
- JS判断 函数是否定义/变量是否定义
函数是否定义: <script type="text/javascript"> try { if(typeof FunName === "function&q ...