python基础语法—day03(笔记)

主要内容:

]

1.列表的复制

什么是可变数据类型和不可变数据类型?
在python中不可变数据类型有数字,字符串和元组;可变数据类型有字典,列表等。
不可变数据类型会改变内存地址,可变数据类型不改变内存地址。
(1)不可变数据类型,num1的内存地址改变了

num1=10
num2=num1
print("num1=0x%x,num2=0x%x"%(id(num1),id(num2)))   #num1=0x7584eaf0,num2=0x7584eaf0
num1=9
print("num1={},num2={}".format(num1,num2))   #num1=9,num2=10
print("num1=0x%x,num2=0x%x"%(id(num1),id(num2)))   #num1=0x7584ead0,num2=0x7584eaf0

(2)可变数据类型,num1_list的内存地址没有改变

num1_list=[12,23,10,89]
print('num1_list=0x%x'%(id(num1_list)))   #num1_list=0x2024f390288
num1_list[0]=1
print(num1_list)   #[1, 23, 10, 89]
print('num1_list=0x%x'%(id(num1_list)))   #num1_list=0x2024f390288

(3)这种写法不是列表的复制,而是赋值,内存空间没有改变。

num1_list=[1,2,3,4]
num2_list=num1_list
print(num2_list)
print('num1_list=0x%x,num2_list=0x%x'%(id(num1_list),id(num2_list)))   #num1_list=0x1d998200288,num2_list=0x1d998200288

(4)copy()方法表示列表的浅复制,另辟一个内存空间

num1_list=[1,2,3,4]
num2_list=num1_list.copy()
print(num2_list)
print('num1_list=0x%x,num2_list=0x%x'%(id(num1_list),id(num2_list)))
# num1_list=0x21cb5130288,num2_list=0x21cb5135288

(5)除了用copy()方法外,我们还可以用python的内置模块进行浅复制(import copy),和copy()方法作用一样

import copy
num1_list=[1,2,3,4]
num2_list=copy.copy(num1_list)
print(num2_list)
print('num1_list=0x%x,num2_list=0x%x'%(id(num1_list),id(num2_list)))

# num1_list=0x249fb6e02c8,num2_list=0x249fb6e5208

(6)切片也相当于列表的浅复制

num1_list=[1,2,3,4]
num2_list=num1_list[::]
print(num2_list)
print('num1_list=0x%x,num2_list=0x%x'%(id(num1_list),id(num2_list)))
# num1_list=0x1e1d7bd02c8,num2_list=0x1e1d7bd5208

(7)浅复制(拷贝)和深复制的区别
浅复制是只复制一层,当有嵌套的时候,值会发生改变

#浅复制
a_list=['asf','ht',[100,200,300],'rgfh']
b_list=a_list.copy()
a_list[0]='123'
print(b_list)    #['asf', 'ht', [100, 200, 300], 'rgfh']
a_list[2][0]=3
print(b_list)   #['asf', 'ht', [3, 200, 300], 'rgfh']

深复制是所有都会复制,无论是否有嵌套,值都不会发生改变,深复制只能使用copy模块(copy.deepcopy)

import copy
a_list=['asf','ht',[100,200,300],'rgfh']
b_list=copy.deepcopy(a_list)
a_list[0]='123'
print(b_list)    #['asf', 'ht', [100, 200, 300], 'rgfh']
a_list[2][0]=3
print(b_list)    #['asf', 'ht', [100, 200, 300], 'rgfh']

分析数据变化的网址
在这里插入图片描述在这里插入图片描述

2.列表推导式的使用

什么是列表推导式?
列表推导式可以使用非常简洁的方式对列表或其他可迭代对象的元素进行遍历和过滤,快速生成满足特定需求的列表,代码具有非常强的可读性,是Python程序开发时应用最多的技术之一。Python的内部实现对列表推导式做了大量优化,可以保证很快的运行速度,也是推荐使用的一种技术。列表推导式的语法形式为:[表达式 for 变量 in 序列或迭代对象 if 条件表达式]

a_list=[i for i in range(10)]
print(a_list)   #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
'''
相当于:
a_list=[]
for i in range(10):
    a_list.append(i)
print(a_list)
'''
a_list=[i for i in range(10) if i%2==0]
print(a_list)   #[0, 2, 4, 6, 8]
b_list=[i for i in range(10) if i%2]
print(b_list)   #[1, 3, 5, 7, 9]
c_list=[(i,j) for i in range(1,3) for j in range(4,6)]
print(c_list)   #[(1, 4), (1, 5), (2, 4), (2, 5)]

练习:请用列表推导式将列表里面的元素,比如[1,2,3,……100]变成[[1,2,3],[4,5,6],……[100]]

a_list=[i for i in range(1,101)]
b_list=[a_list[j:j+3] for j in range(0,100,3)]
print(b_list)
#[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15], [16, 17, 18],……

3.字典使用的注意事项

