美文网首页
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