python学习笔记(一)

系统 551 0

这里主要是总结学习过程中遇到的一些问题和注意事项


文章目录

  • 关于函数参数问题
    • 默认参数
    • 可变参数
    • 关键参数
  • 关于函数作为返回值
  • 关于Function 和 Method理解


  1. 关于函数参数问题

    默认参数

    函数参数可以有默认参数,而默认参数使用不当很容易掉坑里。

                    
                      
                        def
                      
                      
                        personInfo
                      
                      
                        (
                      
                      name
                      
                        ,
                      
                      age 
                      
                        =
                      
                      
                        22
                      
                      
                        ,
                      
                      city 
                      
                        =
                      
                      
                        'BeiJing'
                      
                      
                        )
                      
                      
                        :
                      
                      
                        print
                      
                      
                        (
                      
                      name
                      
                        ,
                      
                      age
                      
                        ,
                      
                      city
                      
                        )
                      
                      
    
    personInfo
                      
                        (
                      
                      
                        'allen'
                      
                      
                        )
                      
                      
                        # ==> allen 22 BeiJing        
                      
                      
    personInfo
                      
                        (
                      
                      
                        'allen'
                      
                      
                        ,
                      
                      city 
                      
                        =
                      
                      
                        'SH'
                      
                      
                        )
                      
                      
                        # ==> allen 22 SH
                      
                      
    personInfo
                      
                        (
                      
                      
                        'allen'
                      
                      
                        ,
                      
                      
                        18
                      
                      
                        )
                      
                      
                        # ==> allen 18 BeiJing
                      
                    
                  

    以上函数执行的时候,没有问题,很正常。在看一下下面的函数

                    
                      
                        def
                      
                      
                        add_end
                      
                      
                        (
                      
                      L 
                      
                        =
                      
                      
                        [
                      
                      
                        ]
                      
                      
                        )
                      
                      
                        :
                      
                      
    L
                      
                        .
                      
                      append
                      
                        (
                      
                      
                        'END'
                      
                      
                        )
                      
                      
                        print
                      
                      
                        (
                      
                      L
                      
                        )
                      
                      
    
    add_end
                      
                        (
                      
                      
                        [
                      
                      
                        1
                      
                      
                        ,
                      
                      
                        2
                      
                      
                        ,
                      
                      
                        3
                      
                      
                        ]
                      
                      
                        )
                      
                      
                        # ==> [1, 2, 3, 'END']
                      
                      
    add_end
                      
                        (
                      
                      
                        )
                      
                      
                        # ==> ['END']
                      
                      
    add_end
                      
                        (
                      
                      
                        )
                      
                      
                        # ==> ['END', 'END']
                      
                    
                  

    我们看到默认值是 [] ,为什么调用两次之后 add_end() 之后会出现 ['END', 'END'] 这样的结果,原因是 [] 是可变对象,如果学过c++的同学可能很容易理解,在里的 L 是一个指针,指向一块地址,而这块地址的内容在多次调用 add_end() 之后内容发生变化,而指针所指向的地址未发生变化。这里我们需要注意: 定义默认参数要牢记一点:默认参数必须指向不可变对象
    修改上述例子:

                    
                      
                        def
                      
                      
                        add_end
                      
                      
                        (
                      
                      L
                      
                        =
                      
                      
                        None
                      
                      
                        )
                      
                      
                        :
                      
                      
                        if
                      
                       L 
                      
                        is
                      
                      
                        None
                      
                      
                        :
                      
                      
    		L 
                      
                        =
                      
                      
                        [
                      
                      
                        ]
                      
                      
    	L
                      
                        .
                      
                      append
                      
                        (
                      
                      
                        'END'
                      
                      
                        )
                      
                      
                        print
                      
                      
                        (
                      
                      L
                      
                        )
                      
                    
                  

    可变参数

    在参数前面加一个 * 号,函数内部参数 param 接收到一个tuple。同样Python允许你在list或tuple前面加一个 * 号,把list或tuple的元素变成可变参数传进去

                    
                      
                        def
                      
                      
                        printParam
                      
                      
                        (
                      
                      
                        *
                      
                      param
                      
                        )
                      
                      
                        :
                      
                      
                        for
                      
                       x 
                      
                        in
                      
                       param
                      
                        :
                      
                      
                        print
                      
                      
                        (
                      
                      x
                      
                        )
                      
                      
    
    printParam
                      
                        (
                      
                      
                        1
                      
                      
                        ,
                      
                      
                        2
                      
                      
                        ,
                      
                      
                        3
                      
                      
                        )
                      
                      
                        # ==> 1,2,3
                      
                      
    printParam
                      
                        (
                      
                      
                        [
                      
                      
                        1
                      
                      
                        ,
                      
                      
                        2
                      
                      
                        ,
                      
                      
                        3
                      
                      
                        ]
                      
                      
                        )
                      
                      
                        # ==> [1,2,3]
                      
                      
    printParam
                      
                        (
                      
                      
                        *
                      
                      
                        [
                      
                      
                        1
                      
                      
                        ,
                      
                      
                        2
                      
                      
                        ,
                      
                      
                        3
                      
                      
                        ]
                      
                      
                        )
                      
                      
                        # ==> 1,2,3
                      
                    
                  

    关键参数

    关键参数
    ** +参数,如 **kw , kw 将获得一个dict.

                    
                      
                        # 关键字参数
                      
                      
                        def
                      
                      
                        person
                      
                      
                        (
                      
                      name
                      
                        ,
                      
                      age
                      
                        ,
                      
                      
                        **
                      
                      kw
                      
                        )
                      
                      
                        :
                      
                      
                        print
                      
                      
                        (
                      
                      
                        'name:'
                      
                      
                        ,
                      
                      name
                      
                        ,
                      
                      
                        'age:'
                      
                      
                        ,
                      
                      age
                      
                        ,
                      
                      
                        'kw:'
                      
                      
                        ,
                      
                      kw
                      
                        )
                      
                      
                        ;
                      
                      
    
    person
                      
                        (
                      
                      
                        'yy'
                      
                      
                        ,
                      
                      
                        22
                      
                      
                        )
                      
                      
    person
                      
                        (
                      
                      
                        'yy'
                      
                      
                        ,
                      
                      
                        22
                      
                      
                        ,
                      
                      city 
                      
                        =
                      
                      
                        'BJ'
                      
                      
                        ,
                      
                      addr 
                      
                        =
                      
                      
                        'CY'
                      
                      
                        )
                      
                    
                  

    命名关键参数
    和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符*, 后面的参数被视为命名关键字参数。有一种情况,如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符 了。

                    
                      
                        # 命名关键字参数
                      
                      
                        # 和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数
                      
                      
                        def
                      
                      
                        student
                      
                      
                        (
                      
                      name
                      
                        ,
                      
                      age
                      
                        ,
                      
                      
                        *
                      
                      
                        ,
                      
                      city
                      
                        ,
                      
                      grade
                      
                        )
                      
                      
                        :
                      
                      
                        print
                      
                      
                        (
                      
                      
                        'name:%s,age:%d,city:%s,grade:%s'
                      
                      
                        %
                      
                      
                        (
                      
                      name
                      
                        ,
                      
                      age
                      
                        ,
                      
                      city
                      
                        ,
                      
                      grade
                      
                        )
                      
                      
                        )
                      
                      
    
    student
                      
                        (
                      
                      
                        'DH'
                      
                      
                        ,
                      
                      
                        12
                      
                      
                        ,
                      
                      city
                      
                        =
                      
                      
                        "BeiJing"
                      
                      
                        ,
                      
                      grade 
                      
                        =
                      
                      
                        'A'
                      
                      
                        )
                      
                      
                        #==> name:DH,age:12,city:BeiJing,grade:A
                      
                      
    student
                      
                        (
                      
                      
                        'DH'
                      
                      
                        ,
                      
                      
                        12
                      
                      
                        )
                      
                      
                        #==> 提示缺少 'city' and 'grade' 参数     
                      
                      
                        # 如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:
                      
                      
                        def
                      
                      
                        student2
                      
                      
                        (
                      
                      name
                      
                        ,
                      
                      age
                      
                        ,
                      
                      
                        *
                      
                      args
                      
                        ,
                      
                      city
                      
                        ,
                      
                      grade
                      
                        )
                      
                      
                        :
                      
                      
                        print
                      
                      
                        (
                      
                      
                        'name:%s,age:%d,city:%s,grade:%s, args:'
                      
                      
                        %
                      
                      
                        (
                      
                      name
                      
                        ,
                      
                      age
                      
                        ,
                      
                      city
                      
                        ,
                      
                      grade
                      
                        )
                      
                      
                        ,
                      
                      args
                      
                        )
                      
                      
    
    student2
                      
                        (
                      
                      
                        'DH'
                      
                      
                        ,
                      
                      
                        12
                      
                      
                        ,
                      
                      
                        1
                      
                      
                        ,
                      
                      
                        2
                      
                      
                        ,
                      
                      
                        3
                      
                      
                        ,
                      
                      
                        4
                      
                      
                        ,
                      
                      city
                      
                        =
                      
                      
                        "BeiJing"
                      
                      
                        ,
                      
                      grade 
                      
                        =
                      
                      
                        'A'
                      
                      
                        )
                      
                      
                        #==> name:DH,age:12,city:BeiJing,grade:A, args: (1, 2, 3, 4)
                      
                    
                  
  2. 关于函数作为返回值

    我们来看一个函数

                    
                      
                        def
                      
                      
                        count
                      
                      
                        (
                      
                      
                        )
                      
                      
                        :
                      
                      
    	fs 
                      
                        =
                      
                      
                        [
                      
                      
                        ]
                      
                      
                        for
                      
                       i 
                      
                        in
                      
                      
                        range
                      
                      
                        (
                      
                      
                        1
                      
                      
                        ,
                      
                      
                        4
                      
                      
                        )
                      
                      
                        :
                      
                      
                        def
                      
                      
                        f
                      
                      
                        (
                      
                      
                        )
                      
                      
                        :
                      
                      
                        return
                      
                       i 
                      
                        *
                      
                       i
    		fs
                      
                        .
                      
                      append
                      
                        (
                      
                      f
                      
                        )
                      
                      
                        return
                      
                       fs
    
    
                      
                        for
                      
                       f 
                      
                        in
                      
                       count
                      
                        (
                      
                      
                        )
                      
                      
                        :
                      
                      
                        print
                      
                      
                        (
                      
                      f
                      
                        (
                      
                      
                        )
                      
                      
                        )
                      
                      
                        //=
                      
                      
                        =
                      
                      
                        >
                      
                      
                        9
                      
                      
                        9
                      
                      
                        9
                      
                    
                  

    看看这个函数,输出结果跟我们预想的1,4,9不符合。这是因为变量 i 在循环3次之后, i 已经变成3了,因此结果是9,9,9
    注意:返回闭包时牢记一点,返回函数不要引用任何循环变量,或者后续会发生变化的变量
    上个函数我们做个改变

                    
                      
                        def
                      
                      
                        count
                      
                      
                        (
                      
                      
                        )
                      
                      
                        :
                      
                      
                        def
                      
                      
                        f
                      
                      
                        (
                      
                      j
                      
                        )
                      
                      
                        :
                      
                      
                        def
                      
                      
                        g
                      
                      
                        (
                      
                      
                        )
                      
                      
                        :
                      
                      
                        return
                      
                       j 
                      
                        *
                      
                       j
    		
                      
                        return
                      
                       g
    	fs 
                      
                        =
                      
                      
                        [
                      
                      
                        ]
                      
                      
                        for
                      
                       x 
                      
                        in
                      
                      
                        range
                      
                      
                        (
                      
                      
                        1
                      
                      
                        ,
                      
                      
                        4
                      
                      
                        )
                      
                      
                        :
                      
                      
    		fs
                      
                        .
                      
                      append
                      
                        (
                      
                      f
                      
                        (
                      
                      x
                      
                        )
                      
                      
                        )
                      
                      
                        ;
                      
                      
                        return
                      
                       fs
    
                    
                  
  3. 关于Function 和 Method理解

                    
                      
                        class
                      
                      
                        Student
                      
                      
                        (
                      
                      
                        object
                      
                      
                        )
                      
                      
                        :
                      
                      
                        def
                      
                      
                        set_age
                      
                      
                        (
                      
                      self
                      
                        ,
                      
                      age
                      
                        )
                      
                      
                        :
                      
                      
    		self
                      
                        .
                      
                      age 
                      
                        =
                      
                       age
    
    
                      
                        def
                      
                      
                        set_name
                      
                      
                        (
                      
                      self
                      
                        ,
                      
                      name
                      
                        )
                      
                      
                        :
                      
                      
    	self
                      
                        .
                      
                      name 
                      
                        =
                      
                       name
    
    Student
                      
                        .
                      
                      set_name 
                      
                        =
                      
                       set_name
    
                      
                        print
                      
                      
                        (
                      
                      
                        type
                      
                      
                        (
                      
                      Student
                      
                        .
                      
                      set_name
                      
                        )
                      
                      
                        )
                      
                      
                        #==> 
                        
                      
                      
                        print
                      
                      
                        (
                      
                      
                        type
                      
                      
                        (
                      
                      Student
                      
                        .
                      
                      set_age
                      
                        )
                      
                      
                        )
                      
                      
                        #==> 
                        
                      
                      
    
    s 
                      
                        =
                      
                       Student
                      
                        (
                      
                      
                        )
                      
                      
                        print
                      
                      
                        (
                      
                      
                        type
                      
                      
                        (
                      
                      s
                      
                        .
                      
                      set_name
                      
                        )
                      
                      
                        )
                      
                      
                        #==> 
                        
                      
                      
                        print
                      
                      
                        (
                      
                      
                        type
                      
                      
                        (
                      
                      s
                      
                        .
                      
                      set_age
                      
                        )
                      
                      
                        )
                      
                      
                        #==> 
                        
                      
                    
                  

更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请请扫描上面二维码支持博主1元、2元、5元等您想捐的金额吧,狠狠点击下面给点支持吧

发表我的评论
最新评论 总共0条评论