(1)字典的key不允许重复,如果重复,最后一个将会覆盖前一个;
(2)字典是无序的,不能用下标来获取数据,可以用key来获取value值,如果key不存在会报错,也可以用get()方法来获取值,如果不存在会返回None
(3)修改value时,如果key存在,value值会被修改,如果key不存在,会往字典里新增一个value
(4)字典中的key必须是不可变数据类型(比如字符串,数字,元组,一般习惯是字符串),value可以是任意数据类型。

a_dict={
    "name":'李四',
    "age":20,
    "course":'python',
    "scores":87.5,
    "ispass":True,
    4:"asd",
    (12,234):1390
}
print(a_dict)
# {'name': '李四', 'age': 20, 'course': 'python', 'scores': 87.5, 'ispass': True, 4: 'asd', (12, 234): 1390}

4.字典中update()方法的使用

update() 函数把字典dict2的键/值对更新到dict里

a_dict={'name':'张三','age':21}
b_dict={'course':'python','score':80.5}
a_dict.update(b_dict)
print(a_dict)
#{'name': '张三', 'age': 21, 'course': 'python', 'score': 80.5}

另外,字符串、列表和元组都可以使用"+"进行合并,但字典不支持加法运算,只能用update()方法

5.字典的几种遍历方式

(1)第一种方式,用for……in……获取key值

a_dict={'name': '张三', 'age': 21, 'course': 'python', 'score': 80.5}
for i in a_dict:  #只获取key
    print(i,'=',a_dict[i],sep='')   #sep=''表示去掉空格

(2)第二种方式,用a_dict.keys()方法获取key,和第一种方法是一样的

a_dict={'name': '张三', 'age': 21, 'course': 'python', 'score': 80.5}
for i in a_dict.keys():  #只获取key
    print(i,'=',a_dict[i],sep='') 

(3)第三种方式,用a_dict.values()来获取value值,这种方法很少使用,因为它只能获取value值

a_dict={'name': '张三', 'age': 21, 'course': 'python', 'score': 80.5}
for i in a_dict.values():  #只获取value
    print(i)

(4)第四种方式,使用a_dict.items()来获取key和value

print(a_dict.items())   #dict_items([('name', '张三'), ('age', 21), ('course', 'python'), ('score', 80.5)])
for i in a_dict.items():  
    print(i[0],'=',i[1])

(5)第五种方式,这种方式比较简单

a_dict={'name': '张三', 'age': 21, 'course': 'python', 'score': 80.5}
print(a_dict.items())   #dict_items([('name', '张三'), ('age', 21), ('course', 'python'), ('score', 80.5)])
for i,j in a_dict.items(): 
    print(i,'=',j)

6.集合的基本使用

(1)集合的表示形式是set(),集合是不重复的无序的数据类型

a=set()   #创建一个空集合
print(type(a))   #<class 'set'>
b={'234','sf','234','qwre','45y','dv','234','sf'}
print(b)   #{'dv', 'sf', '234', 'qwre', '45y'},它是无序的,返回的顺序是随机的

(2)add()表示增加一个元素

b={'234','qwre','45y','dv','234','sf'}
b.add('mmm')
print(b)   #{'dv', 'mmm', '45y', 'sf', 'qwre', '234'}

(3)pop(),remove(),clear()都表示删除元素

b={'234','qwre','45y','dv','234','sf'}
b.remove('234')
print(b)   #{'45y', 'dv', 'sf', 'qwre'},删除指定元素
b.pop()
print(b)  #{'sf', '45y', 'qwre'},删除元素是随机的
b.clear()
print(b)   #set(),清空集合

(4)集合中union()和update方法的区别:
union()方法表示将多个集合生成一个新的集合;
update()方法表示将一个迭代对象拼接到这个集合中,迭代对象可以是集合、元组、列表等

b={'qwre','45y','dv','sf'}
b.update(['asd','b'])
print(b)  #{'asd', 'qwre', 'b', 'sf', '45y', 'dv'}
c=b.union({12,234,45})
print(c)  #{'asd', 'qwre', 'b', 234, 'sf', 12, 45, '45y', 'dv'}

7.集合中运算符的使用

集合可以支持多种运算符,但不支持”+“
(1)“-”运算符,表示求两个集合的差集

a={1,2,5,3,4,7,8}
b={1,3,2,0,9,6}
print(a-b)   #{8, 4, 5, 7}
print(b-a)   #{0, 9, 6}

(2)“&”运算符,表示两个集合的交集

a={1,2,5,3,4,7,8}
b={1,3,2,0,9,6}
print(a&b)   #{1, 2, 3}

(3)“|”表示两个集合的并集

a={1,2,5,3,4,7,8}
b={1,3,2,0,9,6}
print(a|b)   #{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

(4)“^”表示两个集合差集的并集,也就是不相交的两个集合的合并

a={1,2,5,3,4,7,8}
b={1,3,2,0,9,6}
print(a^b)   #{0, 4, 5, 6, 7, 8, 9}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值