#函数名可以作为参数传递给函数
#闭包,在内层函数中访问外层函数的变量
#闭包的作用:
#1.可以保护你的变量不受侵害
#2.可以让一个变量常驻内存
def outer():
a = 10#常驻内存,为了inner执行的时候有值
def inner():
print(a)
return inner
fn = outer()
fn() #d调用的时机是不定的
#超简易爬虫
from urllib.request import urlopen
def outer():
#常驻内存
# s = urlopen(“http://www.”).read()
# def getContent(): #闭包
# return s
# return getContent
#如何查看是否是闭包
def func():
a = 10
def inner():
print(a)
print(inner.closure) #如果打印的是None,不是闭包
func()
print(dir(str)) #dir可以查看XX类型的数据可以执行的方法
#可迭代对象可用__iter__()来获取到迭代器
#1.只能向前
#2.几乎不占内存,节省内存
#3.for循环
#4.惰性机制
#迭代器模拟for循环
lst = [“AA”,“BB”,“CC”]
it = lst.iter() #获取迭代器
while 1:
try: #尝试执行
el = it.next() #获取下一个元素
print(el)
except StopIteration: #处理错误
break
#判断是否是可迭代对象或者迭代器
from collections import Iterable #可迭代对象
from collections import Iterator #迭代器
print(isinstance(Ist,Iterable))
print(isinstance(Ist,Iterabtor))
n = 6
for i in range(1,n+1):
for k in range(2n-2i):
print("",end=" “)
for j in range(2i-1):
print("”,end=" ")
print()
#枚举
lst =[‘a’,‘b’,‘c’,‘d’,‘e’]
for index,el in enumerate(lst,1):
print(index,el)
1.生成器
生成器的本质就是迭代器
生成器的特点和迭代器一样,取值方式和迭代器一样(next())
生成器一般由生成器函数或者生成器表达式来创建
生成器其实就是手写的迭代器
def func():
print(“aaa”)
yield 1 #return和yield都可以返回数据
print(“bbb”)
gen = func() #不会执行你的函数,拿到的是生成器
ret = gen.next() #执行函数,会执行到下一个yield
print(ret)
gen.next() #继续执行到下一个yield
#函数中如果有yield,这个函数就是生成器函数,生成器函数()获取的是生成器,不执行函数
#yield:相当于return,可以返回数据,但是yield不会彻底中断函数,分段执行函数
send()和__next__()是一样的,可以执行到下一个yield,可以给上一个yield位置传值,必须给参数
#没有上一个yield,必须使用__next__()
#推导式:用一句话来生成一个列
#语法:[结果 for循环 判断]
#lst = [j for j in range(1,16)]
#print(lst)
#lst = [j for j in range(100) if j % 2 == 0]
#print(lst)
#字典推导式
#语法:{key:vaule for循环 条件刷选}
#[11,22,33,44]=>{0:11,1:22,2:33,3:44}
#lst =[11,22,33,44]
#dic ={i:lst[i] for i in range(len(lst))}
#print(dic)
dic = {0: 11, 1: 22, 2: 33, 3: 44}
dic1 = {dic[i]:i for i in dic}
print(dic1)
#没有元组推导式
tu = (i for i in range(10)) #生成器
print(tu.next())
#特点:
#1.惰性机制
#2.只能向前
#3.节省内存
#三元运算符
a if a > b else b