4.1 函数

场景:

  • 代码重复执行
  • 代码量特别多超过一屏,可以选择通过函数进行代码的分割

函数的基本结构

#函数的定义
def 函数名():
    # 函数内容
    pass

#函数的执行
函数名()
def get_list_first_data(aaa):  #aaa形式参数,形参
    pass

get_list_first_data()
#函数被调用内部代码才会执行
get_list_first_data(1):   #实际参数,实参

函数4种情况:

  • 情况1
def f1():
     pass
fi()
  • 情况2
def f2(a1):
     pass
f2(123)
  • 情况3
def f3():
     return
v1 = f3()
  • 情况4
def f4(a1,a2):
     return a1 + a2
v2 = f4(1,7)

 

1.函数基本结果


def func(name,age,email):
    # 函数体(保持缩进一致)
    a = 123
    print(a)
    return 1111
    b = 456
    print(b)

result = func(1,2,3)
    
# 函数默认返回值:None

2.参数

  • 基本传参
    • 任意个数
    • 任意类型
      def func(a1,a2,a3): 
          print(a1,a2,a3) 
      
      func(1,"asdf",True) 
  • 位置传参(调用函数并传入参数)【执行】
    def func(a1,a2): 
    print(a1,a2) 
    
    func(1,3)
  • 关键字传参【执行】
    def func(a1, a2): 
        print(a1, a2) 
    
    func(a2=99,a1=2) 
    
    # 关键字传参数和位置传参可以混合使用(位置传入的参数 > 关键字参数在后 = 总参数个数) 
    def func1(a1, a2, a3): 
        print(a1, a2, a3) 
    
    # func(1, 2, a3=9) 
    # func(1, a2=2, a3=9) 
    # func(a1=1, a2=2, a3=9) 
    # func(a1=1, 2,3) # 错误 
  • 默认参数【定义】
    def func(a1,a2,a3=9,a4=10): 
        print(a1,a2,a3,a4) 
    
    func(11,22) 
    func(11,22,10) 
    func(11,22,10,100) 
    func(11,22,10,a4=100) 
    func(11,22,a3=10,a4=100) 
    func(11,a2=22,a3=10,a4=100) 
    func(a1=11,a2=22,a3=10,a4=100)
    
    函数的默认值慎用可变类型,如:列表[]
    # 如果要想给value设置默认是空列表
    # 不推荐(坑)
    def func(data,value=[]): 
        pass
    
    # 推荐
    def func(data,value=None):
        if not value:
            value = []
  • 万能参数
    • *args
      • 可以接受任意个数的位置参数,并将参数转换成元组。
        • 调用函数无 *
          def func(*args): 
              print(args) 
          
          func(1,2,3,4) 
        • 调用函数有*
          def func(*args): 
              print(args) 
          
          func(*(1,2,3,4)) 
          func(*[1,2,3,4])
      • 只能用位置传参
        def func(*args): 
            print(args) 
        
        # func(1) 
        # func(1,2) 
        func(1,2) # args=(1, 2) 
        func((11,22,33,44,55)) # args=((11,22,33,44,55),) 
        func(*(11,22,33,44,55)) # args=(11,22,33,44,55) 
    • **kwargs
      • 可以接受任意个数的关键字参数,并将参数转换成字典。
        • 调用函数无 **
          def func(**kwargs): 
          
          print(kwargs) 
          func(k1=1,k2="alex") 
        • 调用函数有**
          def func(**kwargs): 
              print(kwargs) 
          
          func(**{'k1':'v2','k2':'v2'}) # kwargs={'k1':'v2','k2':'v2'}
      • 只能用关键字传参
      • 综合应用:无敌 + 无敌 => 真无敌
        def func(*args,**kwargs): 
            print(args,kwargs) 
        
        # func(1,2,3,4,5,k1=2,k5=9,k19=999) 
        func(*[1,2,3],k1=2,k5=9,k19=999) 
        func(*[1,2,3],**{'k1':1,'k2':3}) 
        func(111,222,*[1,2,3],k11='alex',**{'k1':1,'k2':3})
  • 严格按照顺序传参数:位置传参。
  • 实际参数可以是任意类型,任意个数
  • 关键字传参
  • 关键字传参数和位置传参可以混合使用(位置传入的参数 > 关键字参数在后 = 总参
func(1,2)  #位置传参
func(1,[11,22,3]) #任意类型,任意个数
func({'k1':'k'},[11,22,3])
func(a1=11,a2=22)  #关键字传参

#万能参数
*args
接受任意个数的位置参数,并将参数转换成元组

*kwargs
可以接受任意个数的关键字参数,并将参数转换成字典

3.返回值

  • 函数没有返回值,默认返回:None
  • 函数内部执行过程中遇到return,就终止。
def func1():
    return "完成" # 函数每次执行到此,就返回;所以下面代码永远不执行。
    for i in range(10):
        print(i)
func1()


def func2():
    for i in range(10):
        print(i)
        return "完成"
    print(666)
func2()

return 可以返回任意类型

def func():
    return (1,2,3)

v = func()
print(v)

# 特殊:返回元组
def func():
    return 5,8,"alex"

v = func()
print(v)

4.作用域

  • 一个函数就是一个作用域
  • 作用域中查找数据规则:优先在自己的作用域找数据,自己没有就去“父级” --> “父级”-->全局。
  • 子作用域中只能找父级中的值,无法重新为父级的变量进行赋值。 
    对全局变量赋值 先 global 找到变量在进行赋值操作
    global [变量名] 
    name = "bing"
    
    对上一级变量赋值
    nonlocal [变量名]
    name = "bing" 

补充:函数小高级

  • 全局变量 用大写
  • 函数可以被循环
    def func():
        print(123)
    func_list = [func,func,func]
    func_list[0]()
    func_list[1]()
    func_list[2]()
    for item in func_list:
      v = item()
        print(v)
    
    #123 None
  • 函数可以当参数进行传递
    def func(arg):
        print(arg)
    
    def show():
        return 999
    func(show)
  • 函数可以用作字典的value
    f1:func1
    f2:func2
    choice = input('please input:')
    function_name = info.get(choice)
    if function_name:
      function_name()
    else:
        print("输入错误")

补充:lambda表达式

  • 三元运算,为了解决简单的if else的情况,如:
    a = 123 if 1 == 1 else 456
  • lambda表达式,为了解决简单函数的情况,如:
    def func(a1,a2):
        if a1 > a2:
             print(a1)
        else:
             print(a2)
    
    func = lambda a1,a2:  a1 if a1 >a2 else a2
    v = func(1111,22)
    print(v)

总结:
列表所有的方法基本上都是返回None;字符串的所有方法基本上都返回新值

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注