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
原文地址:https://www.cnblogs.com/liubing8/p/11215869.html