美文网首页
Python 进阶基础一

Python 进阶基础一

作者: 不会忘的名字 | 来源:发表于2019-01-08 19:51 被阅读0次

    1.* 和 ** 的用法

    • 函数定义时接收不定长参数
    def foo(*args, **kwargs):
        pass
    
    • 参数传递
    # 如何在函数中接收元组、列表和字典
    def X(*a, **b):
        print(a)
        print(b)
    
    X(1,2,3,4,5)  # (1, 2, 3, 4, 5),{}
    X(a=1, b=2, c=3) # (), {'a': 1, 'b': 2, 'c': 3}
    X(1,2,a=2,b=3)   # (1, 2), {'a': 2, 'b': 3}
    # 总结:带*的参数输出的是元祖,带**的参数输出的是字典.但是同时使用两者时, 调用时a=2后只能写等式的参数,U不能写数字
    
    • import * 语法
      1.文件 a.py
    # 告诉别的包,import * 的时候,只能导all里面规定的对象.
    __all__ = ['x', 'y']
    
    # 下划线开头的变量不会被import * 导入.可以用from a import _x导入
    _x = 123
    y = 'abc'
    sys = 'efg'
    

    2.文件 b.py

    from a import *
    from a import sys
    from a import _x
    
    
    print(_x, y, sys)  # 123 abc efg
    
    • *的用法
    # 这里的* 表示*后面的参数必须用关键词参数传参.
    def foo(x, y, *, a, b):
        print(x)
        print(y)
        print(a)
        print(b)
    
    
    foo(1, 2, a=3, b=4)  # 1, 2, 3, 4
    
    
    # *类似截取列表效果
    list1 = [1, 2, 3, 4, 5, 6]
    a, b, *_, c = list1
    print(a, b, _, c)  # 1 2 [3, 4, 5] 6
    

    二.Python 的赋值和引用

    • ==, is: == 判断的是值, is 判断的是内存地址 (即对象的id)
    • 小整数对象: [-5, 256]
    a = 3
    b = 3
    print(a is b)  # True
    
    • copy, deepcopy 的区别
      浅拷贝
    from copy import copy
    
    a = [1, 2, 3, 4, ['a', 'b']]
    c = copy(a)
    
    a.append(5)
    a[4].append('c')
    
    print('a:', a, 'c:', c)
    # a: [1, 2, 3, 4, ['a', 'b', 'c'], 5] c: [1, 2, 3, 4, ['a', 'b', 'c']]
    print(a[4] is c[4])  # True
    内层可变参数的地址相同
    

    深拷贝

    from copy import deepcopy
    
    a = [1, 2, 3, 4, ['a', 'b']]  # 原始对象
    
    b = a  # 赋值,传对象的引用
    d = deepcopy(a)  # 对象拷贝,深拷贝
    
    a.append(5)  # 修改对象a
    a[4].append('c')  # 修改对象a中的['a', 'b']数组对象
    
    print('\t\t:a = ', a)
    print('对象引用\t:b = ', b)
    print('deepcopy\t:d = ', d)
    #           :a =  [1, 2, 3, 4, ['a', 'b', 'c'], 5]
    # 对象引用  :b =  [1, 2, 3, 4, ['a', 'b', 'c'], 5]
    # deepcopy  :d =  [1, 2, 3, 4, ['a', 'b']] 
    内层可变参数的地址不相同
    
    def extendList(val, lst=[]):
        lst.append(val)
        return lst
    
    list1 = extendList(10)
    list2 = extendList(123, [])
    list3 = extendList('a')
    print(list1)  # [10, 'a']
    print(list2)  # [123]
    print(list3)  # [10, 'a']
    没有传列表进去, 不会创建新的内存地址:list1与list3地址相同
    
    • 自定义 deepcopy:
    from pickle import dumps, loads
     my_deepcopy = lambda item: loads(dumps(item, 4))
    
    # 习题
    from copy import copy, deepcopy
    from pickle import dumps, loads
    
    a = ['x', 'y', 'z']
    b = [a] * 3 # [['x','y','z'], ['x','y','z'], ['x','y','z']]
    c = copy(b)
    d = deepcopy(b)
    e = loads(dumps(b, 4))
    
    b[1].append(999)
    b.append(777)
    
    c[1].append(999)
    c.append(555)
    
    d[1].append(999)
    d.append(333)
    
    e[1].append(999)
    e.append(111)
    

    相关文章

      网友评论

          本文标题:Python 进阶基础一

          本文链接:https://www.haomeiwen.com/subject/nxbbrqtx.html