Python基础03
一、总结
1、基本数据类型之间的特点比较
- 列表list:有序的,可修改,允许重复的。
- 元组tuple:有序,本身不可修改(元素如果是可变类型,内部可以修改),允许重复。
- 字典dict:无序,可修改,key唯一,value允许重复。
- 集合set:无序,不允许重复,本身可修改(元素不能是列表,字典等可变类型)
2、数据类型的创建及补充
- int
# 创建方法
n = 122
n1 = int('122')
print(type(n)) #class int
#查看变量指向内存地址 id()
print(id(n)) #1542308704 id地址
- str
#创建方法
S1 = str() #空字符
S2 = ‘fei'
s3 = str(5)
#不可变
print(s2[1])
s2[1] = 's' #错误
#字节bytes和字符str的相互转换
name = "李品勇“
#字符转换为字节
b1 = bytes(name, encoding='utf-8')
#字符串的转义
print('after\noon') #\n 换行符 after
oon
#消除\的转义
print('after\\oon') #after\oon
print(r'after\oon') #after\oon
#*
print("="*30) #============================
#字符串的格式化% format{} (python特有的)
“%d-%d-%d" %()
"{}-{}-{}".format()
%s 字符串 %d 十进制的数字
year = 2019
month = 3
day = 2
#格式化日期
print(‘%d-%d-%d' %(year, month, day)) #2019-3-2
print(‘%04d-%02d-%02d' %(year, month, day)) #2019-03-02
print('%d % 10) #10 10进制
print('%o % 10) #12 八进制
print('%x % 10) #a 十六进制
print('%e % 3.14159256) #3.141593e+00 #浮点
print('%.2e % 3.14159256) #3.14e+00
#format
#必须一一对应,否则会报错、
s = "name %s, age %d, %s" % ("原擎", 18, "QAQ")
#name 原擎, age 18, QAQ
#无需一一对应 (python 自带)
s = "name {}, age {}, {}" .format("原擎", 18, "QAQ")
#name 原擎, age 18, QAQ
s = "name {0}, age {1}, {0}" .format("原擎", 18)
#name 原擎, age 18, 原擎 用到2个相同的数值
L = ["原擎", 18]
s = "name {0}, age {1}, {0}" .format(*L)
#name 原擎, age 18, 原擎 拿到的是list 直接放进去
s = "name {name}, age {age}, {name}" .format(age=18, name="原擎")
print(s)
#name 原擎, age 18, 原擎 不按照顺序排列 可以无序
s = "money{:f}元“.format(4.5) #money4.5元 这样必须传浮点数
# *代表列表 **代表字典
s = "name {name}, age {age}, {name}" .format(age=18, name="原擎")
d = {“age”=18, “name”="原擎"}
s = "name {name}, age {age}, {name}" .format(**d)
# name 原擎, age 18, 原擎 **必须是字典
s = "num : {0:b},{0:o},{0:d},{0:x},{0:X},{0:e},{0:%}".format(10)
print(s)
#1010,12,10,a,A,1.000000e+01,1000.000000%
- list
#创建方法
s = [1, 2, 3, 4]
s1 = list()
s2 = list({1, 2, 3, 4})
#转换
name = '韩文为’
s3 = list(name) #['韩‘, ’文‘, ’为‘]
- tuple
#创建方法
s = (1,2)
s1 = tupel()
s2 = tupel(S)
#嵌套
s = (11, 22, ['fei'. {'k1':'v1'}]) 如果要取'v1'
print(s[2][1]['k1']) #v1
#如果要增加'k2': 'v2'
s[2][1]['k2'] = 'v2'
s[2][1].update({'k3':'v3'})
- dict
#创建方法
s = {'k1': 123} #{'k1': 123}
s1 = dict(k1=456, k2=789) #{'k1=456', 'k2=789'}
#fromkeys()map()
s = [1, 2, 3,] 把列表变成字典
s1 = {}
print(s1.fromkeys(s)) #{1: None, 2: None, 3: None}
print(s1.fromkeys(s: 'v')) #{1: 'v', 2: 'v', 3: 'v'}
- set
#创建方法
s = {11, 22, 33}
s = set()
3、深浅复制
字符串 和数字 : 赋值、深浅拷贝无意义,应为它永远指向同一地址 不可改变。
- 赋值:只是创建一个变量,该变量指向原来的内存地址
n2 = n1 两个都指向一个地址id
n1 = {"k1": "fei", "k2": 123, "k3": ["fly", 18]}
n2 = n1 # 指向同一个ID
n1["k1"] = "yuan" # n1里面数据发生变化 n2也会改变 不管第几层
print(n1) #{'k1': 'yuan', 'k2': 123, 'k3': ['fly', 18]}
print(n2) #{'k1': 'yuan', 'k2': 123, 'k3': ['fly', 18]}
- 浅拷贝:在内存里只额外创建了一层数据 第二层数据公用一个地址。
n1 = {"k1": "fei", "k2": 123, "k3": ["fly", 18]}
n3 = copy.copy(n1)
n1["k1"] = "yua" #n1第一层改了 n3是不会变的
print(n1) #{'k1': 'yuan', 'k2': 123, 'k3': ['fly', 18]}
print(n3) # {'k1': 'fei', 'k2': 123, 'k3': ['fly', 18]}
n1["k3"][0] = "yuan" # n1第二层改了 n3是会变的
print(n1) # {'k1': 'yuan', 'k2': 123, 'k3': ['yuan', 18]}
print(n3) # {'k1': 'yuan', 'k2': 123, 'k3': ['yuan', 18]}
- 深拷贝 :在内存里创建了一个新的地址 怎么改n1 n3都不变
n1 = {"k1": "fei", "k2": 123, "k3": ["fly", 18]}
n3 = copy.deepcopy(n1)
n1["k1"] = "yua" # 第一层数据改变 n3不会变
print(n1) #{'k1': 'yua', 'k2': 123, 'k3': ['fly', 18]}
print(n3) #{'k1': 'fei', 'k2': 123, 'k3': ['fly', 18]}
n1["k3"][0] = "1"
print(n1) # 第二层数据改变 n3不会变
print(n3)