python day12

函数的两大分类

形式参数
在函数定义阶段括号内所填写的参数 简称'形参’
  def func(a,b):
           pass
       #a和b就是函数func的形参
实际参数
在函数调用阶段括号内传入的参数 简称'实参'
func(1,2)
   #数据1和2就是函数func的实参
"""
形式与实参的关系
我们可以将形参看成是变量名 实参看成是变量值
两者在函数调用阶段临时绑定 函数运行结束断开

形参的表现形式只有一种 就是变量名
实参的表现形式有很多种(但是把握核心 就是 数据值)
"""

位置参数

位置参数
按照从左往右的顺序依次填入的参数
位置形参
在函数定义阶段括号内按照从左往右的顺序依次填入的变量名
位置实参
在函数调用阶段括号内按照从左往右的顺序依次传入的数据值
#定义一个可以比较大小的函数(传入两个值 返回较大的)

关键字实参(可以打破位置顺序)
在函数调用阶段通过形参名=数据值的形式指名道姓的传值
"""
1.位置形参与位置实参在函数调用阶段 按照唯一一一对应绑定
2.位置参数在绑定的时候多一个不行 少一个也不行
"""
"""格式越简单的越靠前 格式越复杂的越靠后"""

默认参数

默认参数
默认形参
  函数在定义阶段就可以给形参赋值了
      1.该形参在函数调用阶段如果不给值 则使用默认的
           2.该形参在函数调用阶段也可以继续给值 则使用你给的
           
   #定义学院注册功能
       def register(name,age,gender='male')
           print('%s:$s;%s'%(name,age,gender))
       register('jason',18)
       register('tong',28)
       register('kevin', 38)
       register('lili', 18, 'female')
       register('lili', 18, gender='female')
   """
  位置形参与默认值形参在定义的时候
  位置形参必须在默认值形参的前面
  """
  """格式越简单的越靠前 格式越复杂的越靠后"""

可变长参数

#1.函数无论传入多少参数位置都可以正常运行
# 可变长形参
# def func(x,y,*a):
# print(x,y,a)
#func()   #()
#func(1)   #(1,)
#func(1,2,3,4,5,6,7) #(1,2,3,4,5,6,7)
# func(1,2) # 1 2 ()
# func(1,2,3,4,5,6,7,8,9) # 1 2 (3, 4, 5, 6, 7, 8, 9)
# func(1,2) # 1 2 (3, 4, 5, 6, 7, 8, 9)
"""
*号在形参中的使用
  用于接收多余的位置参数 并组织成元组的形式赋值给*号后面的变量名
"""


# 2.函数无论传入多少关键字参数都可以正常运行
# def index(x, y, **b):
#     print(x, y, b)
# index() # {}
# index(a=1,b=2,c=3,d=4) # {'a': 1, 'b': 2, 'c': 3, 'd': 4}
# index(y=2, x=1) # 1 2 {}
# index(y=2, x=1, u=222, k=111, l=444) # 1 2 {'u': 222, 'k': 111, 'l': 444}
"""
**号在形参中的使用
  用于接收多余的关键字参数 并组织成字典的形式赋值给**号后面的变量名
"""
# 3.定义一个函数无论传入多少位置参数和关键字参数都可以正常运行
# def index(*a,**b):
#     print(a,b)
# index() # () {}
# index(1,2,3,4) # (1, 2, 3, 4) {}
# index(a=1,b=2,c=3) # () {'a': 1, 'b': 2, 'c': 3}
# index(1,2,3,4,a=1,b=2,c=3) # (1, 2, 3, 4) {'a': 1, 'b': 2, 'c': 3}
"""
墨守成规
  可变长形参 *与**后面的变量名其实是可以随便定义的
  但是python中推荐使用
      *args  
      **kwargs
def index(*args, **kwargs):
  pass
"""


# def index(a, b, c):
#     print(a,b,c)
# new_list = [11,22,33]
# index(new_list) # 肯定不行 列表是一个整体 相当于一个实参
# index(new_list[0],new_list[1],new_list[2]) # 可以
'''如果index形参是*args 列表里面有很多元素 如何实现按照位置一一传入'''
# def index1(*args):
#     print(args)
# new_list1 = [11,22,33,44,55,66,77,88,99]
# index1(*new_list1) # index1(11,22,33,44,55,66,77,88,99)
"""
*号在实参中的使用
  会将列表、元组内的元素打散成位置参数的形式一一传值
"""

# def index2(**kwargs):
#     print(kwargs)
new_dict = {'username':'jason','pwd':123}
# index2(**new_dict) # index2(username='jason',pwd=123)
# {'username': 'jason', 'pwd': 123}
"""
**号在实参中的使用
  会将字典内的键值对打散成关键字参数传入
"""

函数参数补充

1.命名关键字参数
def register(name,age,*,sex,height)
  pass
   #register('jason,18,'male',183)
   register('lili',18,sex='male',height='1.8')#正确使用
   """
  sex height在传入实参的时候必须以关键字参数的形式
   
  ps:该欸行动参数几乎不用 也几乎很少能碰到
  """

名称空间

#什么是名称空间(namespaces)
用于存放变量名与变量值绑定关系的地方(类似于民政局)
#名称空间的分类(重要)
1.内置名称空间
  python解释器提前给你定义好的
      print()
           len()
          ...
   2.全局名称空间
  在py文件中顶格编写的代码之后都会存入全局名称空间
      name = 'jason' #name全局
           def func(): #func全局
               pass
           if 1:
               a = 123 # a全局
           for i in range(10):
               print(i) # i全局
           while True:
               a = 123 # a全局
    3.局部名称空间
  函数体代码运行之后产生的都是局部名称空间
   #存货周期
   1.内置名称空间
  python解释器启动与关闭而创建和销毁
   2.全局名称空间
  随着py文件的运行与结束而创建和销毁
       

名字的查找顺序

#在查找名字的时候 要先确定自己当前在哪
1.如果你在局部
  局部 >>> 全局>>> 内置
   2.如果你在全局
  全局 >>> 内置
#局部名称空间的嵌套
"""函数在定义阶段名字的查找顺序就已经固定死了(特例)"""
x = 111
def f1():
   x = 222
   def f2():
       x = 333
       def f3():
           x = 444
           def f4():
               x = 555
               print(x)
               # x = 555 特例
           f4()
       f3()
   f2()
# 通过调用f1 执行所有的函数
f1()

 

posted @ 2021-11-15 19:13  杰尼龟无所畏惧  阅读(47)  评论(0)    收藏  举报