动态传参
def chi(*food): #可以传入任意的位置参数,*是任意,food就是形参的名字
print(“我要吃”,food) #动态参数接收到的是tuple类型的数据
chi(“盖浇饭”,“辣条”,“面条”)#打印的结果是我要吃(‘盖浇饭’,“辣条”,“面条”)
顺序:先写位置参数,再写动态参数*,最后是默认值参数,如果想修改默认值参数,需要用关键字参数来修改,例如d=“qwq”
def func(a,b,c,*args,d=5):
print(a,b,c,d,args)
func(1,2,3,4,5,6,7) # 1 2 3 5 (4,5,6,7)
func(1,2,3,4,5,6,7,d="qwq”) # 1 2 3 qwq (4,5,6,7)
#写函数,给函数传递任意个整数,返回这些数的和。
def he(*n):
sum = 0
for el in n:
sum += el
return sum
print(he(1,2,3,4,5))
#动态接收关键字参数
* 位置参数
**关键字参数 #:其中有两个*,一个*是key 一个*是value
def func(**food): # **food是动态接收关键字参数
print(food) #接收到的是字典
func(goodfood=“盖浇饭”,badfood=“辣条”) #{“goodfood”:“盖浇饭”,“badfood”:“辣条”}
终极顺序:位置参数>*args>默认值参数>**kwargs
命名空间
在python解释器开始执行之后,就会在内存中开辟一个空间,每当遇到一个变量的时候,就把变量名和值之间的关系记录下来,但是当遇到函数定义的时候,解释器只是把函数名读入内存,表示这个函数存在了,至于函数内部的变量和逻辑,解释器是不关心的,也就是说一开始的时候函数只是加载进来,仅此而已,只有当函数被调用和访问的时候,解释器才会根据函数内部声明的变量来进行开辟变量的内部空间,随着函数执行完毕,这些函数内部变量占用的空间也会随着函数执行完毕而被清空。
内置命名空间:存放python解释器为我们提供的名字,list,tuple,str,int这些都是内置命名空间。
全局命名空间:我们直接在py文件中,函数外声明的变量都属于全局命名空间。
局部命名空间:在函数中声明的变量会放在局部命名空间
加载顺序:内置命名空间,全局命名空间,局部命名空间(函数被执行的时候)
取值顺序:局部命名空间,全局命名空间,内置命名空间
a = 10
def func():
a = 20
print(a)
func() #打印的结果是a=20,就近原则,如果局部变量中a=20取消,那么a=10
作用域:作用域就是作用范围,按照生效范围来看 分为全局作用域和局部作用域
全局作用域:包含内置命名空间和全局命名空间。在整个文件得任何位置都可以使用(遵循从上到下逐行执行)。
局部作用域:在函数内部可以使用。
作用域命名空间
全局作用域:全局命名空间+内置命名空间
局部作用域:局部命名空间
我们可以通过globals()函数来查看全局作用域中的内容,也可以通过locals()来查看局部作用域中的变量和函数信息。
函数的嵌套
1.只要遇见了(),就是函数的调用,如果没有()就不是函数的调用。
定义python函数时,如果没有return语句,则默认返回空值NONE
def chi():
print(“我要吃”)
print(chi) #结果是0x000012 内存地址
print(chi()) #结果是 我要吃 None
global
a = 10
def func():
global a #把外面全局中的a引入,表示a不在是局部变量,而变成了全局变量
a = a + 10 #全局中的a变成20
print(a)
func()
print(a) #20
nonlocal 找局部作用域中外层 离他最近的那个变量引入进来