类的补充
super 关键字:超级
class Animals(object):
def __init__(self,name):
self.name = name
print("parent")
def run(self):
print(f"{self.name} is running")
class Lion(Animals):
def __init__(self,name):
super().__init__(name)
print("Super")
lion = Lion("Lion")
print(lion.name)
lion.run()
parent
Super
Lion
Lion is running
class A:
def say(self):
print("A is saying ")
class B:
def say(self):
print("B is saying")
class C:
def say(self):
print("C is saying")
pass
class D(A,B,C):
def say(self):
super(B,D).say(self) #传递的是一个类
#super(B,D()).say() #传递的是一个对象,第二个参数
#super().say() #不传 super(D,D()).say
pass
d = D()
d.say()
print(D.__mro__)
C is saying
(<class '__main__.D'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class 'object'>)
闭包:
闭包又叫词法闭包或函数闭包。
简单说就是函数的嵌套–函数里面嵌套另一个函数。
目的:
为了利用以前写好的函数,给它穿一个马甲,瓤没变,加个壳子包装一下
闭包一定是嵌套函数,内层函数可以引用外层函数的变量(自由变量)
def outer():
data = "data"
def inner():
print(data)
return inner
test = outer()
test()
data
globals :全局变量
locals : 局部变量
a = 3
print(globals())
def test(b):
# a = 3
print(locals())
print(a)
print(globals())
print(b)
test(2)
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000023AD6BA2FD0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:\\python3.9\\mypython\\myproject\\20210405.py', '__cached__': None, 'a': 3}
{'b': 2}
3
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000023AD6BA2FD0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:\\python3.9\\mypython\\myproject\\20210405.py', '__cached__': None, 'a': 3, 'test': <function test at 0x0000023AD6B7F0D0>}
2
绑定的操作:
函数的定义,变量的定义,函数的形参,类的定义,import
自由变量:
def outer():
data = "data"
def inner():
print(data)
return inner
data 就是自由变量
装饰器:
在不改变原代码的情况下对代码进行扩展,实现新的功能。
def test_plus(func):
def test_wrap():
func()
print(2)
print(3)
return test_wrap
@test_plus #运用@链接补充的函数
def test():
print(1)
test()
1
2
3
打印调用函数前,后的时间
import time
def func_test(var):
def func_testA():
print(time.ctime())
var()
print(time.ctime())
return func_testA
@func_test
def test():
time.sleep(3)
print("123")
test()
Mon Apr 5 13:55:32 2021
123
Mon Apr 5 13:55:35 2021
avgerage 闭包操作
def average():
data = []
def avg(arg):
data.append(arg)
result = sum(data)/len(data)
print(result)
return result
return avg
avg = average()
avg(10)
avg(12)
avg(11)
10.0
11.0
11.0
给原函数传两个参数
import time
def log_time(func):
def log_wrapper(arg1,arg2):
print(time.ctime())
func(arg1,arg2)
print(time.ctime())
return log_wrapper
@log_time
def func_test(arg1,arg2):
print("123")
print(arg1,arg2)
# func_test(1,2)
log_wrapper = log_time(func_test)
log_wrapper(1,2)
Mon Apr 5 14:22:24 2021
Mon Apr 5 14:22:24 2021
123
1 2
Mon Apr 5 14:22:24 2021
Mon Apr 5 14:22:24 2021
想要通用性比较强
def log_time(func):
def log_wrapper(*args,**kwargs):
print(time.ctime())
func(*args,**kwargs)
print(time.ctime())
return log_wrapper
给装饰器传参数
import time
def log_level(level="INFO"):
def log_time(func):
def log_wrapper(*args,**kwargs):
print(f"{level}:",time.ctime())
func(*args,**kwargs)
print(f"{level}:",time.ctime())
return log_wrapper
return log_time
@log_level(level="Error")
def func_test(arg1):
print(arg1,":","123")
# log_time = log_level("Error")
# log_wrapper = log_time(func_test)
# log_wrapper("Test")
func_test("Test")
Error: Mon Apr 5 14:44:06 2021
Test : 123
Error: Mon Apr 5 14:44:06 2021
pythong 中内置的装饰器:
@staticmethod
@classmethod
@property
列表推导式:
list_data_3 = [i for i in range(10)]
print(list_data_3,type(list_data_3))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] <class 'list'>
列表推导式中:for , if 都只是一个表达式,没有冒号
list_data_3 = [i for i in range(10) if i % 2 != 0]
print(list_data_3)
[1, 3, 5, 7, 9]
写在for循环后的if操作不能改变结果,只能过滤;写在for循环前才能改变结果
(for 循环后跟过滤的表达式,for 循环之前跟的是对结果进行运算的表达式)
if else 表达式:value1 if condition else value2
bool_list = [True,False,False,True,False,True,True,False]
result_list = [1 if j else 0 for j in bool_list]
print(result_list)
[1, 0, 0, 1, 0, 1, 1, 0]
color_list = ["RED","BLACK","BLUE"]
size_list = ["S","M","L"]
result_list = [(i,j) for i in color_list for j in size_list]
print(result_list)
[('RED', 'S'), ('RED', 'M'), ('RED', 'L'), ('BLACK', 'S'), ('BLACK', 'M'), ('BLACK', 'L'), ('BLUE', 'S'), ('BLUE', 'M'), ('BLUE', 'L')]