day11_python_1124

01 昨日内容回顾

函数名的运用:
1,特殊的变量。
2,函数名可以当做变量赋值。
3,函数名可以当做容器类类型的元素。
4,函数名可以当做函数的参数。
5,函数名可以当做函数的返回值。

闭包:
1,内层函数对外层函数的变量(非全局)的引用。
2,闭包存在于函数中。
3,闭包要逐层返回,最终返回到函数的最外层。
特点:
解释器遇到闭包,不会随着函数的结束而结束空间。

闭包应用:
装饰器。
爬虫。

可迭代对象:
obj
'__iter__' in dir(obj)
from collections import Iterable
isinstance(obj, Iterable)
可迭代对象不能直接取值,必须转化成迭代器进行取值(__next__)

迭代器:
'__iter__' in dir(obj) and '__next__' in dir(obj)
from collections import Iterator
isinstance(obj, Iterator)
一个next 对应一个元素
l1 = [1, 2, 3,]
obj = iter(l1)
while True:
try:
print(obj.__next__())
except Exception:
break

02 作业讲解
03 生成器
04 列表推导式,生成器表达式(字典推导式等)
05 匿名函数lambda

# 下午:考试题,购物车讲解

# 03 生成器

# 生成器本质就是迭代器,生成器是自己用python代码写的迭代器。
# 生成器函数
# 生成器表达式

# 将一个函数变成生成器函数
# 生成器函数
# def func():
# print(333)
# print(555)
# yield 666
# yield 999
# ret = func()
# print(ret) #地址
# next(ret) #输出yield之前
# # 一个next 对应一个yield
# print(next(ret))
# print(next(ret))

# yield return共同点和不同点:
# return 终止函数,yield 不会终止生成器函数。
# 都会返回一个值,return给函数的执行者返回值,yield是给next()返回值

# 生产衣服

# def cloth():
# for i in range(5001):
# print('我写的代码没有bug 衣服%s号' % i)
# cloth()
#
# def cloth2():
# for i in range(5001):
# yield '有志青年 衣服%s号' % i
#
# genor = cloth2()
# for i in range(100):
# print(next(genor))
#
# for i in range(50):
# print(next(genor))

# send与next

# def func():
# print(3)
# count = yield 666
# print(count)
# num = yield '计划'
# print(num)
# yield '太白金星'
# n1 = yield '小虎'
# print(n1)
# genor = func()
# print(next(genor))
# print(next(genor))
# send不仅能对应yield取值,而且可以给上一个yield发送一个值
# print(genor.send(None))
# print(genor.send('alex'))
# print(genor.send('111'))
# print(genor.send('222'))##yield不赋值就跳过
# print(genor.send('333'))
# 第一次取值能否用send传参? 不能,会报错,先使用next,或send(None)
# 最后一个yield 永远也得不到send的传的值

# yild from

# def func():
# lst = ['明亮', '容先', '王子', '万赵']
# print(6)
# yield lst
# genor = func() # [['明亮', '容先', '王子', '万赵'],]
# print(next(genor))
# next(genor)#输出6
# for i in genor:
# print(i)

# # yield from 将一个可迭代对象变成一个迭代器返回
# def func():
# print(3)
# lst = ['明亮', '容先', '王子', '万赵']
# yield from lst
# genor = func()
# print(next(genor))
# print(next(genor))
# for i in genor:
# print(i)

# 04 列表推导式 生成器表达式

# 创建列表:[1,2,3,。。。100]
# l1 = []
# for i in range(1,101):
# l1.append(i)
# print(l1)

# 列表推导式:用一行代码构建简单,较复杂的列表。
# 减少代码量,装逼。
#三种:
# 循环模式。 [变量(加工后的变量) for 变量 in iterable ]
# print([i for i in range(1,101)])
# 构建一个列表:['python1期', 'python2期',....'python25期']
# l1 = ['python%s期' %i for i in range(1,26)]
# print(l1)

# 三元模式(循环模式)
# 构建一个列表:列表里面的元素是1~20,但是能被3整除元素替换成*。
# ret = '*' if 3>2 else 1
# print(ret)
# print(['*' if i % 3 == 0 else i for i in range(1,21)])

# 筛选模式 [变量(加工后的变量) for 变量 in iterable if 条件]
# 三十以内所有的偶数留到列表中
# print([i for i in range(1,31) if i % 2 == 0])

# 30以内所有能被3整除的数
# print([i for i in range(1,31) if i % 3 == 0])
# 30以内所有能被3整除的数的平方
# print([i**2 for i in range(1,31) if i % 3 == 0])
# ['地球1号', '地球3号','地球5号',....'地球99号',]
# print(['地球%s号'% i for i in range(1,100,2)])

# 将至少含有两个e的名字放到一个列表中
# names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
# ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
# l1 = []
# for l in names:
# for name in l:
# if name.count('e') >= 2:
# l1.append(name)
# print(l1)
# print([name for l in names for name in l if name.count('e') >= 2])

# 列表推导式:
# 优点:一行搞定,节省代码行数,高逼格。
# 缺点:
# 1,不能用debug模式。
# 2,列表推导式有毒,任何列表都可以通过常规构建去构建,复杂的列表不能通过列表推导式。

# 生成器表达式?
# 与列表推导式几乎一模一样, 就是[] 换成 ()
# l1 = ['python%s期' %i for i in range(1,26)]
# print(l1)#列表
# gentor = ('python%s期' %i for i in range(1,26))
# print(gentor)#地址

# for i in gentor:
# print(i)

# 字典推导式, 集合推导式 (了解)
# print({i:None for i in range(1,10)})
# mcase = {'a': 10, 'b': 34, 'c': 20, 'd': 15}
# print({value:key for key,value in mcase.items()})

# set1 = {1, -2, 3, -4, 4}
# print({i ** 2 for i in set1})

# 05 匿名函数

# def func(x, y): return x + y
# print(func(3,4))
# 针对于只有返回值的这样的函数:python 提供了一个函数可以简化:
# 匿名函数。一行函数

# func2 = lambda x,y: x + y
# print(func2(3,4))

# 写一个匿名函数:需要三个数字参数,返回值为三个数相乘
func = lambda x,y,z:x*y*z
print(func(2,3,4))


猜你喜欢

转载自www.cnblogs.com/yijue-lu/p/10225910.html