生成器和几个内置函数
词法分析 和 语法分析
生成器:
迭代器:python内置的一种节省空间的工具
生成器的本质就是一个迭代器
迭代器和生成器的区别:迭代器python自带的,生成器程序员自己写的
写一个生成器---函数中将return 改成yield就是生成器
def func()
print(123)
yield "你好啊"# 返回 跟return的作用相同
print(func())产生一个生成器
print(func().__next__())
结果:
<generator object func at 0x000001F35A653C50>
123
你好啊
return 可以返回值 可以写多个但是只执行一次
yield 可以 返回值 可以写多个 可以返回多次 会记录执行位置 在函数内部yield可以暂时阻塞 while for循环
![QQ图片20190719102807](D:\python听课记录\day1\QQ图片20190719102807.pngdef func():
if 3>2:
yield "你好"
if 4>2:
yield "我好"
yield "大家好"
g = func()
print(g.__next__())
print(g.__next__())
print(g.__next__())
结果:
你好
我好
大家好
坑
def foo():
for i in range(10):
pass
yield i
count = 1
while True:
yield count
count += 1
print(foo().__next__())
print(foo().__next__())#会产生新的生成器
print(foo().__next__())
iter() == __iter__()
next() == __next__()
send()----了解
def func():
a = yield "俺是send"
print(a)
g = func()
print(g.send(None))#第一次传参只能传None
生成器的应用场景:
def func():
lst = []
for i in range(100000):
lst.append(i)
return lst
print(func())
#改成生成器:
def func():
lst = []
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))
结果:
yield from 将可迭代对象逐个返回 ,相当于for循环
def func():
lst = ["牛羊配","老奶奶花生米","卫龙","虾扯淡","米老头儿","老干妈"]
yield from lst#先走完所有的列表才会执行下一个yield#这个地方有坑
g = func()
for i in g:
print(i)
推导式:
列表推导式
循环模式
[变量名 for 变量名 in range(10) ]
lst = [i for i in range(20)]
print([i+1 for i in range(10)])
筛选模式:
[变量(加工后的变量) for循环 加工方式 ]
print([i for i in range(20) if i %2 ==0])
生成器表达式
循环模式:
g = (i for i in range(10) )
print(next(g))
print(next(g))
print(next(g))
print( list((i for i in range(10) )))
print( (i for i in range(10) ))
结果:
0
1
2
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
<generator object <genexpr> at 0x0000019B5C5E3BF8>
筛选模式:
g = (i for i in range(20) if i%2 ==0)
for i in g:
print(i)
字典推导式
{i:i+1 for i in range(10)}
{i:i+1 for i in range(10) if i%2 ==0}
{键:值 for循环 加工}
集合推导式
{i for i in range(10)}
{i for i in range(10)} if i%2 ==0 }
内置函数一
-
eval---执行字符串类型的代码(但是只能执行一行,多行会报错),并返回最终结果。工作中禁用
eval('2 + 2') # 4 n=81 eval("n + 4") # 85 eval('print(666)') # 666
-
exec()---仅执行字符串类型的代码。但是不返回值工作中禁用
s = """ for i in range(10): print(i) """ s1 = """ print(2) def func(): print(123) func() """ print(exec(s)) print(exec(s1))
-
hash()---获取一个对象(可哈希对象:int,str,Bool,tuple)的哈希值。
print(hash(12322)) print(hash('123')) print(hash('arg')) print(hash('alex')) print(hash(True)) print(hash(False)) print(hash((1,2,3))) ''' -2996001552409009098 -4637515981888139739 1 2528502973977326415 '''
-
help()--函数用于查看函数或模块用途的详细说明。
print(help(list)) print(help(str.split))
-
callable()---函数用于检查一个对象是否是可调用的。如果返回True,仍然可能调用失败;但如果返回False,调用对象ojbect绝对不会成功。
def func(): pass print(callable(func)) # 查看是否可调用 True
-
int:函数用于将一个字符串或数字转换为整型。
print(int()) # 0 print(int('12')) # 12 print(int(3.6)) # 3 print(int('0100',base=2)) # 将2进制的 0100 转化成十进制。结果为 4
-
float()---函数用于将整数和字符串转换成浮点数。
print(float(2)) 2.0
-
complex()---函数用于创建一个值为 real + imag * j 的复数或者转化一个字符串或数为复数。如果第一个参数为字符串,则不需要指定第二个参数
print(complex(56)) # 复数 print(complex(56,2)) print(complex("56+6j")) 结果: (56+0j) (56+2j) (56+6j)
-
bin() ---将十进制转换成二进制并返回。
-
oct()---将十进制转化成八进制字符串并返回。
-
hex()---将十进制转化成十六进制字符串并返回。
print(bin(10),type(bin(10))) # 0b1010 <class 'str'> print(oct(10),type(oct(10))) # 0o12 <class 'str'> print(hex(10),type(hex(10))) # 0xa <class 'str'>
-
divmod():计算除数与被除数的结果,返回一个包含商和余数的元组(a // b, a % b)。
print(divmod(5,2))# 2商 1余数
-
round()---保留浮点数的小数位数,默认保留整数。
print(round(3.5)) print(round(4.5)) print(round(4.6)) print(round(5.3234, 2)) print(round(5.545, 2)) print(round(5.535, 2) 结果: 4 4 5 5.32 5.54 5.54
-
pow()--求x**y次幂。(三个参数为x**y的结果对z取余)
print(pow(2,3)) # 两个参数为2**3次幂 print(pow(2,3,3)) # 三个参数为2**3次幂,对3取余。
-
bytes()---用于不同编码之间的转化。
# s = "alex" # print(bytes(s,encoding="utf-8"))
-
ord()--输入字符找当前字符编码的位置
# ord 输入字符找该字符编码的位置 print(ord('a')) print(ord('中'))
-
chr()--输入当前编码的位置数字找出其对应的字符
# chr 输入位置数字找出其对应的字符 print(chr(97)) print(chr(20013))
-
repr()---返回一个对象的string形式(原形毕露)。
# %r 原封不动的写出来 # name = 'taibai' # print('我叫%r'%name) # repr 原形毕露 print(repr('{"name":"alex"}')) print('{"name":"alex"}')
-
"\u3000"---空格
-
all()---可迭代对象中,全都是True才是True
print(all([1,2,True,0]))#False
-
any()---可迭代对象中,有一个True 就是True
print(any([1,'',0]))#True
-
gloabals()---获取全局空间中的变量
-
locals()--获取当前空间中的变量
name = 1
def func():
a = 123
print(locals())
print(globals())
func()
print(locals())
练习
2.用列表推导式做下列小题
过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表
求M中3,6,9组成的列表M = [[1,2,3],[4,5,6],[7,8,9]]
求出50以内能被3整除的数的平方,并放入到一个列表中。
构建一个列表:['python1期', 'python2期', 'python3期', 'python4期', 'python6期', 'python7期', 'python8期', 'python9期', 'python10期']
构建一个列表:[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
构建一个列表:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
有一个列表l1 = ['alex', 'WuSir', '老男孩', '太白']将其构造成这种列表['alex0', 'WuSir1', '老男孩2', '太白3']
# 过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
'''
lst = ["dsadsa","dsafa","fd","fdsfdsfa"]
lst1 = [i.upper() for i in lst if len(i)>=3]
print(lst1)
'''
# 求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表
'''
lst = [(i,j) for i in range(0,5,2) for j in range(1,6,2) ]
print(lst)
'''
# 求M中3,6,9组成的列表M = [[1,2,3],[4,5,6],[7,8,9]]
'''
M = [[1,2,3],[4,5,6],[7,8,9]]
lst = [j for i in M for j in i if j % 3 ==0]
print(lst)
'''
# 求出50以内能被3整除的数的平方,并放入到一个列表中。
'''
lst = [i*i for i in range(51) if i % 3 == 0]
print(lst)
'''
# 构建一个列表:['python1期', 'python2期', 'python3期', 'python4期', 'python6期', 'python7期', 'python8期', 'python9期', 'python10期']
'''
lst = [f"python{i}期" for i in range(1,11) if i != 5]
print(lst)
'''
# 构建一个列表:[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
'''
lst = [(i,i+1)for i in range(6)]
print(lst)
'''
# 构建一个列表:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
'''
lst = [i for i in range(20) if i % 2 == 0]
print(lst)
'''
# 有一个列表l1 = ['alex', 'WuSir', '老男孩', '太白']将其构造成这种列表['alex0', 'WuSir1', '老男孩2', '太白3']
'''
l1 = ['alex', 'WuSir', '老男孩', '太白']
l1 = [i+str(l1.index(i)) for i in l1]
print(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]]
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}
],}
ls = []
lst = [[j for j in i.values()] for i in x["Values"] ]
print(lst)
4.构建一个列表,列表里面是三种不同尺寸的T恤衫,每个尺寸都有两个颜色(列表里面的元素为元组类型)。
colors = ['black', 'white']
sizes = ['S', 'M', 'L']
colors = ['black', 'white']
sizes = ['S', 'M', 'L']
lst = [(i,j )for i in sizes for j in colors]
print(lst)
5.构建一个列表,列表里面的元素是扑克牌除去大小王以后,所有的牌类(列表里面的元素为元组类型)。
l1 = [('A','spades'),('A','diamonds'), ('A','clubs'), ('A','hearts')......('K','spades'),('K','diamonds'), ('K','clubs'), ('K','hearts') ]
ls = ['spades','diamonds','clubs','hearts']
ls1 = ["A","2","3","4","5","6","7","8","9","10","J","Q","K"]
li = [(i,j) for i in ls1 for j in ls]
print(li)
6.简述一下yield 与yield from的区别。
# yield 返回的就是当前元素
# yield from 相当于for循环 后面加可迭代对象 用来循环返回可迭代对象的元素
7.看代码求结果(面试题):
v = [i % 2 for i in range(10)]
print(v)
v = (i % 2 for i in range(10))
print(v)
for i in range(5):
print(i)
print(i)
# [0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
# 生成器地址 <generator object <genexpr> at 0x00000191D86E3C50>
# 0 1 2 3 4 4