迭代器:
for a in "abc":
print(a)
for temp in [11,22,33]:
print(temp)
1、可迭代对象
以直接作用于for循环的数据类型有一下几种:
一类是集合数据类型,如:list、tuple、dict、set、str等;
一类是generator,包括生成器和带yield的generator function。
这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
2、判断是否可以迭代
可以使用isinstance()判断一个对象是否是Iterable对象:
for collections import Iterable
isinstance([],Iterable)
isinstance({},Iterable)
isinstance('abc',Iterable)
isinstance((x for x in range(10)),Iterable)
isinstance(100,Iterable) False
3、迭代器
可以被next()函数调用并不断返回下一个值的对象成为迭代器:Iterator。
可以使用isinstance()判断一个对象是否是Iterator对象:
4、iter()函数
生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是iterator。把list、dict、str等Iterable变成Iterator可以使用iter()函数:
闭包
def test(number): def test_in(number_in): print("in test_in 函数,number_in is %d"%number_in) return number+number_in return test_in
函数里面定义一个函数,并且用到了外面函数的变量。里面的函数以及外面函数的变量统称为闭包。
def line_conf(a,b): def line(x): print(a*x+b) return line l1 = line_conf(2,3) l1(3)
装饰器:
def w1(func): def inner(): print("正在验证权限") func() return inner @w1 # 等价于 f1 = w1(f1) def f1(): print("----f1-----") f1()
def makeBold(fn): def wrapped(): print("-----1------") return "<b>"+fn()+"</b>" return wrapped def makeItalic(fn): def wrapped(): print("-----2------") return "<i>"+fn()+"</i>" return wrapped @makeBold @makeItalic def test3(): print("-----3------") return "hello world!" print(test3())
# 使用装饰器对无参数的函数进行装饰 def func(functionName): print("-----func--1---") def func_in(): print("-----func-in-1---") functionName() print("-----func-in-2---") print("-----func--2---") return func_in #@func def test(): print("----test----") test = func(test) test()
# 使用装饰器对带参数的函数进行装饰 def func(functionName): print("-----func--1---") def func_in(aa,bb): print("-----func-in-1---") functionName(aa,bb) print("-----func-in-2---") print("-----func--2---") return func_in #@func def test(a,b): print("----test--a=%d,b=%d--"%(a,b)) test = func(test) test(11,22)
# 使用装饰器对带不定长参数的函数进行装饰 def func(functionName): print("-----func--1---") def func_in(*args,**kwargs): print("-----func-in-1---") functionName(*args,**kwargs) print("-----func-in-2---") print("-----func--2---") return func_in #@func def test(a,b,c): print("----test--a=%d,b=%d,c=%d--"%(a,b,c)) test = func(test) test(11,22,33)
# 使用装饰器对有返回值的函数进行装饰 def func(functionName): print("-----func--1---") def func_in(): print("-----func-in-1---") ret = functionName() print("-----func-in-2---") return ret print("-----func--2---") return func_in #@func def test(): print("----test----") return 'haha' test = func(test) print(test())
# 通用的装饰器对有参数、无参数、有返回值、无返回值的函数都可以装饰 def func(functionName): def func_in(*args,*kwargs): ret = functionName(*args,*kwargs) return ret return func_in #@func def test(): print("----test----") return 'haha' test = func(test) print(test())
# 装饰器带参数 # 能够起到运行时,有不同的功能 def func_arg(arg): def func(functionName): def func_in(*args,**kwargs): print("---记录日志---arg=%s---"%arg) ret = functionName(*args,*kwargs) return ret return func_in return func # 1.先执行func_arg("heihei")函数,这个函数return的结果是func这个函数的引用 # 2.@func # 3.使用@func对test进行装饰 @func_arg("heihei") def test(): print("----test----") return 'haha' #test = func(test) test()
作用域
什么是命名空间
globals、locals
LEGB规则:
local ->enclosing function ->globals -> builtins
python 是动态语言
添加属性直接添加,添加实例方法 p1.eat = types.MethodType(eat,p1),不能直接原因是self。
静态方法:
@staticmethod
def test():
print("----static method----")
P.test = test
类方法:
@classmethod
def printNum(cls):
print("-----class method----")
P.printNum = printNum
P.printNum()
__slots__ 的作用
class Person(object):
__slots__ = ("name","age")
不能添加name,age之外的其它属性。
生成器
a = [x for x in range(10)]
[0,1,2,3,4,5,6,7,8,9]
方法一:
b = (x*2 for x in range(10))
next(b)
0
next(b)
2
next(b)
4
...
方法二:
斐波拉契数列(Fibonacci),除第一个第二个数外,任意一个数都可由前两个数相加得到:
1,1,2,3,5,8,13,21,34
def creatNum(n): a,b=0,1 for i in range(n): print(b) a,b = b,a+b creatNum(5)
def creatNum(n): print("----start----") a,b=0,1 for i in range(n): print("-----1------") yield b #程序到此停止,把后面的值返回 print("-----2------") a,b = b,a+b print("-----3------") print("----stop----") a = creatNum(5) print(next(a)) print(next(a)) print(next(a)) print(next(a))
def creatNum(n): print("----start----") a,b=0,1 for i in range(n): print("-----1------") yield b #程序到此停止,把后面的值返回 print("-----2------") a,b = b,a+b print("-----3------") print("----stop----") a = creatNum(5) for num in a: print(num)
def creatNum(n): print("----start----") a,b=0,1 for i in range(n): print("-----1------") yield b #程序到此停止,把后面的值返回 print("-----2------") a,b = b,a+b print("-----3------") print("----stop----") #a = creatNum(5) for num in creatNum(5): print(num)
def creatNum(n): print("----start----") a,b=0,1 for i in range(n): print("-----1------") yield b #程序到此停止,把后面的值返回 print("-----2------") a,b = b,a+b print("-----3------") print("----stop----") a = creatNum(5) ret = a.__next__() print(ret) #注意: #next(a) #a.__next__() #以上两种方式是一样的
def creatNum(n): a,b=0,1 for i in range(n): temp = yield b #程序到此停止,把后面的值返回 print(temp) a,b = b,a+b print("-------------------") a = creatNum(5) print(next(a)) print(next(a)) print(a.send("haha")) print(a.send("hello")) print(a.__next__()) 1 None ------------------- 1 haha ------------------- 2 hello ------------------- 3 None ------------------- 5
def test1(): while True: print("--1--") yield None def test2(): while True: print("--2--") yield None t1 = test1() t2 = test2() while True: t1.__next__() t2.__next__()