前言
几天没更新的原因是这几天忙转导师的事情,终于成功转到一个偏计算机研究领域的导师了。曲线救国的道路已经开始,这几天其实也没落下多少,就是没总结而已。而且所看的视频也换成了全栈,感觉全栈的基础课程讲的更好。
把上个视频老师没讲的坑都记了下来,接下来几天应该都在填坑。
动态传参
一些基本概念的复习
基本概念
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