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