前言
几天没更新的原因是这几天忙转导师的事情,终于成功转到一个偏计算机研究领域的导师了。曲线救国的道路已经开始,这几天其实也没落下多少,就是没总结而已。而且所看的视频也换成了全栈,感觉全栈的基础课程讲的更好。
把上个视频老师没讲的坑都记了下来,接下来几天应该都在填坑。
动态传参
一些基本概念的复习
基本概念
1.实参(传入)
a.位置
b.关键字
c.混合
2.形参(接受)
a.位置
b.默认
c.动态
c1动态位置传参
c2动态关键字传参
顺序:最终顺序(位置参数,args,默认值参数,*kwargs)参数可以随意搭配使用。
动态传参
#位置动态传参:参数前面加一个* def chi(*food): print(1,food) chi('盖浇饭','拌面','扁肉','蒸饺') def chi_1(name,*food,location = '福州'):#关键字传参得放在动态传参后面 print(2,name+'要吃',food,'于'+location) chi_1('negu','佛跳墙','蒸饺') #关键字的动态传参 def chi_2(**food):#不能有两个**形参,因为第一个**形参会接收所有关键字实参 print(3,food) chi_2(drunk_food = '汉堡',drunk_drink ='可乐') #无敌传参 def chi_3(*args,**kwargs):#任何位置参数和关键字参数都能接受.但接受的时候也应该先收位置再收关键字. pass
函数注释
#函数注释,在def下一行输入三个双引号敲回车,若每个函数都尽量注释,则职业生涯会很顺利! def chi_4(a,b,c): """ 西里呼噜 :param a: :param b: :param c: :return: """ return b+c print(chi_4.__doc__)#document文档注释 (可以使用__doc__进行查看)。
函数的打散
lst=['鸡蛋','煎饼果子','油条','莲子羹']# #chi_5(lst[1],lst[2],lst[3],lst[4]) chi_5(*lst)#用于实参时候将列表打散成一个个元素进行迭代传入函数,若不加*则只传入一个列表 def func(**kwargs): print(5,kwargs) dic = {name:'alex',age:'18'} func(6,**dic)#若不加**只传入一个列表
命名空间
基本概念
函数的调用机理:在python解释器开始执行之后,就会在内存中开辟一片空间,每当遇到一个变量的时候,就把变量值和值之间的的关系记录下来,但是当遇到函数定义的时候,解释器只是读入内存,不关心函数内部的逻辑和变量,只有当函数被调用和访问的时候,解释器才会根据函数内部声明的变量来进行开辟变量的内部空间.随着函数执行完毕,这些函数内部变量占用的空间也会随着函数执行完毕而被清空。
我们给存放名字和值的关系的空间起一个名字叫: 命名空间. 我们的变量数据存储的时候就
是存储在这片空间中的.
命名空间分类:
1. 全局命名空间--> 我们直接在py文件中,函数外声明的变量存储于于全局命名空间。(例如在py中直接声明a = 1)
2. 局部命名空间--> 在函数中声明的变量存储在在局部命名空间
3. 内置命名空间--> 存放python解释器为我们提供的名字, list, tuple, str, int这些都是内置命名空间
加载顺序:
1. 内置命名空间
2. 全局命名空间
3. 局部命名空间(函数被执行的时候)
取值顺序:
1. 局部命名空间
2. 全局命名空间
3. 内置命名空间
展示
a=10#全局名称空间的内容 def fn():#fn也在全局名称空间 b=20#局部名称空间 print(a) def gm(): print(a) fn()#10 gm()#10
查看作用域的变量
a = 10 def fn(): b = 20 def gn():#局部 c = 30 print(3,locals())#输出c:30 gn() print(1,globals())#可以查看全局作用域中的内容,除了gn()函数其它都有。。 print(2,locals())#查看当前作用域中的内容,写在顶格和print(globals())没区别. fn()
函数的嵌套
def outer():#2 print('outer')#3 def inner(): print('inner')#5 inner 函数结束跳出后outer函数结束 inner()#4 outer()#1 a = 1 def wrapper(): print(a) wrapper()#a =1 不会报错 wrapper() def wrapper_1(): a+=1#此时函数想要修改全局变量,会报错.除非加global函数 print(a) wrapper()
global和nonlocal
a=10#全局变量本身就是不安全的 ,访问权限太大所有人都能看见,不能随意修改,在函数中修改全局变量会报错 .解决方法:闭包 def func(): '访问func之后把全局a换成20' global a#1.将全局变量内容引入函数内部 2.在全局创建一个变量 a = 20 func() print(a) def outer(): a = 10 def inner():#在inner中改变a的值 nonlocal a #一层层往外找a,找到离它最近的a然后引进(可改变),但永远不会找全局.找不到也会报错 a = 20 inner() print(a) outer() #地狱特训 a = 1 def fun_1(): a = 2 def fun_2(): nonlocal a a = 3 def fun_3(): a = 4 print(a) print(a) fun_3() print(a) print(a) fun_2() print(a) print(a) fun_1() print(a) #1 2 3 4 3 3 1