qiaoliang0302

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

迭代器:

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__()

 

posted on 2019-08-06 13:22  qiaoliang0302  阅读(220)  评论(0编辑  收藏  举报