一. 第一类对象, 函数名的使用
函数名就是变量名,函数名存储的是函数的内存地址
变量的命名规范:
1. 有数字,字母,下划线组成
2. 不能是数字开头,更不能是纯数字
3. 不要用关键字
4. 不要太长
5. 要有意义
6. 不要用中文
7. 区分大小写
8. 驼峰或者下划线
def __(): print(12345) __()
1 # def fun1(): 2 # print(1) 3 # def fun2(): 4 # print(2) 5 # def fun3(): 6 # print(3) 7 # 8 # l = [fun1,fun2,fun3,] 9 # print(l) 10 # for i in l: 11 # i() 12 13 # def outer(): 14 # def inner(): 15 # print('我是可怜的inner') 16 # return inner#函数名可以作为返回值 17 # ret = outer() 18 # ret() 19 20 #代理模式 21 #装饰器的雏形 22 #把函数名当成变量来使用 23 # def chi(fn):#fn 代理了func1 和func2 24 # print('开挂') 25 # fn() 26 # print(fn.__name__) 27 # print('洗包') 28 # def play_dnf(): 29 # print('疯狂的书刷') 30 # def func1(): 31 # print('我是func1') 32 # def func2(): 33 # print('我是func2') 34 # def he(): 35 # print('我要喝酒') 36 # chi(func1) 37 # chi(func2) 38 39 # def outer(): 40 # def inner(): 41 # print('哈哈') 42 # return inner 43 # outer()() #outer()返回inner
二. 闭包
闭包:在内层函数中引入外层函数(非全局)的变量
可以使用__closure__来检测函数是否是闭包,使用.__closure__返回cell就是闭包,返回None就不是闭包
1 def func1(): 2 name = 'alex' 3 def fun2(): 4 print(name)#闭包 5 fun2() 6 print(fun2.__closure__)#(<cell at 0x04D71470: str object at 0x04C69600>,) 7 func1()
作用:
1. 保护变量不受侵害(JavaScript)
2. 让一个变量常驻内存
1 def func(): 2 def fun1(): 3 def fun2(): 4 print('哈哈') 5 return fun2 6 return fun1 7 func()()() 8 9 # print(func.__doc__) # document 文档注释 10 # print(func.__name__) # name 名字 获取函数名
三. 迭代器
dir() 查看变量能够执行的方法(函数)
Iterator: 迭代器, __iter__(), __next__()
Iterable: 可迭代的,__iter__()
for循环的流程:
it = lst.__iter__()
while 1:
try:
el = it.__next__()
for 循环的循环体
except StopIteration:
break
从迭代器中获取数据的唯一方法: __next__()
1 print(dir(str))#查看str能够执行的操作,内部的方法 (list,dict,)都有 2 # 简单的下一个结论,主要这个数据类型可以执行__iter__ 可以被迭代的数据类型 3 lis = [1,2,3,4,5,] 4 # it = lis.__iter__() 5 # print(it)#<list_iterator object at 0x04FA1450> iterator 迭代器 6 # print(dir(it)) #迭代/器本身是可迭代的 7 #可以使用__next__获取数据 8 # print(it.__next__()) 9 # print(it.__next__()) 10 # print(it.__next__()) 11 # print(it.__next__()) 12 # print(it.__next__()) 13 # print(it.__next__()) #StopIteration迭代器中没有元素了 14 15 # for 循环内部的代码 16 # it = lis.__iter__() 17 # while 1 : 18 # try: 19 # el = it.__next__() 20 # print(el) 21 # except StopIteration: 22 # # print('结束了') 23 # break 24 25 # 三个特点 26 # 1. 节省内存(生成器) 27 # 2. 惰性机制,必须用__next__()来获取数据 28 # 3. 只能往前,不能后退 29 30 # list(内部有for循环) 31 # for内部 迭代器 32 33 # ls = [1,1,1,1,1,1,1,1,1,1,122,22] 34 # ll = list(set(ls))#去重 35 # print(ll) 36 37 # list(1) #'int' object is not iterable #不可迭代的 38 39 # 如何判断一个数据是否是可迭代对象 40 # 1. dir() ->__iter__ 可迭代的 41 # 2. dir() -> __next__ 迭代器 42 # print('__iter__' in dir(int)) #False 43 # print('__next__' in dir(int))#False 44 45 # collections 关于集合类的相关操作 46 # Iterable: 可迭代的 47 # Iterator: 迭代器 48 # from collections import Iterable,Iterator 49 # print(isinstance(int,Iterable)) #True 50 # print(isinstance(int,Iterator)) #Falsse 51 # 52 # print(isinstance({1,2,3},Iterable)) #True 53 # print(isinstance({1,2,3}.__iter__(),Iterator)) #True
三个特征:
1. 省内存
2. 惰性机制
3. 只能往前,不能后退