lambda

1
2
3
4
5
6
7
8
9
f=lambda a,b,c,d:a*b*c*d
print(f(1,2,3,4))


#相当于下面这个函数

def test01(a,b,c,d):
return a*b*c*d
print(test01(1,2,3,4))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1 print([f(2) for f in [lambda x:i*x for i in range(5)]])
2 print([f(2) for f in [lambda x,i=i:i*x for i in range(5)]])
3 print([(lambda x:i*x)(2) for i in range(5)])


[8, 8, 8, 8, 8]
[0, 2, 4, 6, 8]
[0, 2, 4, 6, 8]


1 先声5个匿名函数 x是匿名函数的变量,i是匿名函数外部的变量,所以会变,用的是最后的i ,最后调用匿名函数
2 先声5个匿名函数 x,i是匿名函数的变量,i的默认值从外部的i传入 ,最后调用匿名函数
3 一边声明 一边调用 x是匿名函数的变量,i是匿名函数外部的变量

  

可迭代对象、迭代器与生成器

可迭代对象

1
2
3
4
实现了__iter__的对象就是可迭代对象
class IsIterable:
def __iter__(self):
return self

迭代器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
实现了 __ iter __  +__ next __
>>> class MyIterator:
"""
迭代器类
Author:可乐python说
"""
def __init__(self):
self.num = 0
def __iter__(self):
return self
def __next__(self):
return_num = self.num
# 只要值大于等于6,就停止迭代
if return_num >= 6:
raise StopIteration
self.num += 2
return return_num

>>> my_iterator = MyIterator()
>>> next(my_iterator)
0
>>> next(my_iterator)
2
>>> next(my_iterator)
4
>>> next(my_iterator)
Traceback (most recent call last):
File "<input>", line 1, in <module>
StopIteration

生成器

1
2
特殊的迭代器 
不需要实现 __ iter __ +__ next __ 又可以实现相同的作用 ,有以下两种方式

生成器函数

借助yield实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
>>> def my_generator():
my_num = 0
while my_num < 5:
yield my_num
my_num += 1

>>>generator_ = my_generator()
>>> next(generator_)
0
>>> next(generator_)
1
>>> next(generator_)
2
>>> next(generator_)
3
>>> next(generator_)
4
>>> next(generator_)
# 终止迭代则会抛出 StopIteration 异常
Traceback (most recent call last):
File "<input>", line 1, in <module>
StopIteration

生成器表达式

使用 () 包裹,而不是【】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
g = ((i)**2 for i in range(5))
print (next(g))
print (next(g))
print (next(g))
print (next(g))
print (next(g))
print (next(g))
print (next(g))



0
1
4
9
16
Traceback (most recent call last):
File "d:\python\test.py", line 7, in <module>
print (next(g))
StopIteration

优势

1
2
3
4
5
6
7
8
9
10
11
import sys

my_list = [i for i in range(1000000)]
print( "列表消耗的内存:{}".format(sys.getsizeof(my_list)))

my_generator = (i for i in range(1000000))
print("生成器消耗的内存:{}".format(sys.getsizeof(my_generator)))


列表消耗的内存:8448728
生成器消耗的内存:112

参考

https://www.runoob.com/python3/python3-iterator-generator.html

https://kelepython.readthedocs.io/zh/latest/c01/c01_11.html

装饰器

普通装饰器

修饰符号:@

本质是闭包

https://www.runoob.com/w3cnote/python-func-decorators.html

多层装饰器

顺序为从下至上

带参装饰器

内置装饰器

@property

方法转换为相同名称的只读属性

1
2
3
4
5
6
7
8
9
10
class dataset(object):
@property
def fun1(self):
return 13
def fun2(self):
return 13

a=dataset()
print(a.fun1)
print(a.fun2())

@staticmethod

@classmthod

https://zhuanlan.zhihu.com/p/35643573


:D 一言句子获取中...