python进阶

1. 函数的执行与传递

当你把一对小括号放在后面,这个函数就会执行;然而如果你不放括号在它后面,那它可以被到处传递,并且可以赋值给别的变量而不去执行它。参考菜鸟教程

2. 装饰器

说人话的解释:理解 Python 装饰器看这一篇就够了 代码略难懂,修改如下,不用装饰器:

def use_logging(func):
    def wrapper():
        logging.warn("%s is running" % func.__name__)
        return func()    # 把 foo 当做参数传递进来时,执行func()就相当于执行foo()
    return wrapper

def foo():
    print('i am foo')

test = use_logging(foo)  # 因为装饰器use_logging(foo)返回的是函数对象wrapper,这条语句相当于test = wrapper
test()            

或者在wrapper后面加()才会被执行

def use_logging(func):
    def wrapper():
        logging.warn("%s is running" % func.__name__)
        return func()   # 把 foo 当做参数传递进来时,执行func()就相当于执行foo()
    return wrapper()    # 注意这里的括号

def foo():
    print('i am foo')

use_logging(foo)  

 使用装饰器的写法, 第一种:

def use_logging(func): 
def wrapper():
logging.warn("%s is running" % func.__name__)
return func() # 把 foo 当做参数传递进来时,执行func()就相当于执行foo()
return wrapper

@use_logging
def foo(): print('i am foo') foo()

   第二种:

def use_logging(func): 
    def wrapper(): 
        logging.warn("%s is running" % func.__name__) 
        return func() # 把 foo 当做参数传递进来时,执行func()就相当于执行foo() 
    return wrapper() 

@use_logging
def foo():
    print('i am foo')

foo   #这里不要再加括号了!

 

 3. 循环删除列表元素

推荐用filter()函数处理

4.  关于“if __name__==__main__”,一个自己写的bug:

  在文件B里执行以下语句:

from A import func  #从另外一个文件A import函数func

如果A文件里没有main函数会导致执行不正确,个人理解是因为A文件没有给定一个程序入口点,导致A文件第一层代码(没有缩进的部分)都要执行

 

 

 

posted @ 2020-09-17 09:45  tszs_song  阅读(122)  评论(0编辑  收藏  举报