动态传参
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  找局部作用域中外层 离他最近的那个变量引入进来