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文件第一层代码(没有缩进的部分)都要执行