从零开始的python之路-Python基础(三)

一、字典

帮助用户去表示一个事物的信息(有多个属性的事物)

基本格式:

dict{"key":value}

1、独有功能

 

dict.keys   #获取字典中所有的键

dict.values    #获取字典中所有的值

dict.items    #获取字典中所有的键值对

dict.get    #根据键获取字典中的值,若不存在,则返回None

dict.pop    #根据键删除字典中的值,且可以获取到相应的值。

dict.update    #更新一个字典,若想更新的键不存在,则添加。若存在,则更新。

  

2、公共功能

len    #获取长度
索引    #根据键获取值,注意不是获取位置,而是键。
for循环
修改    #字典中存在则修改,没有则增加。
删除    #del

3、判断一个值是否在字典中

运用 if.... in.....: 进行判断时,判断的是键,而不是值。

判断值的方法:

li={'k1':'v1','k2':'v2','k3':'v3'}
方式1:循环判断
flag="不存在"
for i in li.values() :
    if "v1" in i :
        flag = "存在"
print(flag)

方式二:转换为列表,在判断。
    if "v1" in list(li.values()) :
        print("存在")

二、集合

集合与列表相似,但是集合是无序且不可重复的。

1、基本格式:

set={1,2}

2、空集合的表达

空集合:set()
补充:对于任意一种数据类型,都可以用数据类型+()来表示空
例如:
str() 等价于 ""

list() 等价于 []

int() 等价于 0

3、集合独有功能

1、set.add() :#向集合中添加值。
2、set.discard() : #向集合中删除一个值
3、set.update()  :  #把对应列表更新,把一个列表或集合中所有的值加到对应列表中。
4、set.intersection()  :  #一个列表与另一列表的交集
5、set.union()  :  #一个列表与另一列表的并集。
6、set.difference(set1)  : #一个列表与另一列表的差集,获取set中有,而set1中没有的。
7、set.symmetric_difference()  :  #相互取差集

4、集合公共功能

1、len
    #求长度
2、for循环

5、嵌套问题

列表/字典/集合不能放在集合中,同时也不能作为字典的键
hash:内部会将值进行哈希算法并得到一个数值(对应内存地址),以后用于快速查找。

三、内存

可以使用 id() 来查看内存地址。

1、当创建不同的变量时,它们所在的内存地址是不一样的,即使它们的值是相同的。例如:

v1="wwf"
v2="wwf"

v1=123
v2=123

#以上的变量的内存地址是不同的。可以通过下面的方式使它们内存相同。

v1=123
v2=v1


#在python中,有特殊例子,会使创建不同的变量时任使它们内存相同,因为python有一定的记录机制:
    1. 整型:  -5 ~ 256 
    2. 字符串:"wwf" * 3  - 重新开辟内存。

 

2、对于列表/字典/集合来说,当你在内部对其进行修改时,不会改变其内存地址。而当你对其进行重新赋值时,则会改变其内存地址,例如:

v1 = [11,22,33]
v2 = v1 
v1.append(44)
print(v2) # 含 44

v1 = [11,22,33]
v2 = v1 
v1 = [1,2,3,4]
print(v2)  #v2=[11,22,33],而不是[1,2,3,4]

补充:== 与 is的区别:

== 用于比较值是否相等,而is用于比较内存地址是否相等。

 四、深浅拷贝

拷贝:复制拷贝的内容,并重新开辟内存进行存储,即内存地址发生改变。

1、深浅拷贝基本格式:

首先:import copy
浅拷贝:copy.copy()
深拷贝:copy.deepcopy()

2、对于不可变类型(字符串/整形/元组)

深浅拷贝并无区别,都是对其进行复制,并重新开辟内存进行存储。

对于元组。有特殊情况。
v1 = (1,2,3,[1,2,3],4)
import copy
v2 = copy.copy(v1)
print(id(v1),id(v2))
v3 = copy.deepcopy(v1)
print(id(v1),id(v3))

在上面代码中,当元组中含有可变类型时,浅拷贝时地址不发生改变,可以理解为不拷贝。
而深拷贝时,地址发生改变,即发生拷贝。

  

3、对于不可变类型(列表/字典/集合)

浅拷贝:只拷贝第一层。把会拷贝的内容重新开辟内存进行存储。

深拷贝:拷贝包括嵌套中的所有可变类型。把会拷贝的内容重新开辟内存进行存储。

例子:
1import copy
v1 = '123'
v2 = copy.copy(v1)
print(id(v1),id(v2)) #在这里,按常理来说v1与v2的地址不同,但由于小数据池的原因,地址会相同。

2、import copy
v1 = [1,2,3,4,[11,22,33]]
v2 = copy.copy(v1)
print(id(v1),id(v2))
print(id(v1[4]),id(v2[4])) #由于浅拷贝,只会拷贝第一层,所以第一次地址不同,而第二次由于不会拷贝,所以地址相同。

v2 = copy.deepcopy(v1)
print(id(v1),id(v2))
print(id(v1[4]),id(v2[4])) #而对深拷贝而言,会把所有嵌套都拷贝,所以两次地址都会不同。

五、文件操作

1、文件操作基本格式

变量名=open(文件名,mode="",encoding="")
变量名.close() #要记得关闭,相当于保存到文件中。

2、文件打开方式

1、打开方式:r
只能读,不能写,如果文件不存在则会报错。
读取方式:file_object.read()

2、打开方式: w
只能写入,不能读取,且每次打开时都会清空文件。如果文件不存在,则会创建。
写入方式:file_object.write()

3、打开方式:a
只能追加,不能读取。如果文件不存在,则会创建.
追加方式:file_object.write()

4、打开方式:r+
可以读可以写,写入时根据光标的位置,从当前光标位置开始进行写入操作(可能会将其他的文字覆盖)。可以通过file_object.seek()来调整光标位置。注意:光标调整根据字节调整,例如一个中文在utf-8中是3字节。r+中光标默认在最后,因为读取时从第一读取到最后时,光标在最后。

5、打开方式:w+
可以读可以写。写入时会把文件清空,读取时会从当前光标开始读取。

6、打开方式:a+
可以读可以写。通过光标调整读取位置,但写入时总会在最后加

3、文件读写-功能

1、从当前光标所在的位置向后读取文件规定数量的字符
data = file_object.read()

2、读取文件的所有内容到内存,并按照每一行进行分割到列表中。(如果文件较大,会占用较多内存)
data_list = file_object.readlines()
print(data_list)

3、如果以后读取一个特别大的文件,可以:
for line in file_object:
     line = line.strip()
     print(line)

 

  

posted @ 2020-10-25 23:40  灰色躯壳  阅读(76)  评论(0)    收藏  举报