第五章 函数

时间:2019-08-28
本文章向大家介绍第五章 函数,主要包括第五章 函数使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

5.1 函数基础内容

  • 创建函数

    def  函数名():
        pass
    函数名()  #  调用函数

5.1.1参数

  • 形参实参

    def get(n):   # n 是形参,也就是变量
        print(n)
    
    get(1)  #  实参 就是给n 赋值
  • 位置参数 > 关键字参数

    #     位置参数
    '''
        注意 :
                传参数不能 少传 或  多传
                n(1,2,3,4)
                TypeError: n() takes 3 positional arguments but 4 were given
    '''
    def n (a1,a2,a3):
        print(a1,a2,a3)
    
    n(1,2,3)
    
    #   关键字参数
    '''
       注意 :
                位置参数  > 关键字参数
    
                n(a1=1,2,3)   关键字参数在前必须全传关键字参数,
                              不然 就报错  SyntaxError: positional argument follows keyword argument
     '''
    
    def n (a1,a2,a3):
        print(a1,a2,a3)
    
    n(1,2,a3=3)
    n(1,a2=2,a3=3)
    n(a1=1,a2=2,a3=3)
    
  • 默认参数

    '''
        注意 :
                如果传参时,不给值,可以给以默认值传入
                            给值,就重新赋值           
     '''
    
    def n (a1,a2,a3=17):
        print(a1,a2,a3)
    
    n(1,2,)  
    n(1,2,3)
    
    ####  默认值传可变类型有坑
    
    def func(a1,a2=[]):
        a2.append(a1)
        return a2
    v1 = func(1)  # [1]
    print(v1)
    
    v2 = func(2)  # [1, 2]
    print(v2)
    
    print(v1,v2)  # [1, 2] [1, 2]
    
    # a2 = [] 就在函数func 中存着,第一次  v1 = func(1)  ====  v1 指向a2 [1]
    # 第二次  v2 =func(2)  ====v2 指向 a2 =[1,2]  而v1 也指向 a2 像字符串的拷贝
    
    v3 = func(1,[11,22,33])  # a2 =[11,22,33]
    print(v3)   # [11, 22, 33, 1]
    
    
  • 万能参数 *a r gs **kw a r gs

    '''
        *args   是个元祖形式  拿走其余的位置参数
    
        **kwargs       字典形式   拿走其余的关键字参数
    
        注意  默认是  args  kwargs  带*参数 都可以的
            只有这俩个时 ,不分  位置参数 >  关键字参数
            n(1,2,k1=2,k2=2,*(3,4,5),**{'k3':3})  #(1, 2, 3, 4, 5) {'k1': 2, 'k2': 2, 'k3': 3}
    
        '''
    
    def n(*args):
        print(args)
    
    n(1,2,3,4,[2.43,3,4],'alex')
    n(*(1,2,3,4))  #(1, 2, 3, 4)
    
    n((1,2,3,4))  #((1, 2, 3, 4),)
    
    
    def n(*args,**kwagrs):
        print(args,kwagrs)
    
    n(1,2,3,[2,3,3],ki=1,k2=2,k3=3)
    
    
    
    #应用
    def n(a1,a2,a3=4,*args,**kwargs):
        print(a1,a2,a3,args,kwargs)
    
    n(1,2,3,4,55,k1=1,k2=2)
    n(1,*(2,3,3,4,5),k1=1,k2=2)   #1 2 3 (3, 4, 5) {'k1': 1, 'k2': 2}
    n(*(1,2),2,3,4,k1=1,k2=2)   #1 2 2 (3, 4) {'k1': 1, 'k2': 2}
    

5.1.2 返回值

  • return 默认返回none

    def count(a) :
        n +=1
        return n   #返回给函数调用
    ifon = count(1)
    print(ifon)
    
    
    def get_count(count):
        n = 'false'
        if len(count) < 5:
            n = 'ture'
        return n  #把 n 返回给函数
    
    m =get_count((10,2,3,4,4.3))
    print(m)
    
    
    #  可以return 任何类型
    def n():
        return 1,2,3,2
    m= n()
    print(m)
    
    def n():
        return [1,2,'alex']
    m= n()
    print(m)
#  练习
'''
用函数完成目标要求  
读取文件 进行操作
目标  1  a = ['alex|123|12','reic|123|15']
      2  b = [['alex',"123",'12'],['reic','123','15']]
      2  c = [{'name':'alex','age':'123','foin':'12'}
              {'name':'reic','age':'123','foin':'15'}
'''

练习1
def get_list(wen):
    a =[]
    for line in wen:
        line = line.strip('\n')
        a.append(line)
    return a
#  ['alex|123|12', 'reic|123|15']
f1=open("a.txt",mode='r',encoding="utf-8")
n =get_list(f1)
print(n)
f1.close()

练习2
def get_list1(n):
    a =[]
    for line in n:
        line = line.strip('\n')
        li = line.split("|")
        a.append(li)
    return a
#  [['alex', '123', '12'], ['reic', '123', '15']]
f1=open("a.txt",mode='r',encoding="utf-8")
m = get_list1(f1)
print(m)
f1.close()

练习3
def get_list1(n):
    lst =[]
    for line in n:
        line = line.strip('\n')
        li = line.split("|")
        dic ={}
        dic['name']=li[0]
        dic['age']=li[1]
        dic['money']=li[2]
        lst.append(dic)
    return lst

f1=open("a.txt",mode='r',encoding="utf-8")
n =get_list1(f1)
print(n)
f1.close()

5.1.3 作用域

  • global 全局变量 在函数外的变量
  • nonlobal 局部变量 就是一个函数的函数体的变量 局部没有到父级找
#    如果在调用函数之前可以修改变量
def v ():
    print(name)   # alex
    def v1 ():
        name = 'jion'
        print(name)  #  jion
        def v2 ():
            print(name)  # jion

        name ='ball'    # 调用前修改
        v2()
        print(name)  #ball
        name = 1
        print(name)  # 1

    v1()
v()
  • 修改变量

    # 1 在函数内修改全局变量
    name = 'alex'
    def info():
        print(name)
        def info1():
            global name   
            name = 'jion'
            print(name)
        info1()
    info()
    
    # 2 在嵌套函数内部修改 父级变量
    
    name = 'alex'
    def info():
        print(name)
        def info1():
            name = 'jion'
            print(name)
            def infos ():
                nonlocal name
                name = 233
                print(name)
            infos()
            print(name)
        info1()
    info()
    
    '''
      注意 :    在修改 global 或者  ninlobal 时
              在函数名和global 之间不能操作'''
    
    name = 'alex'
    def info():
        print(name)
        def info1():
            name = 222  # 注意点
            global name
            name = 'jion'
            print(name)
        info1()
    info()           
    
    #  SyntaxError: name 'name' is assigned to before global declaration

    想清楚为什么要有global和nonlocal。

    自我理解
    原因是  全局变量和函数是俩个封闭的内存空间。互不影响,所以在函数内部修改不了全局变量就定义了globa
         在函数嵌套,内层函数无法修改上层函数 , nongloba 就可以

原文地址:https://www.cnblogs.com/xuanxuan360/p/11425186.html