1、默认参数应该放在最后
2、收集函数
函数参数为收集参数,当不知道参数为多少个时使用收集参数。
def myfunc(*args):
print("函数有{}个参数".format(len(args)))
print("打印第{}个函数".format(args[1]))
myfunc(1,2,3)
输出结果:
函数有3个参数
打印第2个函数
使用元组打包收集参数
def myfunc(*args):
print(args)
myfunc(1,2,3)
返回多个值,解包
def func2():
return 1, 2, 3
print(func2()) #返回多个值
x,y,z = func2() #将值解包
print(x)
print(y)
print(z)
使用字典打包收集参数
def func3(**kwargs):
print(kwargs)
func3(a=2,b=3,c=4)
输出:
{'a': 2, 'b': 3, 'c': 4}
3、闭包:对于嵌套函数来说,外层函数的作用域里面的变量会通过某种形式保留下来,不会像局部变量调用完就消失了
4、装饰器
import time
def myfunc(fun): #使用函数作为参数
def call_func():
start = time.time()
fun() #函数调用
stop = time.time()
times = stop - start
print(f"总共花费了{times:.2f}长时间")
return call_func #用到闭包
@myfunc
def func():
time.sleep(2)
print("func函数执行")
func() #调用func函数就使myfunc函数执行,在不修改代码的前提下,增加其他函数更方便
5、lambda表达式
可以出现在不能使用def定义函数的地方,只能实现一些功能较为简单的函数,而复杂功能的函数交给def function()去解决。
6、生成器
有没有一种办法可以在函数退出之后还能够保留状态,闭包的定义相对复杂,过多的使用全局变量会污染命名空间。生成器:使用yeild代替return
生成器和for循环的区别:生成器只有在输出的时候才会生成元素,像一只不断会下单的母鸡,for循环是将所有元素放在容器中,这些元素是提前已知的
def myfunction():
x = 0
while x <= 5:
yield x
x+=1
c = myfunction()
print(next(c)) # 0
print(next(c)) # 1
print(next(c)) # 2
斐波那契数列
def fun():
back1,back2 = 0,1
while True:
yield back1
back1,back2 = back2,back1+back2
f =fun()
print(next(f)) # 0
print(next(f)) #1
print(next(f)) #1
print(next(f)) #2
print(next(f)) #3
7、生成器推导式
把列表推导式的方括号换成圆括号
t = (i**2 for i in range (10))
print(next(t)) # 0
print(next(t)) # 1
print(next(t)) # 45
8、self
把变量变成类变量,直接用类就可以调用这个变量
实例对象和类的方法绑定
类中的方法,每个对象都是共享的
对象自己的属性是私有的
class C:
def set_x(self, v):
self.x = v
c = C()
c.set_x(10)
print(c.x) # 10 对象c的属性值改为10
b = C()
b.set_x(20) #对象b的属性值改为20
print(b.x)
print(b.__dict__) #查看对象b的所有属性
class C:
x = 0
def set_x(self,v):
x = v
c = C()
c.set_x(10)
print(c.x) # 10 对象c的值不发生改变
9、构造函数 __init__
实例化对象的同时实现个性化
class C:
def __init__(self, name, age):
self.name = name
self.age = age
t = C('小明', 12)
print(t.__dict__) # {'name': '小明', 'age': 12}
s = C("小华", 15)
print(s.__dict__) # {'name': '小华', 'age': 15}